@moretea-labs/forge 1.8.0 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (695) hide show
  1. package/AGENTS.md +73 -7
  2. package/CHANGELOG.md +34 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.en.md +24 -3
  6. package/README.md +10 -6
  7. package/README.zh-CN.md +5 -3
  8. package/THIRD_PARTY_NOTICES.md +1 -2
  9. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
  11. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  12. package/adapters/chatgpt/controller-round-host.ts +15 -25
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  14. package/adapters/chatgpt/provider-delivery.ts +229 -2
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
  16. package/adapters/computer/chatgpt-extension-target.ts +708 -0
  17. package/adapters/computer/chrome-extension/background.js +541 -0
  18. package/adapters/computer/chrome-extension/content.js +402 -0
  19. package/adapters/computer/chrome-extension/core.js +24 -0
  20. package/adapters/computer/chrome-extension/manifest.json +32 -0
  21. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  22. package/adapters/computer/desktop-operator-provider.ts +18 -6
  23. package/adapters/computer/interaction-target-authority.ts +178 -24
  24. package/adapters/mcp/access-mode.ts +18 -39
  25. package/adapters/mcp/auth.ts +2 -7
  26. package/adapters/mcp/instructions.ts +6 -5
  27. package/adapters/mcp/multi-repository.ts +10 -47
  28. package/adapters/mcp/oauth.ts +73 -0
  29. package/adapters/mcp/paths.ts +4 -1
  30. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  31. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  32. package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
  33. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
  34. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  35. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  36. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  37. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  38. package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
  39. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  40. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
  41. package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
  42. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  43. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  44. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  45. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  46. package/adapters/mcp/runtime-gateway/router.ts +19 -507
  47. package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
  48. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
  49. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  50. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
  51. package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
  52. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
  53. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  54. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
  55. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
  56. package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
  57. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  58. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  59. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
  60. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  61. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  62. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  63. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  64. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  65. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
  66. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  67. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
  68. package/adapters/mcp/server.ts +91 -26
  69. package/adapters/mcp/setup.ts +5 -13
  70. package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
  71. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
  72. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
  73. package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
  74. package/adapters/mcp/toolset-names.ts +11 -37
  75. package/adapters/mcp/toolset.ts +19 -92
  76. package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
  77. package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
  78. package/adapters/mcp/transports/http-observation.ts +377 -0
  79. package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
  80. package/adapters/mcp/transports/http.ts +200 -683
  81. package/adapters/mcp/transports/oauth-http.ts +322 -0
  82. package/adapters/mcp/transports/session-registry.ts +6 -0
  83. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  84. package/adapters/mcp/types.ts +0 -6
  85. package/assets/hooks/lib/session-state.sh +0 -38
  86. package/assets/hooks/post-bash.sh +1 -1
  87. package/assets/hooks/post-tool-observer.sh +0 -5
  88. package/assets/hooks/prompt-guard.sh +0 -55
  89. package/assets/partials/04-project-structure.partial.md +1 -1
  90. package/assets/partials/07-footer.partial.md +1 -1
  91. package/assets/partials-agents/02-operating-mode.partial.md +1 -1
  92. package/assets/partials-agents/08-deep-docs.partial.md +1 -1
  93. package/assets/plugin-registry.v1.json +6 -4
  94. package/assets/reference-configs/agentic-development-flow.md +26 -1
  95. package/assets/reference-configs/external-tooling.md +0 -76
  96. package/assets/reference-configs/global-working-rules.md +19 -0
  97. package/assets/reference-configs/release-deploy.md +1 -1
  98. package/assets/templates/helpers/architecture-queue.sh +1 -1
  99. package/assets/templates/helpers/check-agent-tooling.sh +1 -327
  100. package/assets/templates/helpers/check-task-workflow.sh +1 -1
  101. package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
  102. package/assets/templates/helpers/migrate-project-template.sh +2 -2
  103. package/assets/workflow-contract.v1.json +0 -2
  104. package/docs/README.md +5 -2
  105. package/docs/architecture/CURRENT.md +205 -51
  106. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  107. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  108. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
  109. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  110. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  111. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  112. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  113. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
  114. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  115. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
  116. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
  117. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  118. package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
  119. package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
  120. package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
  121. package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
  122. package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
  123. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
  124. package/docs/architecture/domains/public-surface.md +3 -5
  125. package/docs/architecture/domains/verification.md +6 -5
  126. package/docs/architecture/domains/workflow-engine.md +6 -0
  127. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
  128. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
  129. package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
  130. package/docs/forge-plugin-management.md +16 -4
  131. package/docs/operations/controller-browser-plugin.md +23 -0
  132. package/docs/operations/controller-performance-and-502.md +17 -0
  133. package/docs/operations/controller-reliability-runbook.md +2 -2
  134. package/docs/operations/features.md +6 -7
  135. package/docs/operations/features.zh-CN.md +1 -1
  136. package/docs/operations/github-repository.md +4 -4
  137. package/docs/operations/github-semantic-release-projection.md +20 -0
  138. package/docs/operations/homebrew.md +2 -2
  139. package/docs/operations/mcp-tool-exposure.md +13 -52
  140. package/docs/operations/releasing.md +2 -0
  141. package/docs/operations/runtime-performance-diagnostics.md +8 -0
  142. package/docs/operations/standalone-disaster-recovery.md +15 -7
  143. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  144. package/docs/tutorials/03-first-repository-task.md +2 -0
  145. package/docs/wiki/Computer-and-Plugins.md +78 -0
  146. package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
  147. package/docs/wiki/Home.md +16 -2
  148. package/docs/wiki/Implementation.md +25 -13
  149. package/docs/wiki/Installation.md +28 -32
  150. package/docs/wiki/Integrations.md +4 -0
  151. package/docs/wiki/Quick-Start.md +35 -22
  152. package/docs/wiki/Releases-and-Upgrades.md +15 -25
  153. package/docs/wiki/_Sidebar.md +5 -1
  154. package/package.json +25 -25
  155. package/packages/kernel/cognition/api/index.ts +6 -0
  156. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  157. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  158. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  159. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  160. package/packages/kernel/cognition/domain/learning.ts +106 -0
  161. package/packages/kernel/cognition/domain/memory.ts +254 -0
  162. package/packages/kernel/controller/api/index.ts +1 -0
  163. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  164. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  165. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  166. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  167. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  168. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  169. package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
  170. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  171. package/packages/kernel/identity/api/index.ts +10 -0
  172. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  173. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  174. package/packages/kernel/identity/domain/grant.ts +72 -0
  175. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  176. package/packages/kernel/identity/domain/user-request.ts +93 -0
  177. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
  178. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  179. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  180. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  181. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  182. package/packages/kernel/scheduler/api/index.ts +0 -2
  183. package/packages/kernel/scheduler/application/eligibility.ts +4 -1
  184. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  185. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  186. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  187. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
  188. package/packages/kernel/work/api/index.ts +3 -2
  189. package/packages/kernel/work/application/work-service.ts +18 -42
  190. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  191. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  192. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  193. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  194. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  195. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  196. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  197. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  198. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  199. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  200. package/packages/kernel/work/domain/state-machine.ts +34 -65
  201. package/packages/kernel/work/domain/types.ts +57 -51
  202. package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
  203. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  204. package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
  205. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  206. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  207. package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
  208. package/packages/plugin-runtime/computer/index.ts +2 -0
  209. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  210. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  211. package/packages/protocols/computer/contract.ts +27 -1
  212. package/scripts/activate-source-baseline.ts +7 -9
  213. package/scripts/assemble-template.ts +11 -72
  214. package/scripts/canary-controller-semantic-wait.ts +12 -24
  215. package/scripts/check-mcp-compatibility.ts +94 -201
  216. package/scripts/check-package-identity.mjs +0 -5
  217. package/scripts/check-runtime-architecture.mjs +921 -239
  218. package/scripts/forge-local-recovery-helper.mjs +93 -15
  219. package/scripts/init-project.sh +0 -46
  220. package/scripts/install-ios-hid-toolchain.sh +60 -0
  221. package/scripts/install-standalone-recovery.ts +1 -1
  222. package/scripts/lib/project-init-lib.sh +6 -3
  223. package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
  224. package/scripts/open-source-audit-allowlist.txt +1 -3
  225. package/scripts/run-bounded-command.mjs +5 -0
  226. package/scripts/run-governed-gate.ts +2 -1
  227. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  228. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  229. package/scripts/smoke-ios-physical-device.ts +38 -10
  230. package/scripts/smoke-mcp-http-runtime.ts +12 -8
  231. package/scripts/smoke-mcp-tool-surface.ts +27 -41
  232. package/scripts/smoke-runtime-recovery.ts +12 -43
  233. package/scripts/smoke-schedule-engine.ts +23 -15
  234. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  235. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  236. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
  237. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  238. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  239. package/scripts/smoke-workflow-supervisor.ts +103 -0
  240. package/scripts/sync-generated-authority.mjs +0 -1
  241. package/scripts/verify-forge-runtime.sh +2 -1
  242. package/src/cli/agent-jobs/executor-health.ts +12 -35
  243. package/src/cli/agent-jobs/integration.ts +20 -51
  244. package/src/cli/agent-jobs/job-manager.ts +7 -3
  245. package/src/cli/chatgpt-browser/file-policy.ts +2 -2
  246. package/src/cli/commands/brain-assistant.ts +27 -13
  247. package/src/cli/commands/brain.ts +13 -15
  248. package/src/cli/commands/chatgpt.ts +1 -163
  249. package/src/cli/commands/doctor.ts +1 -143
  250. package/src/cli/commands/global-runtime.ts +3 -196
  251. package/src/cli/commands/init-hook.ts +6 -23
  252. package/src/cli/commands/init.ts +3 -252
  253. package/src/cli/commands/mcp.ts +0 -5
  254. package/src/cli/commands/prompt-guard-decision.ts +0 -2
  255. package/src/cli/commands/recovery.ts +137 -135
  256. package/src/cli/commands/repository.ts +17 -1
  257. package/src/cli/commands/runtime.ts +3 -3
  258. package/src/cli/commands/setup-execution.ts +41 -0
  259. package/src/cli/commands/setup-profile.ts +8 -0
  260. package/src/cli/controller/check-runner.ts +13 -2
  261. package/src/cli/controller/completion-backlog.ts +3 -3
  262. package/src/cli/controller/completion-orchestrator.ts +5 -44
  263. package/src/cli/controller/completion-target.ts +3 -72
  264. package/src/cli/controller/composite-operations.ts +1 -1
  265. package/src/cli/controller/context/instruction-context.ts +1 -1
  266. package/src/cli/controller/context/known-paths.ts +2 -2
  267. package/src/cli/controller/context/query-planning.ts +11 -4
  268. package/src/cli/controller/context/rule-resolution.ts +2 -2
  269. package/src/cli/controller/context/source-materializer.ts +83 -102
  270. package/src/cli/controller/context/structural-provider.ts +84 -0
  271. package/src/cli/controller/context/structural.ts +6 -6
  272. package/src/cli/controller/context/types.ts +8 -9
  273. package/src/cli/controller/context-pack.ts +107 -84
  274. package/src/cli/controller/execution-completion.ts +4 -7
  275. package/src/cli/controller/execution-policy.ts +36 -153
  276. package/src/cli/controller/governance.ts +2 -3
  277. package/src/cli/controller/issue-store.ts +4 -99
  278. package/src/cli/controller/launch-agents.ts +59 -18
  279. package/src/cli/controller/operational-plan.ts +25 -52
  280. package/src/cli/controller/runtime-config.ts +5 -1
  281. package/src/cli/controller/stuck-state-migration.ts +2 -3
  282. package/src/cli/controller/systemd-user.ts +42 -10
  283. package/src/cli/editing/edit-session.ts +18 -12
  284. package/src/cli/github/github.ts +4 -4
  285. package/src/cli/github/semantic-projection.ts +174 -0
  286. package/src/cli/hook/prompt-intents.ts +0 -9
  287. package/src/cli/index.ts +1 -43
  288. package/src/cli/local-bridge/connector-freshness.ts +1 -12
  289. package/src/cli/local-bridge/console-automations.ts +19 -14
  290. package/src/cli/local-bridge/console-view-models.ts +4 -13
  291. package/src/cli/local-bridge/facade-api.ts +64 -193
  292. package/src/cli/local-bridge/server.ts +24 -147
  293. package/src/cli/local-bridge/types.ts +0 -1
  294. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  295. package/src/cli/repositories/command-classifier.ts +0 -9
  296. package/src/cli/repositories/command-executor.ts +29 -23
  297. package/src/cli/repositories/command-scope.ts +37 -18
  298. package/src/cli/repositories/controller-home.ts +48 -0
  299. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  300. package/src/cli/repositories/git-command-executor.ts +2 -2
  301. package/src/cli/repositories/locks.ts +20 -0
  302. package/src/cli/repositories/registry.ts +79 -12
  303. package/src/cli/repositories/safe-patch.ts +2 -12
  304. package/src/cli/repositories/structured-git.ts +101 -5
  305. package/src/cli/repository/inspector.ts +185 -343
  306. package/src/cli/repository/session-cache.ts +92 -6
  307. package/src/effects/process-runner.ts +17 -1
  308. package/src/runtime/context/assistant-context.ts +20 -7
  309. package/src/runtime/context/assistant-work-context.ts +89 -27
  310. package/src/runtime/context/automatic-learning.ts +565 -0
  311. package/src/runtime/context/cognitive-attention.ts +173 -0
  312. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  313. package/src/runtime/context/context-closure.ts +46 -9
  314. package/src/runtime/context/context-pack-process.ts +103 -0
  315. package/src/runtime/context/context-plane.ts +1 -9
  316. package/src/runtime/context/direct-controller-learning.ts +298 -0
  317. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  318. package/src/runtime/context/semantic-navigation-contract.ts +16 -0
  319. package/src/runtime/context/semantic-navigation.ts +7 -35
  320. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  321. package/src/runtime/context/typescript-navigation.ts +89 -3
  322. package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
  323. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  324. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  325. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  326. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  327. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  328. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  329. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  330. package/src/runtime/control-plane/execution/validation.ts +6 -8
  331. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  332. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  333. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  334. package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
  335. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  336. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  337. package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
  338. package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
  339. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  340. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  341. package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
  342. package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
  343. package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
  344. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  345. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  346. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
  347. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
  348. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  349. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
  350. package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
  351. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  352. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  353. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  354. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  355. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  356. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  357. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  358. package/src/runtime/control-plane/facade/index.ts +0 -1
  359. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  360. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  361. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  362. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  363. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  364. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  365. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  366. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  367. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  368. package/src/runtime/control-plane/facade/types.ts +49 -108
  369. package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
  370. package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
  371. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  372. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  373. package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
  374. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
  375. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  376. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  377. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  378. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  379. package/src/runtime/control-plane/governance/external-effects.ts +1 -1
  380. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  381. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
  382. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  383. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  384. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  385. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  386. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  387. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  388. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  389. package/src/runtime/control-plane/release-retention.ts +135 -47
  390. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  391. package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
  392. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  393. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  394. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  395. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  396. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  397. package/src/runtime/evidence/artifact-store.ts +158 -40
  398. package/src/runtime/evidence/evidence-store.ts +112 -8
  399. package/src/runtime/evidence/output-handle-index.ts +225 -0
  400. package/src/runtime/evidence/result-store.ts +158 -44
  401. package/src/runtime/evidence/sensitive-output.ts +22 -2
  402. package/src/runtime/execution/jobs/child-reference.ts +11 -0
  403. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
  404. package/src/runtime/execution/jobs/store.ts +3 -4
  405. package/src/runtime/execution/managed-workspace.ts +57 -0
  406. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  407. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  408. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  409. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  410. package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
  411. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  412. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  413. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  414. package/src/runtime/execution/process-runtime/index.ts +3 -0
  415. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  416. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  417. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  418. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  419. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  420. package/src/runtime/execution/process-runtime/runtime.ts +55 -18
  421. package/src/runtime/execution/process-runtime/store.ts +30 -2
  422. package/src/runtime/execution/process-runtime/types.ts +6 -1
  423. package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
  424. package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
  425. package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
  426. package/src/runtime/execution/workers/executor.ts +3 -8
  427. package/src/runtime/maintenance/cleanup.ts +41 -5
  428. package/src/runtime/platform/service-inventory.ts +130 -0
  429. package/src/runtime/platform/service-manager.ts +8 -0
  430. package/src/runtime/plugins/action-application.ts +97 -29
  431. package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
  432. package/src/runtime/plugins/browser-adapter.ts +1124 -333
  433. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  434. package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
  435. package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
  436. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  437. package/src/runtime/plugins/browser-registration.ts +18 -0
  438. package/src/runtime/plugins/browser-runtime.ts +40 -36
  439. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  440. package/src/runtime/plugins/browser-session-store.ts +46 -76
  441. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  442. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
  443. package/src/runtime/plugins/computer-registration.ts +298 -20
  444. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  445. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  446. package/src/runtime/plugins/external-adapter.ts +42 -6
  447. package/src/runtime/plugins/external-registration.ts +21 -1
  448. package/src/runtime/plugins/github-adapter.ts +30 -3
  449. package/src/runtime/plugins/gmail-adapter.ts +189 -3
  450. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  451. package/src/runtime/plugins/google-shared.ts +24 -12
  452. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  453. package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
  454. package/src/runtime/plugins/ios-adapter.ts +46 -41
  455. package/src/runtime/plugins/ios-agent-device.ts +54 -4
  456. package/src/runtime/plugins/ios-device-ownership.ts +103 -0
  457. package/src/runtime/plugins/ios-physical-device.ts +497 -79
  458. package/src/runtime/plugins/lightweight-action.ts +208 -2
  459. package/src/runtime/plugins/local-system-adapter.ts +12 -100
  460. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  461. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  462. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  463. package/src/runtime/plugins/store.ts +682 -435
  464. package/src/runtime/plugins/types.ts +24 -0
  465. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  466. package/src/runtime/projections/git-status-sampler.ts +2 -19
  467. package/src/runtime/projections/invalidation.ts +7 -3
  468. package/src/runtime/projections/materialized-view.ts +80 -36
  469. package/src/runtime/recovery/actions.ts +4 -4
  470. package/src/runtime/recovery/capability-action-application.ts +46 -45
  471. package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
  472. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  473. package/src/runtime/recovery/probe.ts +2 -2
  474. package/src/runtime/recovery/store.ts +29 -11
  475. package/src/runtime/release/release-coordinator.ts +312 -0
  476. package/src/runtime/release/release-session.ts +716 -0
  477. package/src/runtime/release/release-state-migration.ts +25 -0
  478. package/src/runtime/resources/leases/store.ts +56 -25
  479. package/src/runtime/root/computer-composition.ts +191 -6
  480. package/src/runtime/root/controller-progression-composition.ts +254 -0
  481. package/src/runtime/root/controller-round-composition.ts +20 -1
  482. package/src/runtime/root/deployment-topology.ts +106 -0
  483. package/src/runtime/root/entry.ts +4 -3
  484. package/src/runtime/root/known-good-recovery.ts +184 -0
  485. package/src/runtime/root/local-bridge.ts +0 -1
  486. package/src/runtime/root/mcp-transport.ts +111 -18
  487. package/src/runtime/root/ownership.ts +261 -9
  488. package/src/runtime/root/package-connector-service.ts +227 -29
  489. package/src/runtime/root/package-runtime-release.ts +117 -30
  490. package/src/runtime/root/package-runtime-service.ts +24 -24
  491. package/src/runtime/root/release-execution-canary.ts +57 -12
  492. package/src/runtime/root/release-loader.ts +90 -8
  493. package/src/runtime/root/release-manifest.ts +80 -40
  494. package/src/runtime/root/release-materialize.ts +372 -106
  495. package/src/runtime/root/release-store.ts +395 -36
  496. package/src/runtime/root/runtime-lane.ts +191 -0
  497. package/src/runtime/root/runtime.ts +160 -29
  498. package/src/runtime/root/scheduled-controller-composition.ts +29 -3
  499. package/src/runtime/root/service-runner.ts +2 -2
  500. package/src/runtime/root/service.ts +126 -44
  501. package/src/runtime/root/status.ts +48 -0
  502. package/src/runtime/root/types.ts +32 -9
  503. package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
  504. package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
  505. package/src/runtime/root/write-fence.ts +50 -2
  506. package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
  507. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  508. package/src/runtime/safe-tooling/ios-development.ts +22 -8
  509. package/src/runtime/safe-tooling/job-summary.ts +1 -1
  510. package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
  511. package/src/runtime/shared/atomic-text-file.ts +21 -0
  512. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  513. package/src/runtime/shared/json-files.ts +8 -3
  514. package/src/runtime/shared/process-environment.ts +20 -9
  515. package/src/runtime/shared/response-budget.ts +1 -3
  516. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  517. package/src/runtime/standalone-recovery/core.ts +3792 -417
  518. package/src/runtime/standalone-recovery/entry.ts +507 -45
  519. package/src/runtime/standalone-recovery/installer.ts +262 -148
  520. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  521. package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
  522. package/src/runtime/standalone-recovery/performance.ts +54 -16
  523. package/src/runtime/standalone-recovery/release.ts +53 -5
  524. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  525. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  526. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  527. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
  528. package/src/runtime/workflow/schedules/engine.ts +166 -178
  529. package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
  530. package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
  531. package/src/runtime/workflows/runtime.ts +15 -19
  532. package/src/testing/test-governance.ts +5 -1
  533. package/supervisor/chatgpt-conversation.ts +23 -0
  534. package/supervisor/client.ts +218 -0
  535. package/supervisor/control-plane.ts +963 -0
  536. package/supervisor/entry.ts +15 -0
  537. package/supervisor/forge-validators.ts +147 -0
  538. package/supervisor/index.ts +5 -0
  539. package/supervisor/native-browser-adapter.ts +1151 -0
  540. package/supervisor/native-messaging/host.ts +58 -0
  541. package/supervisor/native-messaging/manifest.ts +26 -0
  542. package/supervisor/native-messaging/protocol.ts +27 -0
  543. package/supervisor/paths.ts +18 -0
  544. package/supervisor/protocol.ts +250 -0
  545. package/supervisor/server.ts +412 -0
  546. package/supervisor/store.ts +1870 -0
  547. package/supervisor/tsconfig.json +8 -0
  548. package/supervisor/types.ts +261 -0
  549. package/SKILL.md +0 -427
  550. package/adapters/chatgpt/controller-host.ts +0 -119
  551. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  552. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  553. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  554. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
  555. package/adapters/mcp/toolset-selection.ts +0 -41
  556. package/agents/openai.yaml +0 -4
  557. package/assets/skill-hooks.json +0 -41
  558. package/assets/skill-version.json +0 -189
  559. package/assets/skills/claude-review/SKILL.md +0 -231
  560. package/assets/skills/codex-review/SKILL.md +0 -103
  561. package/assets/templates/helpers/check-skill-version.ts +0 -193
  562. package/packages/kernel/progression/api/index.ts +0 -2
  563. package/packages/kernel/progression/application/projector.ts +0 -211
  564. package/packages/kernel/progression/domain/types.ts +0 -116
  565. package/packages/kernel/progression/index.ts +0 -1
  566. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  567. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  568. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  569. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  570. package/scripts/benchmark-background-check-overlap.ts +0 -228
  571. package/scripts/benchmark-computer-hotpath.ts +0 -255
  572. package/scripts/benchmark-controller-hotpath.ts +0 -212
  573. package/scripts/benchmark-controller-round2.ts +0 -191
  574. package/scripts/benchmark-ios-agent-device.ts +0 -511
  575. package/scripts/benchmark-mcp-host.sh +0 -117
  576. package/scripts/benchmark-mcp-transport.ts +0 -169
  577. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  578. package/scripts/benchmark-operational-shadow.ts +0 -28
  579. package/scripts/benchmark-quality-harness.ts +0 -146
  580. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  581. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  582. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  583. package/scripts/benchmark-thin-harness.ts +0 -251
  584. package/scripts/benchmark-typescript-navigation.ts +0 -186
  585. package/scripts/benchmark-work-efficiency.ts +0 -334
  586. package/scripts/build-controller-ui.ts +0 -28
  587. package/scripts/check-npm-release.sh +0 -32
  588. package/scripts/check-public-release-surface.sh +0 -19
  589. package/scripts/check-release-published.sh +0 -57
  590. package/scripts/check-release-readiness.sh +0 -37
  591. package/scripts/check-release-version.mjs +0 -74
  592. package/scripts/check-skill-version.ts +0 -5
  593. package/scripts/check-tarball-install-smoke.sh +0 -150
  594. package/scripts/ensure-codegraph.sh +0 -16
  595. package/scripts/package-source-archive.sh +0 -147
  596. package/scripts/public-release-files.txt +0 -39
  597. package/scripts/public-release.ts +0 -174
  598. package/scripts/publish-release-tarball.sh +0 -27
  599. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  600. package/scripts/run-skill-hook.ts +0 -244
  601. package/scripts/stage-runtime-release.ts +0 -44
  602. package/scripts/sync-codex-installed-copies.sh +0 -182
  603. package/src/cli/commands/tools.ts +0 -167
  604. package/src/cli/controller/progress.ts +0 -656
  605. package/src/cli/controller/work-mode.ts +0 -181
  606. package/src/cli/local-bridge/console-assets.ts +0 -17
  607. package/src/cli/local-bridge/dashboard.ts +0 -17
  608. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  609. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  610. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  611. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  612. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  613. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  614. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  615. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  616. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  617. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  618. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  619. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  620. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  621. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  622. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  623. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  624. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  625. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  626. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  627. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  628. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  629. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  630. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  631. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  632. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  633. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  634. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  635. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  636. package/src/cli/mcp/access-mode.ts +0 -2
  637. package/src/cli/mcp/access-tools.ts +0 -2
  638. package/src/cli/mcp/audit.ts +0 -2
  639. package/src/cli/mcp/auth.ts +0 -2
  640. package/src/cli/mcp/instructions.ts +0 -2
  641. package/src/cli/mcp/legacy-context.ts +0 -2
  642. package/src/cli/mcp/legacy-tool-service.ts +0 -2
  643. package/src/cli/mcp/multi-repository.ts +0 -2
  644. package/src/cli/mcp/oauth.ts +0 -2
  645. package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
  646. package/src/cli/mcp/paths.ts +0 -2
  647. package/src/cli/mcp/policy.ts +0 -2
  648. package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
  649. package/src/cli/mcp/proxy-env.ts +0 -2
  650. package/src/cli/mcp/readiness-projection.ts +0 -2
  651. package/src/cli/mcp/redaction.ts +0 -2
  652. package/src/cli/mcp/repo.ts +0 -2
  653. package/src/cli/mcp/repository-tools.ts +0 -2
  654. package/src/cli/mcp/server.ts +0 -2
  655. package/src/cli/mcp/setup.ts +0 -2
  656. package/src/cli/mcp/tool-capability-cache.ts +0 -2
  657. package/src/cli/mcp/tool-contract.ts +0 -2
  658. package/src/cli/mcp/tools.ts +0 -2
  659. package/src/cli/mcp/toolset-names.ts +0 -2
  660. package/src/cli/mcp/toolset-selection.ts +0 -2
  661. package/src/cli/mcp/toolset.ts +0 -2
  662. package/src/cli/mcp/transports/http.ts +0 -2
  663. package/src/cli/mcp/transports/session-registry.ts +0 -2
  664. package/src/cli/mcp/transports/stdio.ts +0 -2
  665. package/src/cli/mcp/types.ts +0 -2
  666. package/src/cli/mcp/umbrella-tools.ts +0 -2
  667. package/src/cli/tools/codegraph.ts +0 -695
  668. package/src/core/adoption/helper-wrapper-plan.ts +0 -159
  669. package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
  670. package/src/runtime/context/codegraph-read-provider.ts +0 -611
  671. package/src/runtime/context/codegraph-sidecar.cjs +0 -248
  672. package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
  673. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  674. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  675. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  676. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  677. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  678. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  679. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  680. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  681. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  682. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  683. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  684. package/src/runtime/control-plane/routing/index.ts +0 -1
  685. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  686. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
  687. package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
  688. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
  689. package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
  690. package/src/runtime/gateway/mcp/process-tools.ts +0 -2
  691. package/src/runtime/gateway/mcp/router.ts +0 -2
  692. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
  693. package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
  694. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
  695. package/src/runtime/plugins/browser-provider-registry.ts +0 -2
@@ -1,13 +1,16 @@
1
1
  import { createHash } from 'crypto';
2
2
  import { closeSync, existsSync, openSync, readSync, realpathSync, statSync } from 'fs';
3
- import { join, resolve } from 'path';
3
+ import { dirname, join, resolve } from 'path';
4
4
  import { spawnSync } from 'child_process';
5
5
  import { listRepositories, selectRepositoryCheckout } from '../../cli/repositories/registry';
6
+ import { repositoryControllerRoot } from '../../cli/repositories/controller-home';
6
7
  import { withControllerLock } from '../../cli/repositories/locks';
7
8
  import type { RepositoryRecord } from '../../cli/repositories/types';
8
9
  import { loadRuntimeReleaseManifest } from '../root/release-manifest';
9
- import { appendWorkEvidence, getWorkContract, listWorkContracts } from '../../../packages/kernel/work/api/index';
10
- import { routeWorkStart } from '../control-plane/facade/goal-workloop';
10
+ import { readRuntimeReleaseAuthority } from '../root/release-store';
11
+ import { appendRuntimeEvent, type RuntimeEntityEvent } from '../evidence/event-ledger';
12
+ import { listReleaseSessions } from '../release/release-session';
13
+ import { appendWorkEvidence, createWorkSemanticContext, getWorkContract, listWorkContracts } from '../../../packages/kernel/work/api/index';
11
14
  import { createWorkContinuationSchedule } from '../workflow/schedules/work-continuation';
12
15
  import { touchSchedulerWakeSignal } from '../control-plane/global-scheduler/wake-signal';
13
16
  import { recentMcpIncidents, type McpIncident } from './mcp-timing';
@@ -16,7 +19,7 @@ const RECURRENCE_WINDOW_MS = 30 * 60_000;
16
19
  const RECURRENCE_THRESHOLD = 3;
17
20
  const INCIDENT_TAIL_BYTES = 256 * 1024;
18
21
  const INCIDENT_WORK_PREFIX = 'forge-incident-repair';
19
- const TERMINAL_WORK_STATUSES = new Set(['completed', 'failed', 'cancelled']);
22
+ const ACTIONABLE_FAILURE_EVENT = 'forge_actionable_failure_observed';
20
23
 
21
24
  export interface ForgeIncidentRepairClassification {
22
25
  eligible: boolean;
@@ -38,6 +41,16 @@ export interface ForgeIncidentRepairRegistration {
38
41
  reason: string;
39
42
  }
40
43
 
44
+ export interface ForgeActionableFailureObservation {
45
+ observationId: string;
46
+ source: 'progression' | 'release' | 'maintenance';
47
+ code: string;
48
+ message: string;
49
+ at?: string;
50
+ repoId?: string;
51
+ workId?: string;
52
+ }
53
+
41
54
  interface PersistedMcpIncident extends McpIncident {
42
55
  schemaVersion?: number;
43
56
  at?: string;
@@ -57,6 +70,13 @@ function transportFailureMessage(message: string): boolean {
57
70
  export function classifyForgeIncidentForRepair(incident: McpIncident): ForgeIncidentRepairClassification {
58
71
  const code = incident.code.trim().toUpperCase();
59
72
  if (!code) return { eligible: false, reason: 'incident code is empty' };
73
+ // Browser diagnostics on the native Apple Events provider are intentionally
74
+ // unsupported and already fail closed at the plugin boundary. Repeating that
75
+ // expected capability limitation is not evidence of a Forge infrastructure
76
+ // defect and must not manufacture recurrent repair Work.
77
+ if (code === 'PLUGIN_BROWSER_DIAGNOSTICS_UNAVAILABLE') {
78
+ return { eligible: false, reason: `expected provider capability limitation ${code}` };
79
+ }
60
80
 
61
81
  const rootCode = (() => {
62
82
  if (code === 'MCP_REQUEST_EXCEPTION' && transportFailureMessage(incident.message)) return 'MCP_TRANSPORT_UNAVAILABLE';
@@ -80,13 +100,12 @@ function incidentAuditPath(controllerHome: string): string {
80
100
  return join(resolve(controllerHome), 'audit', 'mcp-incidents.jsonl');
81
101
  }
82
102
 
83
- function readBoundedIncidentTail(controllerHome: string): PersistedMcpIncident[] {
84
- const path = incidentAuditPath(controllerHome);
103
+ function readBoundedJsonLines<T>(path: string, maxBytes = INCIDENT_TAIL_BYTES): T[] {
85
104
  if (!existsSync(path)) return [];
86
105
  let fd: number | undefined;
87
106
  try {
88
107
  const size = statSync(path).size;
89
- const length = Math.min(size, INCIDENT_TAIL_BYTES);
108
+ const length = Math.min(size, maxBytes);
90
109
  const start = Math.max(0, size - length);
91
110
  const buffer = Buffer.alloc(length);
92
111
  fd = openSync(path, 'r');
@@ -98,7 +117,7 @@ function readBoundedIncidentTail(controllerHome: string): PersistedMcpIncident[]
98
117
  }
99
118
  return text.split(/\r?\n/).filter(Boolean).flatMap((line) => {
100
119
  try {
101
- const parsed = JSON.parse(line) as PersistedMcpIncident;
120
+ const parsed = JSON.parse(line) as T;
102
121
  return parsed && typeof parsed === 'object' ? [parsed] : [];
103
122
  } catch {
104
123
  return [];
@@ -111,6 +130,10 @@ function readBoundedIncidentTail(controllerHome: string): PersistedMcpIncident[]
111
130
  }
112
131
  }
113
132
 
133
+ function readBoundedIncidentTail(controllerHome: string): PersistedMcpIncident[] {
134
+ return readBoundedJsonLines<PersistedMcpIncident>(incidentAuditPath(controllerHome));
135
+ }
136
+
114
137
  function recentRootIncidents(
115
138
  controllerHome: string,
116
139
  classification: ForgeIncidentRepairClassification,
@@ -128,15 +151,108 @@ function recentRootIncidents(
128
151
  return [...unique.values()];
129
152
  }
130
153
 
131
- function gitContainsCommit(root: string, commit: string): boolean {
132
- const exists = spawnSync('git', ['-C', root, 'cat-file', '-e', `${commit}^{commit}`], {
133
- encoding: 'utf8', stdio: ['ignore', 'ignore', 'ignore'], timeout: 10_000,
134
- });
135
- if (exists.status !== 0) return false;
136
- const ancestor = spawnSync('git', ['-C', root, 'merge-base', '--is-ancestor', commit, 'HEAD'], {
137
- encoding: 'utf8', stdio: ['ignore', 'ignore', 'ignore'], timeout: 10_000,
138
- });
139
- return ancestor.status === 0;
154
+ function actionableFailureLedgerPath(controllerHome: string, repoId: string): string {
155
+ return join(repositoryControllerRoot(controllerHome, repoId), 'events', 'ledger.jsonl');
156
+ }
157
+
158
+ function readActionableFailureEvents(controllerHome: string, repoId: string): RuntimeEntityEvent[] {
159
+ return readBoundedJsonLines<RuntimeEntityEvent>(actionableFailureLedgerPath(controllerHome, repoId))
160
+ .filter((event) => event.eventType === ACTIONABLE_FAILURE_EVENT && event.entityType === 'portfolio');
161
+ }
162
+
163
+ function normalizedFailureMessage(message: string): string {
164
+ return message.toUpperCase()
165
+ .replace(/[A-F0-9]{16,64}/g, '<ID>')
166
+ .replace(/\b\d{2,}\b/g, '<N>')
167
+ .replace(/\s+/g, ' ')
168
+ .trim()
169
+ .slice(0, 500);
170
+ }
171
+
172
+ export function deriveForgeActionableFailureCode(prefix: string, message: string): string {
173
+ const normalizedPrefix = prefix.toUpperCase().replace(/[^A-Z0-9_]+/g, '_').replace(/^_+|_+$/g, '') || 'FORGE_FAILURE';
174
+ const normalizedMessage = normalizedFailureMessage(message);
175
+ const explicit = normalizedMessage.match(/\b(?:[A-Z][A-Z0-9]*_){1,}[A-Z0-9_]+\b/)?.[0];
176
+ if (explicit) return explicit.slice(0, 120);
177
+ const digest = createHash('sha256').update(normalizedMessage || normalizedPrefix).digest('hex').slice(0, 12).toUpperCase();
178
+ return `${normalizedPrefix}_${digest}`.slice(0, 120);
179
+ }
180
+
181
+ export function classifyForgeActionableFailureForRepair(observation: ForgeActionableFailureObservation): ForgeIncidentRepairClassification {
182
+ const code = observation.code.trim().toUpperCase();
183
+ if (!code) return { eligible: false, reason: 'actionable failure code is empty' };
184
+ const blockerText = `${code} ${observation.message}`.toUpperCase();
185
+ if (
186
+ blockerText.includes('EXTERNAL_EFFECT_AUTHORIZATION_REQUIRED')
187
+ || blockerText.includes('PLUGIN_BROWSER_JAVASCRIPT_PERMISSION_REQUIRED')
188
+ || blockerText.includes('LOGIN_REQUIRED')
189
+ || blockerText.includes('PERMISSION_REQUIRED')
190
+ || blockerText.includes('CONSENT_REQUIRED')
191
+ || blockerText.includes('WAITING_FOR_USER')
192
+ || blockerText.includes('USER_ACTION_REQUIRED')
193
+ || blockerText.includes('OUTCOME_UNKNOWN')
194
+ ) return { eligible: false, reason: `explicit user/ambiguity blocker ${code}` };
195
+
196
+ const rootCode = (
197
+ code.startsWith('CONTROLLER_')
198
+ || code.startsWith('SCHEDULER_')
199
+ || code.startsWith('WORKFLOW_SUPERVISOR_')
200
+ || code.startsWith('RUNTIME_')
201
+ || code.startsWith('RECOVERY_')
202
+ || code.startsWith('PROCESS_')
203
+ || code.startsWith('RELEASE_SESSION_')
204
+ || code.startsWith('MAINTENANCE_')
205
+ || /^PLUGIN_[A-Z0-9_]+_(?:UNAVAILABLE|MISSING|MISMATCH|FAILED)$/.test(code)
206
+ ) ? code : undefined;
207
+ if (!rootCode) return { eligible: false, reason: `non-infrastructure actionable failure class ${code}` };
208
+ const fingerprint = createHash('sha256').update(`forge-infrastructure:${rootCode}`).digest('hex').slice(0, 24);
209
+ return { eligible: true, rootCode, fingerprint, reason: `eligible Forge infrastructure root ${rootCode}` };
210
+ }
211
+
212
+ function activeRuntimeSourceRoot(controllerHome: string): string | undefined {
213
+ const authority = readRuntimeReleaseAuthority(controllerHome);
214
+ return authority?.active.manifestPath ? dirname(authority.active.manifestPath) : undefined;
215
+ }
216
+
217
+ function recentActionableRootEvents(
218
+ controllerHome: string,
219
+ repoId: string,
220
+ classification: ForgeIncidentRepairClassification,
221
+ nowMs: number,
222
+ ): RuntimeEntityEvent[] {
223
+ if (!classification.eligible || !classification.rootCode) return [];
224
+ const unique = new Map<string, RuntimeEntityEvent>();
225
+ for (const event of readActionableFailureEvents(controllerHome, repoId)) {
226
+ const data = event.data ?? {};
227
+ const rootCode = typeof data.rootCode === 'string' ? data.rootCode : '';
228
+ const observationId = typeof data.observationId === 'string' ? data.observationId : '';
229
+ const observedAt = typeof data.observedAt === 'string' ? data.observedAt : event.occurredAt;
230
+ const at = Date.parse(observedAt);
231
+ if (rootCode !== classification.rootCode || !observationId) continue;
232
+ if (!Number.isFinite(at) || at < nowMs - RECURRENCE_WINDOW_MS || at > nowMs + 60_000) continue;
233
+ unique.set(observationId, event);
234
+ }
235
+ return [...unique.values()].sort((left, right) => left.occurredAt.localeCompare(right.occurredAt));
236
+ }
237
+
238
+ function actionableEvidence(event: RuntimeEntityEvent, rootCode: string, ordinal: number) {
239
+ const data = event.data ?? {};
240
+ const observationId = typeof data.observationId === 'string' ? data.observationId : event.eventId;
241
+ const source = typeof data.source === 'string' ? data.source : 'unknown';
242
+ const affectedRepo = typeof data.affectedRepoId === 'string' ? data.affectedRepoId : undefined;
243
+ const workId = typeof data.workId === 'string' ? data.workId : undefined;
244
+ return {
245
+ evidenceId: `FAILOBS-${createHash('sha256').update(observationId).digest('hex').slice(0, 24)}`,
246
+ title: `recurrent Forge failure ${rootCode}`,
247
+ summary: [
248
+ `Occurrence ${ordinal} for ${rootCode}.`,
249
+ `source=${source}`,
250
+ ...(affectedRepo ? [`affectedRepo=${affectedRepo}`] : []),
251
+ ...(workId ? [`work=${workId}`] : []),
252
+ `observation=${observationId}`,
253
+ ].join(' ').slice(0, 1_000),
254
+ detailLevel: 'summary' as const,
255
+ };
140
256
  }
141
257
 
142
258
  function gitHead(root: string): string | undefined {
@@ -154,8 +270,10 @@ function samePath(left: string, right: string): boolean {
154
270
  /**
155
271
  * Resolve the registered Forge source authority. A user/business repository
156
272
  * affected by a Runtime defect is never treated as the repair repository.
157
- * Source-mode Runtime uses exact checkout path identity; immutable/package mode
158
- * must prove its release sourceCommit exists in exactly one enabled repo.
273
+ * Source-mode Runtime uses exact checkout path identity. Immutable/package mode
274
+ * uses the release manifest's sourceRepositoryId, which is minted by the staged
275
+ * release contract. Scheduler/incident reconciliation must not rediscover that
276
+ * identity by synchronously walking Git history across registered repositories.
159
277
  */
160
278
  export function resolveRuntimeSourceRepairRepository(
161
279
  controllerHome: string,
@@ -172,19 +290,16 @@ export function resolveRuntimeSourceRepairRepository(
172
290
 
173
291
  const manifestPath = join(resolve(root), 'manifest.json');
174
292
  if (!existsSync(manifestPath)) return undefined;
175
- let sourceCommit: string | undefined;
293
+ let sourceRepositoryId: string | undefined;
176
294
  try {
177
- sourceCommit = loadRuntimeReleaseManifest(manifestPath, controllerHome).sourceCommit;
295
+ sourceRepositoryId = loadRuntimeReleaseManifest(manifestPath, controllerHome).sourceRepositoryId?.trim();
178
296
  } catch {
179
297
  return undefined;
180
298
  }
181
- if (!sourceCommit || !/^[a-f0-9]{40}$/i.test(sourceCommit)) return undefined;
182
- const containing = repositories.filter((repository) => {
183
- const selected = selectRepositoryCheckout(repository, repository.activeCheckoutId);
184
- return gitContainsCommit(selected.canonicalRoot, sourceCommit!);
185
- });
186
- if (containing.length !== 1) return undefined;
187
- return selectRepositoryCheckout(containing[0]!, containing[0]!.activeCheckoutId);
299
+ if (!sourceRepositoryId) return undefined;
300
+ const sourceRepository = repositories.find((repository) => repository.repoId === sourceRepositoryId);
301
+ if (!sourceRepository) return undefined;
302
+ return selectRepositoryCheckout(sourceRepository, sourceRepository.activeCheckoutId);
188
303
  }
189
304
 
190
305
  function requestBase(fingerprint: string): string {
@@ -242,42 +357,39 @@ function ensureAutomaticContinuation(
242
357
  }
243
358
  }
244
359
 
245
- /**
246
- * Promote only recurrent, source-authority-proven Forge infrastructure incidents
247
- * into canonical primary Work. The JSONL incident log remains evidence only;
248
- * WorkContract + existing continuation Schedule are the sole durable authorities.
249
- */
250
- export function maybeRegisterMcpIncidentRepair(input: {
360
+ interface RepairEvidenceRef {
361
+ evidenceId?: string;
362
+ title: string;
363
+ summary: string;
364
+ detailLevel: 'summary';
365
+ }
366
+
367
+ function registerRecurringForgeRepair(input: {
251
368
  controllerHome: string;
252
369
  runtimeSourceRoot?: string;
253
- incident: McpIncident;
254
- now?: () => number;
370
+ classification: ForgeIncidentRepairClassification;
371
+ occurrenceCount: number;
372
+ evidence: RepairEvidenceRef[];
373
+ repairRepository?: RepositoryRecord;
255
374
  }): ForgeIncidentRepairRegistration {
256
- const classification = classifyForgeIncidentForRepair(input.incident);
375
+ const { classification } = input;
257
376
  if (!classification.eligible || !classification.fingerprint || !classification.rootCode) {
258
377
  return { eligible: false, recurrent: false, occurrenceCount: 0, reason: classification.reason };
259
378
  }
260
- const nowMs = input.now?.() ?? Date.now();
261
- const occurrences = recentRootIncidents(input.controllerHome, classification, nowMs);
262
- if (occurrences.length < RECURRENCE_THRESHOLD) {
379
+ if (input.occurrenceCount < RECURRENCE_THRESHOLD) {
263
380
  return {
264
- eligible: true,
265
- recurrent: false,
266
- occurrenceCount: occurrences.length,
267
- fingerprint: classification.fingerprint,
268
- rootCode: classification.rootCode,
381
+ eligible: true, recurrent: false, occurrenceCount: input.occurrenceCount,
382
+ fingerprint: classification.fingerprint, rootCode: classification.rootCode,
269
383
  reason: `waiting for ${RECURRENCE_THRESHOLD} occurrences within ${RECURRENCE_WINDOW_MS / 60_000} minutes`,
270
384
  };
271
385
  }
272
386
 
273
- const repairRepository = resolveRuntimeSourceRepairRepository(input.controllerHome, input.runtimeSourceRoot);
387
+ const repairRepository = input.repairRepository
388
+ ?? resolveRuntimeSourceRepairRepository(input.controllerHome, input.runtimeSourceRoot);
274
389
  if (!repairRepository) {
275
390
  return {
276
- eligible: true,
277
- recurrent: true,
278
- occurrenceCount: occurrences.length,
279
- fingerprint: classification.fingerprint,
280
- rootCode: classification.rootCode,
391
+ eligible: true, recurrent: true, occurrenceCount: input.occurrenceCount,
392
+ fingerprint: classification.fingerprint, rootCode: classification.rootCode,
281
393
  reason: 'runtime source authority could not be mapped unambiguously to one registered repository',
282
394
  };
283
395
  }
@@ -286,28 +398,23 @@ export function maybeRegisterMcpIncidentRepair(input: {
286
398
  const lockResource = `incident-repair-${classification.fingerprint}`;
287
399
  return withControllerLock(input.controllerHome, { scope: 'global', resource: lockResource }, lockResource, () => {
288
400
  const store = { controllerHome: input.controllerHome, repoId: repairRepository.repoId };
289
- const matching = listWorkContracts({ ...store, status: 'all', limit: 500 })
401
+ const matching = listWorkContracts({ ...store, state: 'all', limit: 500 })
290
402
  .filter((work) => requestGeneration(work.requestId, base) !== undefined)
291
403
  .sort((left, right) => (requestGeneration(left.requestId, base) ?? 0) - (requestGeneration(right.requestId, base) ?? 0));
292
- const active = [...matching].reverse().find((work) => !TERMINAL_WORK_STATUSES.has(work.status));
293
- const recentEvidence = occurrences.slice(-RECURRENCE_THRESHOLD);
404
+ const active = [...matching].reverse().find((work) => work.semanticState === 'open');
405
+ const recentEvidence = input.evidence.slice(-RECURRENCE_THRESHOLD);
406
+
294
407
  if (active) {
295
- for (const [index, occurrence] of recentEvidence.entries()) {
296
- if (active.evidenceRefs.some((entry) => entry.evidenceId === `MCPINC-${occurrence.traceId}`)) continue;
297
- appendWorkEvidence(store, active.workId, incidentEvidence(occurrence, classification.rootCode!, occurrences.length - recentEvidence.length + index + 1));
408
+ for (const evidence of recentEvidence) {
409
+ if (evidence.evidenceId && active.evidenceRefs.some((entry) => entry.evidenceId === evidence.evidenceId)) continue;
410
+ appendWorkEvidence(store, active.workId, evidence);
298
411
  }
299
412
  const scheduleId = ensureAutomaticContinuation(input.controllerHome, repairRepository.repoId, active.workId, classification.rootCode!);
300
413
  return {
301
- eligible: true,
302
- recurrent: true,
303
- occurrenceCount: occurrences.length,
304
- fingerprint: classification.fingerprint,
305
- rootCode: classification.rootCode,
306
- repairRepoId: repairRepository.repoId,
307
- workId: active.workId,
308
- reusedExistingWork: true,
309
- scheduleId,
310
- reason: 'reused active canonical incident-repair Work',
414
+ eligible: true, recurrent: true, occurrenceCount: input.occurrenceCount,
415
+ fingerprint: classification.fingerprint, rootCode: classification.rootCode,
416
+ repairRepoId: repairRepository.repoId, workId: active.workId, reusedExistingWork: true,
417
+ scheduleId, reason: 'reused active canonical incident-repair Work',
311
418
  };
312
419
  }
313
420
 
@@ -315,92 +422,152 @@ export function maybeRegisterMcpIncidentRepair(input: {
315
422
  const generation = (predecessor ? (requestGeneration(predecessor.requestId, base) ?? 0) : 0) + 1;
316
423
  const requestId = `${base}:g${generation}`;
317
424
  const head = gitHead(repairRepository.canonicalRoot);
318
- if (!head) {
425
+ if (!head) return {
426
+ eligible: true, recurrent: true, occurrenceCount: input.occurrenceCount,
427
+ fingerprint: classification.fingerprint, rootCode: classification.rootCode,
428
+ repairRepoId: repairRepository.repoId, reason: 'repair repository HEAD could not be proven',
429
+ };
430
+
431
+ try {
432
+ createWorkSemanticContext(store, {
433
+ workId: `work-incident-${classification.fingerprint}-g${generation}`,
434
+ objective: `Repair recurrent Forge infrastructure incident ${classification.rootCode} automatically registered after ${input.occurrenceCount} occurrences within ${RECURRENCE_WINDOW_MS / 60_000} minutes.`,
435
+ requestId,
436
+ requestedBy: 'system',
437
+ });
438
+ } catch (error) {
319
439
  return {
320
- eligible: true,
321
- recurrent: true,
322
- occurrenceCount: occurrences.length,
323
- fingerprint: classification.fingerprint,
324
- rootCode: classification.rootCode,
440
+ eligible: true, recurrent: true, occurrenceCount: input.occurrenceCount,
441
+ fingerprint: classification.fingerprint, rootCode: classification.rootCode,
325
442
  repairRepoId: repairRepository.repoId,
326
- reason: 'repair repository HEAD could not be proven',
443
+ reason: `semantic Work creation failed: ${error instanceof Error ? error.message : String(error)}`,
327
444
  };
328
445
  }
329
- const routed = routeWorkStart({
330
- workStore: store,
331
- handoffStore: store,
332
- repoId: repairRepository.repoId,
333
- sourceRevision: head,
334
- checkoutId: repairRepository.activeCheckoutId,
335
- }, {
336
- objective: `Repair recurrent Forge infrastructure incident ${classification.rootCode} automatically registered after ${occurrences.length} occurrences within ${RECURRENCE_WINDOW_MS / 60_000} minutes.`,
337
- acceptanceCriteria: [
338
- `Reproduce and eliminate root incident ${classification.rootCode} without bypassing canonical Runtime/Recovery/Controller authority.`,
339
- 'Preserve fail-closed behavior for expected policy, ownership, user-code, and approval failures.',
340
- 'Run focused affected checks and live verification before terminalizing the Work.',
341
- ],
342
- allowedPaths: ['src/**', 'tests/**', 'scripts/**', 'package.json'],
343
- initialLikelyPaths: [],
344
- forbiddenPaths: ['node_modules/**', '_ops/**'],
345
- constraints: { workspaceMode: 'auto', requireHandoffOnAmbiguity: true },
346
- modeInput: {
347
- scopeClear: false,
348
- mutation: true,
349
- requiresInvestigation: true,
350
- requiresRecovery: true,
351
- risk: 'workspace_write',
352
- },
353
- requestedBy: 'system',
354
- requestId,
355
- relatedWorkId: predecessor?.workId,
356
- workRelation: 'new_goal',
357
- workKind: 'repository_change',
446
+
447
+ const created = listWorkContracts({ ...store, state: 'all', limit: 500 }).find((work) => work.requestId === requestId);
448
+ if (!created) return {
449
+ eligible: true, recurrent: true, occurrenceCount: input.occurrenceCount,
450
+ fingerprint: classification.fingerprint, rootCode: classification.rootCode,
451
+ repairRepoId: repairRepository.repoId,
452
+ reason: 'canonical Work admission succeeded without a request-bound readable Work',
453
+ };
454
+
455
+ if (predecessor) appendWorkEvidence(store, created.workId, {
456
+ title: 'incident repair predecessor',
457
+ summary: `Recurrent root ${classification.rootCode} created successor generation ${generation} after terminal Work ${predecessor.workId} (${predecessor.semanticState}).`,
458
+ detailLevel: 'summary',
358
459
  });
359
- if (routed.status !== 'ok') {
360
- return {
361
- eligible: true,
362
- recurrent: true,
363
- occurrenceCount: occurrences.length,
364
- fingerprint: classification.fingerprint,
365
- rootCode: classification.rootCode,
366
- repairRepoId: repairRepository.repoId,
367
- reason: `canonical Work admission did not create repair Work: ${routed.summary}`,
368
- };
369
- }
370
- const created = listWorkContracts({ ...store, status: 'all', limit: 500 }).find((work) => work.requestId === requestId);
371
- if (!created) {
372
- return {
373
- eligible: true,
374
- recurrent: true,
375
- occurrenceCount: occurrences.length,
376
- fingerprint: classification.fingerprint,
377
- rootCode: classification.rootCode,
378
- repairRepoId: repairRepository.repoId,
379
- reason: 'canonical Work admission succeeded without a request-bound readable Work',
380
- };
381
- }
382
- if (predecessor) {
383
- appendWorkEvidence(store, created.workId, {
384
- title: 'incident repair predecessor',
385
- summary: `Recurrent root ${classification.rootCode} created successor generation ${generation} after terminal Work ${predecessor.workId} (${predecessor.status}).`,
386
- detailLevel: 'summary',
387
- });
388
- }
389
- for (const [index, occurrence] of recentEvidence.entries()) {
390
- appendWorkEvidence(store, created.workId, incidentEvidence(occurrence, classification.rootCode!, occurrences.length - recentEvidence.length + index + 1));
391
- }
460
+ for (const evidence of recentEvidence) appendWorkEvidence(store, created.workId, evidence);
392
461
  const scheduleId = ensureAutomaticContinuation(input.controllerHome, repairRepository.repoId, created.workId, classification.rootCode!);
393
462
  return {
394
- eligible: true,
395
- recurrent: true,
396
- occurrenceCount: occurrences.length,
397
- fingerprint: classification.fingerprint,
398
- rootCode: classification.rootCode,
399
- repairRepoId: repairRepository.repoId,
400
- workId: created.workId,
401
- reusedExistingWork: false,
402
- scheduleId,
403
- reason: 'created canonical recurrent-incident repair Work',
463
+ eligible: true, recurrent: true, occurrenceCount: input.occurrenceCount,
464
+ fingerprint: classification.fingerprint, rootCode: classification.rootCode,
465
+ repairRepoId: repairRepository.repoId, workId: created.workId, reusedExistingWork: false,
466
+ scheduleId, reason: 'created canonical recurrent-incident repair Work',
404
467
  };
405
468
  }, 10_000);
406
469
  }
470
+
471
+ export function maybeRegisterMcpIncidentRepair(input: {
472
+ controllerHome: string;
473
+ runtimeSourceRoot?: string;
474
+ incident: McpIncident;
475
+ now?: () => number;
476
+ }): ForgeIncidentRepairRegistration {
477
+ const classification = classifyForgeIncidentForRepair(input.incident);
478
+ if (!classification.eligible || !classification.fingerprint || !classification.rootCode) {
479
+ return { eligible: false, recurrent: false, occurrenceCount: 0, reason: classification.reason };
480
+ }
481
+ const occurrences = recentRootIncidents(input.controllerHome, classification, input.now?.() ?? Date.now());
482
+ return registerRecurringForgeRepair({
483
+ controllerHome: input.controllerHome,
484
+ runtimeSourceRoot: input.runtimeSourceRoot,
485
+ classification,
486
+ occurrenceCount: occurrences.length,
487
+ evidence: occurrences.map((incident, index) => incidentEvidence(incident, classification.rootCode!, index + 1)),
488
+ });
489
+ }
490
+
491
+ export function maybeRegisterForgeActionableFailureRepair(input: {
492
+ controllerHome: string;
493
+ runtimeSourceRoot?: string;
494
+ observation: ForgeActionableFailureObservation;
495
+ now?: () => number;
496
+ }): ForgeIncidentRepairRegistration {
497
+ const classification = classifyForgeActionableFailureForRepair(input.observation);
498
+ if (!classification.eligible || !classification.fingerprint || !classification.rootCode) {
499
+ return { eligible: false, recurrent: false, occurrenceCount: 0, reason: classification.reason };
500
+ }
501
+
502
+ const runtimeSourceRoot = input.runtimeSourceRoot ?? activeRuntimeSourceRoot(input.controllerHome);
503
+ const repairRepository = resolveRuntimeSourceRepairRepository(input.controllerHome, runtimeSourceRoot);
504
+ if (!repairRepository) return {
505
+ eligible: true, recurrent: false, occurrenceCount: 0,
506
+ fingerprint: classification.fingerprint, rootCode: classification.rootCode,
507
+ reason: 'runtime source authority could not be mapped unambiguously to one registered repository',
508
+ };
509
+
510
+ const nowMs = input.now?.() ?? Date.now();
511
+ const observedAt = input.observation.at?.trim() || new Date(nowMs).toISOString();
512
+ const existing = readActionableFailureEvents(input.controllerHome, repairRepository.repoId);
513
+ if (!existing.some((event) => event.data?.observationId === input.observation.observationId)) {
514
+ appendRuntimeEvent(input.controllerHome, {
515
+ repoId: repairRepository.repoId,
516
+ entityType: 'portfolio',
517
+ entityId: `forge-failure:${classification.fingerprint}`,
518
+ eventType: ACTIONABLE_FAILURE_EVENT,
519
+ requestId: `forge-actionable-failure:${input.observation.observationId}`,
520
+ revision: 1,
521
+ data: {
522
+ observationId: input.observation.observationId,
523
+ source: input.observation.source,
524
+ rootCode: classification.rootCode,
525
+ message: input.observation.message.slice(0, 2_000),
526
+ observedAt,
527
+ ...(input.observation.repoId ? { affectedRepoId: input.observation.repoId } : {}),
528
+ ...(input.observation.workId ? { workId: input.observation.workId } : {}),
529
+ },
530
+ });
531
+ }
532
+
533
+ const occurrences = recentActionableRootEvents(input.controllerHome, repairRepository.repoId, classification, nowMs);
534
+ return registerRecurringForgeRepair({
535
+ controllerHome: input.controllerHome,
536
+ runtimeSourceRoot,
537
+ repairRepository,
538
+ classification,
539
+ occurrenceCount: occurrences.length,
540
+ evidence: occurrences.map((event, index) => actionableEvidence(event, classification.rootCode!, index + 1)),
541
+ });
542
+ }
543
+
544
+ export function maybeRegisterFailedReleaseSessionRepairs(input: {
545
+ controllerHome: string;
546
+ runtimeSourceRoot?: string;
547
+ now?: () => number;
548
+ }): ForgeIncidentRepairRegistration[] {
549
+ return listReleaseSessions(input.controllerHome, { maxEntries: 128 }).sessions
550
+ .filter((session) => session.phase === 'failed')
551
+ .slice(-32)
552
+ .map((session) => {
553
+ const lastReceipt = session.receipts.at(-1);
554
+ const message = lastReceipt?.summary?.trim()
555
+ || `ReleaseSession ${session.sessionId} entered failed phase without a diagnostic receipt.`;
556
+ return maybeRegisterForgeActionableFailureRepair({
557
+ controllerHome: input.controllerHome,
558
+ runtimeSourceRoot: input.runtimeSourceRoot,
559
+ now: input.now,
560
+ observation: {
561
+ observationId: `release:${session.sessionId}:r${session.revision}`,
562
+ source: 'release',
563
+ code: deriveForgeActionableFailureCode(
564
+ `RELEASE_SESSION_${(lastReceipt?.kind ?? 'UNKNOWN').toUpperCase()}_FAILED`,
565
+ message,
566
+ ),
567
+ message,
568
+ at: session.updatedAt,
569
+ repoId: session.candidateRelease?.sourceRepositoryId,
570
+ },
571
+ });
572
+ });
573
+ }