@moretea-labs/forge 1.6.0 → 1.7.0

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 (396) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +26 -0
  3. package/CLAUDE.md +2 -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/03-orchestration.partial.md +1 -1
  17. package/assets/plugin-registry.v1.json +1 -1
  18. package/assets/reference-configs/document-generation.md +1 -1
  19. package/assets/reference-configs/harness-overview.md +1 -1
  20. package/assets/reference-configs/sprint-contracts.md +3 -3
  21. package/assets/skill-version.json +2 -2
  22. package/assets/templates/contract.template.md +2 -7
  23. package/assets/templates/helpers/capture-plan.sh +2 -2
  24. package/assets/templates/helpers/check-task-workflow.sh +4 -4
  25. package/assets/templates/helpers/contract-worktree.sh +1 -21
  26. package/assets/templates/helpers/ensure-task-workflow.sh +11 -36
  27. package/assets/templates/helpers/migrate-project-template.sh +22 -45
  28. package/assets/templates/helpers/new-plan.sh +1 -1
  29. package/assets/templates/helpers/plan-to-todo.sh +12 -37
  30. package/assets/templates/helpers/ship-worktrees.sh +2 -29
  31. package/assets/templates/helpers/verify-contract.sh +1 -111
  32. package/assets/templates/helpers/verify-sprint.sh +3 -180
  33. package/assets/templates/plan.template.md +1 -1
  34. package/assets/templates/review.template.md +9 -34
  35. package/assets/workflow-contract.v1.json +10 -19
  36. package/docs/README.md +10 -10
  37. package/docs/architecture/CURRENT.md +170 -0
  38. package/docs/architecture/EVOLUTION.md +42 -0
  39. package/docs/architecture/current/README.md +4 -156
  40. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
  41. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
  42. package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
  43. package/docs/architecture/history/README.md +7 -0
  44. package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
  45. package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
  46. package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
  47. package/docs/architecture/history.md +3 -34
  48. package/docs/architecture/index.md +15 -98
  49. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  50. package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
  51. package/docs/architecture/versions/1.6.md +38 -0
  52. package/docs/architecture/versions/1.7.md +41 -0
  53. package/docs/forge-chatgpt-browser-engine.md +2 -2
  54. package/docs/forge-chatgpt-mcp-setup.md +4 -28
  55. package/docs/forge-chatgpt-supervised-automation.md +3 -3
  56. package/docs/forge-github-issue-launcher.md +1 -1
  57. package/docs/forge-runtime-self-healing-loop.md +1 -1
  58. package/docs/operations/controller-browser-plugin.md +26 -6
  59. package/docs/operations/controller-performance-and-502.md +124 -0
  60. package/docs/operations/controller-reliability-runbook.md +1 -1
  61. package/docs/operations/features.md +2 -2
  62. package/docs/operations/github-repository.md +1 -1
  63. package/docs/operations/homebrew.md +2 -2
  64. package/docs/operations/mcp-tool-exposure.md +5 -3
  65. package/docs/wiki/Architecture.md +6 -6
  66. package/docs/wiki/Implementation.md +2 -2
  67. package/docs/wiki/Integrations.md +2 -2
  68. package/docs/wiki/Work-Lifecycle.md +1 -1
  69. package/package.json +29 -10
  70. package/scripts/activate-source-baseline.ts +17 -13
  71. package/scripts/benchmark-background-check-overlap.ts +228 -0
  72. package/scripts/benchmark-mcp-host.sh +117 -0
  73. package/scripts/benchmark-mcp-transport.ts +170 -0
  74. package/scripts/benchmark-quality-harness.ts +146 -0
  75. package/scripts/benchmark-route-session-concurrency.ts +207 -6
  76. package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
  77. package/scripts/benchmark-typescript-navigation.ts +186 -0
  78. package/scripts/benchmark-work-efficiency.ts +334 -0
  79. package/scripts/capture-plan.sh +3 -3
  80. package/scripts/check-agent-tooling.sh +8 -35
  81. package/scripts/check-architecture-sync.sh +17 -86
  82. package/scripts/check-mcp-compatibility.ts +14 -0
  83. package/scripts/check-runtime-architecture.mjs +107 -64
  84. package/scripts/check-stable-baseline.ts +92 -0
  85. package/scripts/check-task-workflow.sh +4 -4
  86. package/scripts/contract-worktree.sh +1 -21
  87. package/scripts/ensure-task-workflow.sh +22 -55
  88. package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
  89. package/scripts/install-standalone-recovery.ts +24 -0
  90. package/scripts/lib/project-init-lib.sh +15 -44
  91. package/scripts/migrate-project-template.sh +23 -1179
  92. package/scripts/new-plan.sh +1 -1
  93. package/scripts/plan-to-todo.sh +11 -36
  94. package/scripts/run-governed-gate.ts +2 -1
  95. package/scripts/ship-worktrees.sh +2 -29
  96. package/scripts/smoke-ios-physical-device.ts +4 -2
  97. package/scripts/smoke-runtime-recovery.ts +1 -35
  98. package/scripts/smoke-schedule-engine.ts +1 -20
  99. package/scripts/verify-contract.sh +1 -111
  100. package/scripts/verify-forge-runtime.sh +0 -1
  101. package/scripts/verify-sprint.sh +3 -180
  102. package/scripts/workflow-contract.ts +1 -5
  103. package/src/cli/commands/init-hook.ts +3 -3
  104. package/src/cli/commands/mcp.ts +9 -5
  105. package/src/cli/commands/plugin.ts +1 -1
  106. package/src/cli/commands/recovery.ts +25 -3
  107. package/src/cli/commands/runtime.ts +55 -3
  108. package/src/cli/commands/security.ts +12 -1
  109. package/src/cli/commands/setup-profile.ts +31 -21
  110. package/src/cli/controller/check-runner.ts +106 -3
  111. package/src/cli/controller/composite-result.ts +1 -1
  112. package/src/cli/controller/context/focus.ts +51 -0
  113. package/src/cli/controller/context/instruction-context.ts +114 -0
  114. package/src/cli/controller/context/known-paths.ts +76 -0
  115. package/src/cli/controller/context/query-planning.ts +110 -0
  116. package/src/cli/controller/context/rule-resolution.ts +532 -0
  117. package/src/cli/controller/context/source-materializer.ts +278 -0
  118. package/src/cli/controller/context/structural.ts +16 -0
  119. package/src/cli/controller/context/types.ts +286 -0
  120. package/src/cli/controller/context-pack.ts +785 -469
  121. package/src/cli/controller/launch-agents.ts +77 -2
  122. package/src/cli/controller/operational-plan.ts +2 -2
  123. package/src/cli/controller/work-mode.ts +6 -4
  124. package/src/cli/editing/edit-session.ts +60 -7
  125. package/src/cli/github/github.ts +133 -0
  126. package/src/cli/installer/managed-entries.ts +15 -1
  127. package/src/cli/local-bridge/console-automations.ts +54 -78
  128. package/src/cli/local-bridge/console-view-models.ts +1 -35
  129. package/src/cli/local-bridge/facade-api.ts +0 -217
  130. package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
  131. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +23 -13
  132. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
  133. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +6 -4
  134. package/src/cli/local-bridge/frontend/src/lib/api.ts +1 -6
  135. package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
  136. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +2 -2
  137. package/src/cli/local-bridge/frontend/src/styles.css +1 -1
  138. package/src/cli/local-bridge/frontend/src/types.ts +5 -8
  139. package/src/cli/local-bridge/job-store.ts +1 -490
  140. package/src/cli/local-bridge/server.ts +0 -513
  141. package/src/cli/local-bridge/ui-dist/app.css +1 -1
  142. package/src/cli/local-bridge/ui-dist/app.js +3703 -3757
  143. package/src/cli/mcp/auth.ts +5 -5
  144. package/src/cli/mcp/instructions.ts +3 -2
  145. package/src/cli/mcp/legacy-tool-service.ts +0 -189
  146. package/src/cli/mcp/multi-repository.ts +16 -5
  147. package/src/cli/mcp/oauth.ts +175 -26
  148. package/src/cli/mcp/repository-tools.ts +247 -107
  149. package/src/cli/mcp/server.ts +537 -111
  150. package/src/cli/mcp/tool-capability-cache.ts +1 -1
  151. package/src/cli/mcp/toolset-selection.ts +1 -1
  152. package/src/cli/mcp/toolset.ts +42 -5
  153. package/src/cli/mcp/transports/http.ts +101 -14
  154. package/src/cli/mcp/transports/session-registry.ts +43 -5
  155. package/src/cli/mcp/types.ts +3 -3
  156. package/src/cli/repositories/command-classifier.ts +101 -19
  157. package/src/cli/repositories/command-executor.ts +55 -521
  158. package/src/cli/repositories/command-process.ts +108 -0
  159. package/src/cli/repositories/command-scope.ts +99 -41
  160. package/src/cli/repositories/controller-home.ts +7 -8
  161. package/src/cli/repositories/git-command-executor.ts +2 -0
  162. package/src/cli/repositories/locks.ts +53 -16
  163. package/src/cli/repositories/repository-snapshot.ts +121 -0
  164. package/src/cli/repositories/selected-path-actions.ts +17 -9
  165. package/src/cli/repositories/structured-git.ts +61 -3
  166. package/src/cli/repository/inspector.ts +553 -63
  167. package/src/cli/repository/session-cache.ts +58 -17
  168. package/src/cli/v81-entry.ts +1 -4
  169. package/src/effects/fs-transaction.ts +85 -17
  170. package/src/runtime/context/codegraph-read-provider.ts +233 -2
  171. package/src/runtime/context/codegraph-sidecar.cjs +74 -40
  172. package/src/runtime/context/generic-lsp-provider.ts +355 -0
  173. package/src/runtime/context/lsp-client.ts +283 -0
  174. package/src/runtime/context/semantic-navigation.ts +275 -0
  175. package/src/runtime/context/swift-navigation.ts +565 -0
  176. package/src/runtime/context/typescript-navigation.ts +226 -0
  177. package/src/runtime/control-plane/dispatch-priority.ts +28 -0
  178. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +47 -8
  179. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
  180. package/src/runtime/control-plane/execution/session-store.ts +18 -0
  181. package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
  182. package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
  183. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
  184. package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
  185. package/src/runtime/control-plane/execution/work-task-receipt.ts +54 -11
  186. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +143 -8
  187. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +22 -14
  188. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +85 -8
  189. package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
  190. package/src/runtime/control-plane/facade/controller-round-relay.ts +991 -0
  191. package/src/runtime/control-plane/facade/controller-session-store.ts +132 -1
  192. package/src/runtime/control-plane/facade/goal-workloop-access.ts +2 -0
  193. package/src/runtime/control-plane/facade/goal-workloop.ts +686 -129
  194. package/src/runtime/control-plane/facade/index.ts +1 -0
  195. package/src/runtime/control-plane/facade/plan-contract-store.ts +185 -20
  196. package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
  197. package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
  198. package/src/runtime/control-plane/facade/types.ts +22 -5
  199. package/src/runtime/control-plane/facade/work-contract-store.ts +175 -73
  200. package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
  201. package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
  202. package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
  203. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
  204. package/src/runtime/control-plane/global-scheduler/maintenance.ts +145 -0
  205. package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
  206. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
  207. package/src/runtime/control-plane/global-scheduler/scheduler.ts +273 -542
  208. package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
  209. package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
  210. package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
  211. package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
  212. package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
  213. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
  214. package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
  215. package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
  216. package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
  217. package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
  218. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +50 -0
  219. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +355 -116
  220. package/src/runtime/control-plane/launcher/launch-reservation-store.ts +40 -0
  221. package/src/runtime/control-plane/launcher/thin-launcher.ts +194 -10
  222. package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
  223. package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
  224. package/src/runtime/control-plane/release-retention.ts +62 -2
  225. package/src/runtime/control-plane/routing/route-policy.ts +7 -16
  226. package/src/runtime/control-plane/runtime-status-client.ts +0 -2
  227. package/src/runtime/diagnostics/mcp-timing.ts +13 -0
  228. package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
  229. package/src/runtime/diagnostics/performance.ts +24 -1
  230. package/src/runtime/evidence/event-ledger.ts +1 -1
  231. package/src/runtime/execution/jobs/store.ts +58 -4
  232. package/src/runtime/execution/jobs/types.ts +1 -1
  233. package/src/runtime/execution/managed-workspace.ts +203 -1
  234. package/src/runtime/execution/process-runtime/check-facade.ts +51 -4
  235. package/src/runtime/execution/process-runtime/check-result.ts +53 -0
  236. package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
  237. package/src/runtime/execution/process-runtime/command-facade.ts +345 -40
  238. package/src/runtime/execution/process-runtime/gc.ts +38 -6
  239. package/src/runtime/execution/process-runtime/lightweight-managed.ts +1184 -0
  240. package/src/runtime/execution/process-runtime/persisted-check.ts +47 -4
  241. package/src/runtime/execution/process-runtime/resource-claims.ts +10 -6
  242. package/src/runtime/execution/process-runtime/runtime.ts +43 -3
  243. package/src/runtime/execution/process-runtime/store.ts +1 -0
  244. package/src/runtime/execution/process-runtime/types.ts +2 -0
  245. package/src/runtime/execution/thin-harness/async-process.ts +12 -2
  246. package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
  247. package/src/runtime/execution/workers/executor.ts +0 -48
  248. package/src/runtime/gateway/mcp/execution-tools.ts +1192 -114
  249. package/src/runtime/gateway/mcp/process-tools.ts +83 -37
  250. package/src/runtime/gateway/mcp/router.ts +184 -82
  251. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +546 -0
  252. package/src/runtime/gateway/mcp/runtime-tools.ts +2224 -1589
  253. package/src/runtime/plugins/app-store-connect-adapter.ts +123 -19
  254. package/src/runtime/plugins/browser-adapter.ts +2901 -241
  255. package/src/runtime/plugins/browser-automation-service.ts +10 -0
  256. package/src/runtime/plugins/browser-handoff.ts +92 -2
  257. package/src/runtime/plugins/browser-macos-bridge.ts +582 -49
  258. package/src/runtime/plugins/browser-node-bridge.ts +6 -34
  259. package/src/runtime/plugins/browser-provider-registry.ts +109 -0
  260. package/src/runtime/plugins/browser-runtime-contract.ts +152 -0
  261. package/src/runtime/plugins/browser-runtime.ts +183 -0
  262. package/src/runtime/plugins/browser-session-authority.ts +332 -0
  263. package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
  264. package/src/runtime/plugins/desktop-operator-registration.ts +8 -2
  265. package/src/runtime/plugins/external-adapter.ts +324 -3
  266. package/src/runtime/plugins/external-unix-socket.ts +7 -1
  267. package/src/runtime/plugins/first-party-registry.ts +2 -0
  268. package/src/runtime/plugins/github-adapter.ts +125 -0
  269. package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
  270. package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
  271. package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
  272. package/src/runtime/plugins/ios-adapter.ts +106 -16
  273. package/src/runtime/plugins/ios-agent-device.ts +234 -64
  274. package/src/runtime/plugins/ios-physical-device.ts +1143 -392
  275. package/src/runtime/plugins/lightweight-action.ts +153 -0
  276. package/src/runtime/plugins/local-system-adapter.ts +123 -6
  277. package/src/runtime/plugins/macos-capability-broker.ts +55 -9
  278. package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
  279. package/src/runtime/plugins/plugin-management-adapter.ts +49 -8
  280. package/src/runtime/plugins/resend-adapter.ts +1 -1
  281. package/src/runtime/plugins/store.ts +269 -29
  282. package/src/runtime/plugins/types.ts +35 -2
  283. package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
  284. package/src/runtime/projections/git-status-sampler.ts +16 -16
  285. package/src/runtime/projections/materialized-view.ts +28 -10
  286. package/src/runtime/recovery/maintenance-executor.ts +393 -28
  287. package/src/runtime/root/mcp-transport.ts +180 -10
  288. package/src/runtime/root/package-connector-service.ts +186 -8
  289. package/src/runtime/root/package-runtime-release.ts +143 -17
  290. package/src/runtime/root/package-runtime-service.ts +430 -22
  291. package/src/runtime/root/release-manifest.ts +7 -2
  292. package/src/runtime/root/release-materialize.ts +19 -0
  293. package/src/runtime/root/release-store.ts +48 -11
  294. package/src/runtime/root/runtime.ts +23 -5
  295. package/src/runtime/root/service.ts +100 -29
  296. package/src/runtime/root/types.ts +2 -0
  297. package/src/runtime/safe-tooling/ios-development.ts +321 -63
  298. package/src/runtime/shared/trusted-executable.ts +62 -0
  299. package/src/runtime/shared/trusted-node-executable.ts +48 -0
  300. package/src/runtime/standalone-recovery/core.ts +700 -92
  301. package/src/runtime/standalone-recovery/entry.ts +99 -23
  302. package/src/runtime/standalone-recovery/installer.ts +19 -3
  303. package/src/runtime/standalone-recovery/service-labels.ts +2 -0
  304. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
  305. package/src/runtime/workflow/schedules/browser-probe.ts +81 -3
  306. package/src/runtime/workflow/schedules/engine.ts +287 -151
  307. package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
  308. package/src/runtime/workflow/schedules/settlement.ts +48 -4
  309. package/src/runtime/workflow/schedules/store.ts +131 -10
  310. package/src/runtime/workflow/schedules/types.ts +2 -4
  311. package/src/runtime/workflow/schedules/work-continuation.ts +26 -13
  312. package/src/testing/test-governance.ts +8 -40
  313. package/assets/reference-configs/heartbeat-triage.md +0 -57
  314. package/assets/templates/helpers/harness-trace-grade.sh +0 -150
  315. package/assets/templates/helpers/heartbeat-triage.sh +0 -361
  316. package/assets/templates/helpers/maintenance-triage.sh +0 -167
  317. package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
  318. package/docs/architecture/current/architecture-invariants.md +0 -331
  319. package/docs/architecture/current/automation-and-schedule-engine.md +0 -459
  320. package/docs/architecture/current/codegraph-context-provider.md +0 -238
  321. package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
  322. package/docs/architecture/current/controller-repository-decoupling.md +0 -148
  323. package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -373
  324. package/docs/architecture/current/entity-model.md +0 -612
  325. package/docs/architecture/current/external-plugin-governance.md +0 -396
  326. package/docs/architecture/current/failure-recovery.md +0 -447
  327. package/docs/architecture/current/governance.md +0 -213
  328. package/docs/architecture/current/human-interaction-plane.md +0 -87
  329. package/docs/architecture/current/implementation-status.md +0 -128
  330. package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
  331. package/docs/architecture/current/legacy-governance.md +0 -58
  332. package/docs/architecture/current/local-workspace-target-grants.md +0 -70
  333. package/docs/architecture/current/migration-roadmap.md +0 -105
  334. package/docs/architecture/current/multi-repository-execution.md +0 -371
  335. package/docs/architecture/current/operations-runbook.md +0 -45
  336. package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
  337. package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
  338. package/docs/architecture/current/repository-access-modes.md +0 -102
  339. package/docs/architecture/current/route-policy.md +0 -15
  340. package/docs/architecture/current/route-session-concurrency.md +0 -85
  341. package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
  342. package/docs/architecture/current/runtime-directory-map.md +0 -49
  343. package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
  344. package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
  345. package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
  346. package/docs/architecture/current/system-overview.md +0 -169
  347. package/docs/architecture/current/target-requirements-traceability.md +0 -202
  348. package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
  349. package/docs/architecture/current/thin-harness-v1.md +0 -321
  350. package/docs/architecture/current/verification-and-release-gates.md +0 -391
  351. package/docs/forge-autonomous-goal-loop.md +0 -9
  352. package/docs/forge-provider-configuration.md +0 -7
  353. package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -93
  354. package/docs/operations/gmail-assistant-routines.md +0 -186
  355. package/docs/operations/personal-assistant-operator-guide.md +0 -61
  356. package/docs/operations/provider-configuration.md +0 -31
  357. package/scripts/harness-trace-grade.sh +0 -150
  358. package/scripts/heartbeat-triage.sh +0 -361
  359. package/scripts/maintenance-triage.sh +0 -167
  360. package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
  361. package/src/cli/repositories/goal-registry.ts +0 -239
  362. package/src/runtime/assistant/action-proposals.ts +0 -279
  363. package/src/runtime/assistant/intent.ts +0 -395
  364. package/src/runtime/assistant/model-provider.ts +0 -460
  365. package/src/runtime/assistant/openapi.ts +0 -223
  366. package/src/runtime/assistant/policy.ts +0 -89
  367. package/src/runtime/assistant/readiness.ts +0 -258
  368. package/src/runtime/assistant/routine-runtime.ts +0 -477
  369. package/src/runtime/assistant/schedule-binding.ts +0 -171
  370. package/src/runtime/assistant/standing-grants.ts +0 -375
  371. package/src/runtime/assistant/store.ts +0 -243
  372. package/src/runtime/assistant/types.ts +0 -135
  373. package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
  374. package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
  375. package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
  376. package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
  377. package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
  378. package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
  379. package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
  380. package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
  381. package/src/runtime/control-plane/goal-loop/index.ts +0 -13
  382. package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
  383. package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
  384. package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
  385. package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
  386. package/src/runtime/control-plane/goal-loop/types.ts +0 -378
  387. package/src/runtime/control-plane/startup-recovery.ts +0 -198
  388. package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
  389. package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
  390. package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
  391. package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
  392. package/src/runtime/workflow/findings/store.ts +0 -204
  393. package/src/runtime/workflow/findings/types.ts +0 -58
  394. package/src/runtime/workflow/portfolio/engine.ts +0 -20
  395. package/src/runtime/workflow/portfolio/store.ts +0 -185
  396. package/src/runtime/workflow/portfolio/types.ts +0 -29
@@ -24,9 +24,18 @@ import {
24
24
  type RunCheckFacadeResult,
25
25
  } from './check-facade';
26
26
  import { claimsForCheck, toProcessClaims } from './resource-claims';
27
- import { spawnManagedProcess } from './runtime';
27
+ import { getProcessHandle, spawnManagedProcess } from './runtime';
28
+ import { getProcessRecord, getProcessRequestBinding } from './store';
28
29
  import { allocatePersistedCheckResultReceiptPath } from './check-result';
29
30
  import { durationAwareInteractiveWaitMs } from './interactive-admission';
31
+
32
+ /**
33
+ * Work verification may overlap another Work's repository-wide build cache.
34
+ * Wait through one ordinary sibling check, but never past Process Runtime's
35
+ * bounded lease-admission ceiling; explicit callers may still choose less.
36
+ */
37
+ export const DEFAULT_WORK_CHECK_LEASE_WAIT_MS = 30_000;
38
+
30
39
  const PERSISTED_CHECK_SOURCE_ENTRY = 'src/runtime/execution/process-runtime/check-runner-sidecar.ts';
31
40
 
32
41
  export function resolvePersistedCheckCliInvocation(
@@ -82,7 +91,7 @@ export function resolvePersistedCheckRuntimeExecutable(
82
91
  entryExists: (path: string) => boolean = existsSync,
83
92
  ): string {
84
93
  if (cliTarget.runtimeKind !== 'compiled_bun_release') return runtimeExecutable;
85
- const checkRunner = resolve(dirname(runtimeExecutable), 'forge-check-runner');
94
+ const checkRunner = resolve(cliTarget.cwd, 'forge-check-runner');
86
95
  if (!entryExists(checkRunner)) {
87
96
  throw new Error(`PERSISTED_CHECK_RUNNER_MISSING: ${checkRunner}`);
88
97
  }
@@ -128,6 +137,38 @@ export async function runPersistedCheckViaProcessRuntime(
128
137
  workerSpawnCount: 0,
129
138
  projectionUpdateCount: 0,
130
139
  };
140
+ const requestId = input.requestId?.trim();
141
+ const requestSemanticFingerprint = input.requestSemanticFingerprint?.trim();
142
+ if (requestId && requestSemanticFingerprint) {
143
+ const binding = getProcessRequestBinding(input.controllerHome, input.repoId, input.checkoutId, requestId);
144
+ if (binding) {
145
+ const record = getProcessRecord(input.controllerHome, input.repoId, binding.processId);
146
+ const exactIdentity = Boolean(
147
+ record
148
+ && record.repoId === input.repoId
149
+ && (record.checkoutId?.trim() || undefined) === (input.checkoutId?.trim() || undefined)
150
+ && (record.workId?.trim() || undefined) === (input.workId?.trim() || undefined)
151
+ && record.origin?.surface === 'check'
152
+ && record.origin.requestId === requestId
153
+ && record.origin.checkId === input.checkId
154
+ && record.origin.requestSemanticFingerprint === requestSemanticFingerprint,
155
+ );
156
+ if (!exactIdentity) throw new Error(`PROCESS_REQUEST_ID_CONFLICT: ${requestId}`);
157
+ const existing = getProcessHandle(input.controllerHome, input.repoId, binding.processId);
158
+ if (!existing) {
159
+ throw new Error(`PROCESS_REQUEST_INCOMPLETE: request ${requestId} is bound to missing process ${binding.processId}; refusing re-execution`);
160
+ }
161
+ const check = listControllerChecks(input.repoRoot).find((entry) => entry.id === input.checkId);
162
+ return {
163
+ mode: existing.completed ? 'direct' : 'managed',
164
+ checkId: input.checkId,
165
+ check,
166
+ process: { ...existing, deduplicated: true, requestId },
167
+ ok: existing.completed ? existing.ok : undefined,
168
+ durableSideEffects: emptyEffects,
169
+ };
170
+ }
171
+ }
131
172
  const verificationSnapshot = input.verificationSnapshot
132
173
  ? materializeWorkVerificationSnapshot({
133
174
  controllerHome: input.controllerHome,
@@ -153,7 +194,7 @@ export async function runPersistedCheckViaProcessRuntime(
153
194
  durableSideEffects: emptyEffects,
154
195
  };
155
196
  }
156
- if (input.forceDurable || checkRequiresDurableWorkflow(input.checkId, check)) {
197
+ if (input.forceDurable || (checkRequiresDurableWorkflow(input.checkId, check) && input.allowDurableCheckExecution !== true)) {
157
198
  cleanupVerificationSnapshot();
158
199
  return {
159
200
  mode: 'durable',
@@ -168,7 +209,8 @@ export async function runPersistedCheckViaProcessRuntime(
168
209
  }
169
210
 
170
211
  const interactiveWaitMs = durationAwareInteractiveWaitMs(check.command, input.interactiveWaitMs);
171
- const leaseWaitMs = input.leaseWaitMs;
212
+ const leaseWaitMs = input.leaseWaitMs
213
+ ?? (input.workId?.trim() ? DEFAULT_WORK_CHECK_LEASE_WAIT_MS : undefined);
172
214
  const timeoutMs = Math.min(
173
215
  check.timeoutMs,
174
216
  typeof input.timeoutMs === 'number' && Number.isFinite(input.timeoutMs)
@@ -262,6 +304,7 @@ export async function runPersistedCheckViaProcessRuntime(
262
304
  toolName: 'run_check',
263
305
  checkId: input.checkId,
264
306
  requestId: input.requestId,
307
+ requestSemanticFingerprint: input.requestSemanticFingerprint,
265
308
  correlationId: input.workId,
266
309
  executionSessionId: input.verificationBinding?.executionSessionId,
267
310
  editSessionId: input.verificationBinding?.editSessionId,
@@ -511,12 +511,16 @@ export function claimsForCheck(
511
511
  ): ResourceClaimSpec[] {
512
512
  const heavy = /(?:^|:)(?:test(?::coverage)?|check:(?:ci|forge-runtime|public-export|release(?:-[a-z0-9-]+)?))$/.test(checkId)
513
513
  || /release|migration|integrate/i.test(checkId);
514
- if (heavy) return [claimHeavyCheck(repoId)];
515
- if (effects) return claimsForDeclaredCheckEffects(checkId, effects, repoId, checkoutId);
516
- if (staticAnalysisCheckId(checkId)) return [claimWorkspaceRead(checkoutId), claimBuildCacheWrite(repoId)];
517
- if (command && command.length > 0) return claimsForRepositoryCommand(command, repoId, checkoutId);
518
- // Unknown named checks without a command/effects contract remain conservative.
519
- return [claimWorkspaceWrite(checkoutId)];
514
+ const baseClaims = effects
515
+ ? claimsForDeclaredCheckEffects(checkId, effects, repoId, checkoutId)
516
+ : staticAnalysisCheckId(checkId)
517
+ ? [claimWorkspaceRead(checkoutId), claimBuildCacheWrite(repoId)]
518
+ : command && command.length > 0
519
+ ? claimsForRepositoryCommand(command, repoId, checkoutId)
520
+ : [claimWorkspaceWrite(checkoutId)];
521
+ // Heavy-check is an additional cross-check serialization fence, not a
522
+ // substitute for the resources the check actually reads or writes.
523
+ return heavy ? normalizeClaims([claimHeavyCheck(repoId), ...baseClaims]) : baseClaims;
520
524
  }
521
525
 
522
526
  export function scopeResourceClaims(
@@ -306,8 +306,9 @@ function identityStillMatches(identity: ManagedProcessRecord['identity'] | undef
306
306
  }
307
307
  if (!isProcessAlive(identity.pid)) return false;
308
308
  const probe = defaultProcessIdentityProbe;
309
- const startTime = probe.startTime(identity.pid);
310
- const command = probe.command(identity.pid);
309
+ const inspected = probe.inspect?.(identity.pid);
310
+ const startTime = inspected?.startTime ?? probe.startTime(identity.pid);
311
+ const command = inspected?.command ?? probe.command(identity.pid);
311
312
  if (!startTime || !command) return false;
312
313
  if (startTime !== identity.processStartTime) return false;
313
314
  if (executableFingerprint(command) !== identity.executableFingerprint) return false;
@@ -541,7 +542,7 @@ export function completeProcessFromEvidence(
541
542
  stdoutTail?: string;
542
543
  stderrTail?: string;
543
544
  },
544
- options: { authority?: 'runtime_writer' | 'durable_exit_receipt' | 'durable_pre_spawn_abandonment' } = {},
545
+ options: { authority?: 'runtime_writer' | 'durable_exit_receipt' | 'durable_pre_spawn_abandonment' | 'durable_stale_active_reconciliation' } = {},
545
546
  ): ManagedProcessRecord | undefined {
546
547
  // Validated independent evidence may only perform the monotonic,
547
548
  // fence-token-bound terminal CAS below. It does not grant general writer
@@ -627,6 +628,45 @@ export function reconcileAbandonedPreSpawnProcess(
627
628
  }, { authority: 'durable_pre_spawn_abandonment' });
628
629
  }
629
630
 
631
+ /**
632
+ * Bounded maintenance reconciliation for stale active Process records that are
633
+ * no longer reachable through the v2 recovery index. This never deletes an
634
+ * active record and never re-executes a command: it first consumes any durable
635
+ * Runner receipt, preserves live monitors / matching process identities, and
636
+ * only then commits a monotonic terminal state for a provably dead identity.
637
+ */
638
+ export function reconcileStaleManagedProcessForMaintenance(
639
+ controllerHome: string,
640
+ repoId: string,
641
+ processId: string,
642
+ options: { nowMs?: number; minAgeMs?: number } = {},
643
+ ): ManagedProcessRecord | undefined {
644
+ let record = getProcessRecord(controllerHome, repoId, processId);
645
+ if (!record || !isManagedProcessActive(record)) return record;
646
+
647
+ const nowMs = options.nowMs ?? Date.now();
648
+ const minAgeMs = Math.max(1_000, options.minAgeMs ?? DEFAULT_PRE_SPAWN_ABANDONMENT_MS);
649
+ const updatedAtMs = Date.parse(record.updatedAt || record.startedAt);
650
+ if (!Number.isFinite(updatedAtMs) || nowMs - updatedAtMs < minAgeMs) return record;
651
+
652
+ const fromReceipt = applyReceiptIfPresent(controllerHome, repoId, processId, record);
653
+ if (fromReceipt) return fromReceipt;
654
+
655
+ if (record.status === 'starting' && !record.identity) {
656
+ return reconcileAbandonedPreSpawnProcess(controllerHome, repoId, processId, { nowMs, minAgeMs });
657
+ }
658
+
659
+ record = getProcessRecord(controllerHome, repoId, processId) ?? record;
660
+ if (!isManagedProcessActive(record) || liveMonitors.has(processId)) return record;
661
+ if (identityStillMatches(record.identity, record.identityUntrusted)) return record;
662
+
663
+ return completeProcessFromEvidence(controllerHome, repoId, processId, record.terminalFenceToken, {
664
+ status: 'completed_unknown',
665
+ finishedAt: new Date(nowMs).toISOString(),
666
+ errorMessage: 'PROCESS_STALE_ACTIVE_RECONCILED: stale active record has no live matching process identity or durable exit receipt',
667
+ }, { authority: 'durable_stale_active_reconciliation' });
668
+ }
669
+
630
670
  async function killTree(child: ChildProcess): Promise<void> {
631
671
  const pid = child.pid;
632
672
  if (!pid) return;
@@ -299,6 +299,7 @@ function sanitizeProcessRecord(record: ManagedProcessRecord): { record: ManagedP
299
299
  toolName: safeText(record.origin.toolName),
300
300
  requestId: safeText(record.origin.requestId),
301
301
  checkId: safeText(record.origin.checkId),
302
+ requestSemanticFingerprint: safeText(record.origin.requestSemanticFingerprint),
302
303
  correlationId: safeText(record.origin.correlationId),
303
304
  } : undefined,
304
305
  };
@@ -239,6 +239,8 @@ export interface ManagedProcessRecord {
239
239
  toolName?: string;
240
240
  requestId?: string;
241
241
  checkId?: string;
242
+ /** Stable semantic identity supplied by a facade for exact request reattachment. */
243
+ requestSemanticFingerprint?: string;
242
244
  correlationId?: string;
243
245
  /** Controller MCP session that initiated this check, when applicable. */
244
246
  executionSessionId?: string;
@@ -10,6 +10,9 @@ export interface BoundedProcessOptions {
10
10
  signal?: AbortSignal;
11
11
  /** When true (default on non-Windows), create a new process group for tree kill. */
12
12
  processGroup?: boolean;
13
+ onSpawn?: (pid: number) => void;
14
+ onStdout?: (chunk: string) => void;
15
+ onStderr?: (chunk: string) => void;
13
16
  }
14
17
 
15
18
  export interface BoundedProcessResult {
@@ -114,6 +117,7 @@ export async function runBoundedProcess(
114
117
  stdio: ['ignore', 'pipe', 'pipe'],
115
118
  detached: useProcessGroup,
116
119
  });
120
+ if (child.pid) options.onSpawn?.(child.pid);
117
121
 
118
122
  const finish = (exitCode: number) => {
119
123
  if (settled) return;
@@ -150,8 +154,14 @@ export async function runBoundedProcess(
150
154
 
151
155
  options.signal?.addEventListener('abort', onAbort, { once: true });
152
156
 
153
- child.stdout?.on('data', (chunk: Buffer) => stdout.write(chunk));
154
- child.stderr?.on('data', (chunk: Buffer) => stderr.write(chunk));
157
+ child.stdout?.on('data', (chunk: Buffer) => {
158
+ stdout.write(chunk);
159
+ options.onStdout?.(chunk.toString('utf8'));
160
+ });
161
+ child.stderr?.on('data', (chunk: Buffer) => {
162
+ stderr.write(chunk);
163
+ options.onStderr?.(chunk.toString('utf8'));
164
+ });
155
165
  child.on('error', (error) => {
156
166
  spawnError = error.message;
157
167
  });
@@ -5,7 +5,12 @@
5
5
  import { isMainThread, parentPort, workerData, Worker } from 'worker_threads';
6
6
  import { fileURLToPath } from 'url';
7
7
  import { getMcpPolicy } from '../../../cli/mcp/policy';
8
- import { searchRepository } from '../../../cli/repository/inspector';
8
+ import type { McpPolicy } from '../../../cli/mcp/types';
9
+ import {
10
+ searchRepository,
11
+ searchRepositoryMany,
12
+ type SearchRepositoryManyResult,
13
+ } from '../../../cli/repository/inspector';
9
14
 
10
15
  export interface SearchWorkerInput {
11
16
  repoRoot: string;
@@ -14,14 +19,44 @@ export interface SearchWorkerInput {
14
19
  maxFiles: number;
15
20
  }
16
21
 
22
+ export interface SearchManyWorkerInput {
23
+ repoRoot: string;
24
+ policy: McpPolicy;
25
+ queries: string[];
26
+ files?: string[];
27
+ includeGlobs?: string[];
28
+ excludeGlobs?: string[];
29
+ maxResultsPerQuery?: number;
30
+ maxFiles?: number;
31
+ caseSensitive?: boolean;
32
+ cacheKey?: string;
33
+ }
34
+
17
35
  export interface SearchWorkerResult {
18
36
  ok: boolean;
19
37
  payload?: Record<string, unknown>;
20
38
  error?: string;
21
39
  }
22
40
 
23
- function runSearchSync(input: SearchWorkerInput): SearchWorkerResult {
41
+ function isManySearch(input: SearchWorkerInput | SearchManyWorkerInput): input is SearchManyWorkerInput {
42
+ return Array.isArray((input as SearchManyWorkerInput).queries);
43
+ }
44
+
45
+ function runSearchSync(input: SearchWorkerInput | SearchManyWorkerInput): SearchWorkerResult {
24
46
  try {
47
+ if (isManySearch(input)) {
48
+ const result = searchRepositoryMany(input.repoRoot, input.policy, {
49
+ queries: input.queries,
50
+ files: input.files,
51
+ includeGlobs: input.includeGlobs,
52
+ excludeGlobs: input.excludeGlobs,
53
+ maxResultsPerQuery: input.maxResultsPerQuery,
54
+ maxFiles: input.maxFiles,
55
+ caseSensitive: input.caseSensitive,
56
+ cacheKey: input.cacheKey,
57
+ }) as unknown as Record<string, unknown>;
58
+ return { ok: true, payload: result };
59
+ }
25
60
  const result = searchRepository(input.repoRoot, getMcpPolicy('controller', { repoRoot: input.repoRoot }), {
26
61
  query: input.query,
27
62
  maxResults: input.maxResults,
@@ -36,8 +71,8 @@ function runSearchSync(input: SearchWorkerInput): SearchWorkerResult {
36
71
  }
37
72
  }
38
73
 
39
- export async function runInspectorSearchInWorker(
40
- input: SearchWorkerInput,
74
+ async function runSearchWorker(
75
+ input: SearchWorkerInput | SearchManyWorkerInput,
41
76
  options: { timeoutMs?: number; signal?: AbortSignal } = {},
42
77
  ): Promise<Record<string, unknown>> {
43
78
  if (options.signal?.aborted) throw new Error('CANCELLED: search aborted');
@@ -108,7 +143,21 @@ export async function runInspectorSearchInWorker(
108
143
  });
109
144
  }
110
145
 
146
+ export async function runInspectorSearchInWorker(
147
+ input: SearchWorkerInput,
148
+ options: { timeoutMs?: number; signal?: AbortSignal } = {},
149
+ ): Promise<Record<string, unknown>> {
150
+ return await runSearchWorker(input, options);
151
+ }
152
+
153
+ export async function runInspectorSearchManyInWorker(
154
+ input: SearchManyWorkerInput,
155
+ options: { timeoutMs?: number; signal?: AbortSignal } = {},
156
+ ): Promise<SearchRepositoryManyResult> {
157
+ return await runSearchWorker(input, options) as unknown as SearchRepositoryManyResult;
158
+ }
159
+
111
160
  if (!isMainThread && parentPort) {
112
- const input = workerData as SearchWorkerInput;
161
+ const input = workerData as SearchWorkerInput | SearchManyWorkerInput;
113
162
  parentPort.postMessage(runSearchSync(input));
114
163
  }
@@ -21,7 +21,6 @@ import {
21
21
  } from '../jobs/child-reference';
22
22
  import { markOperationDelegated } from '../jobs/receipt-store';
23
23
  import { assertAutomatedOperationAllowed } from '../../control-plane/governance/external-effects';
24
- import { recordCandidateFinding, updateCandidateFinding } from '../../workflow/findings/store';
25
24
  import { triggerWorkspaceAgent } from '../workspace-agent';
26
25
  import { executeAssistantPluginAction } from '../../plugins/store';
27
26
  import { CONTROLLER_SCOPE_REPO_ID, controllerSystemRoot, repositoryControllerRoot } from '../../../cli/repositories/controller-home';
@@ -29,7 +28,6 @@ import { writeExecutionArtifact } from '../../evidence/artifact-store';
29
28
  import { existsSync } from 'fs';
30
29
  import { isAbsolute, relative, resolve, sep } from 'path';
31
30
  import { isAssistantPluginError } from '../../plugins/errors';
32
- import { executeAssistantRoutineRuntime } from '../../assistant/routine-runtime';
33
31
 
34
32
 
35
33
  function childReferenceFromLocalJob(
@@ -445,20 +443,6 @@ export async function executeExecutionJob(controllerHome: string, job: Execution
445
443
  }
446
444
  bindRepositoryEntities(repository);
447
445
 
448
- if (job.payload.target === 'runtime' && job.payload.operation === 'assistant_routine_execute') {
449
- const routineId = String(job.payload.arguments?.routineId ?? job.payload.arguments?.routine_id ?? '').trim();
450
- if (!routineId) throw new Error('ASSISTANT_ROUTINE_ID_REQUIRED');
451
- const routineResult = await executeAssistantRoutineRuntime({
452
- controllerHome,
453
- repository,
454
- routineId,
455
- requestId: job.requestId,
456
- origin: job.origin,
457
- occurrenceId: typeof job.payload.occurrenceId === 'string' ? job.payload.occurrenceId : undefined,
458
- });
459
- return { ok: true, result: { assistantRoutine: routineResult }, repoRoot };
460
- }
461
-
462
446
  if (job.payload.target === 'runtime' && job.payload.operation === 'legacy-local-job') {
463
447
  const localJobId = String(job.payload.arguments?.localJobId ?? '').trim();
464
448
  if (!localJobId) throw new Error('LEGACY_JOB_ID_REQUIRED');
@@ -511,26 +495,6 @@ export async function executeExecutionJob(controllerHome: string, job: Execution
511
495
  : { ok: false, error: { code: 'RELEASE_GATE_BLOCKED', message: 'Release gate has blockers.', retryable: false, details: { gate } }, repoRoot };
512
496
  }
513
497
 
514
- if (job.payload.operation === 'record_candidate_finding') {
515
- const args = job.payload.arguments ?? {};
516
- const finding = recordCandidateFinding(controllerHome, {
517
- repoId: job.repoId,
518
- requestId: job.requestId,
519
- semanticKey: String(args.semantic_key ?? args.semanticKey ?? '').trim(),
520
- title: String(args.title ?? '').trim(),
521
- summary: typeof args.summary === 'string' ? args.summary : undefined,
522
- severity: ['low', 'medium', 'high', 'critical'].includes(String(args.severity))
523
- ? String(args.severity) as 'low' | 'medium' | 'high' | 'critical'
524
- : 'medium',
525
- evidence: {
526
- source: job.origin.surface,
527
- reference: typeof args.reference === 'string' ? args.reference : job.origin.correlationId,
528
- details: args.evidence && typeof args.evidence === 'object' ? args.evidence as Record<string, unknown> : undefined,
529
- },
530
- });
531
- return { ok: true, result: { finding }, repoRoot };
532
- }
533
-
534
498
  const allowedAgents = Array.isArray(job.payload.allowedAgents)
535
499
  ? job.payload.allowedAgents.filter((value): value is string => typeof value === 'string')
536
500
  : [];
@@ -651,18 +615,6 @@ export async function executeExecutionJob(controllerHome: string, job: Execution
651
615
  );
652
616
  }
653
617
 
654
- if (job.origin.actor === 'promote_candidate_finding' && job.origin.correlationId) {
655
- try {
656
- updateCandidateFinding(controllerHome, job.repoId, job.origin.correlationId, (current) => ({
657
- ...current,
658
- status: result.isError ? 'candidate' : 'promoted',
659
- promotedJobId: job.jobId,
660
- }), job.requestId, result.isError ? 'candidate_promotion_failed' : 'candidate_finding_promoted');
661
- } catch {
662
- // The Issue result remains authoritative even if the candidate projection needs reconciliation.
663
- }
664
- }
665
-
666
618
  if (result.isError) {
667
619
  return { ok: false, error: { code: 'MCP_TOOL_FAILED', message: JSON.stringify(record), retryable: false }, repoRoot };
668
620
  }