@moretea-labs/forge 1.7.2 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (900) hide show
  1. package/AGENTS.md +121 -62
  2. package/CHANGELOG.md +40 -0
  3. package/CLAUDE.md +57 -62
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.md +2 -2
  6. package/SKILL.md +0 -1
  7. package/THIRD_PARTY_NOTICES.md +5 -2
  8. package/adapters/browser/index.ts +2 -0
  9. package/adapters/chatgpt/browser-delivery-host.ts +77 -0
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +1256 -0
  11. package/adapters/chatgpt/controller-binding-store.ts +134 -0
  12. package/adapters/chatgpt/controller-round-host.ts +68 -0
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +99 -0
  14. package/adapters/chatgpt/provider-delivery.ts +340 -0
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +218 -0
  16. package/adapters/chatgpt/wsl-bridge-delivery-host.ts +63 -0
  17. package/adapters/computer/chatgpt-extension-target.ts +463 -0
  18. package/adapters/computer/chatgpt-target-router.ts +103 -0
  19. package/adapters/computer/chrome-extension/background.js +385 -0
  20. package/adapters/computer/chrome-extension/content.js +378 -0
  21. package/adapters/computer/chrome-extension/core.js +24 -0
  22. package/adapters/computer/chrome-extension/manifest.json +30 -0
  23. package/adapters/computer/desktop-operator-contract.ts +7 -0
  24. package/adapters/computer/desktop-operator-discovery.ts +181 -0
  25. package/adapters/computer/desktop-operator-negotiation.ts +174 -0
  26. package/adapters/computer/desktop-operator-provider.ts +312 -0
  27. package/adapters/computer/index.ts +1 -0
  28. package/adapters/computer/interaction-target-authority.ts +1068 -0
  29. package/adapters/controller-process/binding-store.ts +34 -0
  30. package/adapters/controller-process/controller-host.ts +26 -0
  31. package/adapters/mcp/access-mode.ts +132 -0
  32. package/adapters/mcp/audit.ts +32 -0
  33. package/adapters/mcp/auth.ts +406 -0
  34. package/adapters/mcp/instructions.ts +37 -0
  35. package/adapters/mcp/legacy-context.ts +18 -0
  36. package/adapters/mcp/multi-repository.ts +421 -0
  37. package/adapters/mcp/oauth.ts +464 -0
  38. package/adapters/mcp/paths.ts +143 -0
  39. package/adapters/mcp/policy.ts +232 -0
  40. package/adapters/mcp/proxy-env.ts +62 -0
  41. package/adapters/mcp/readiness-projection.ts +24 -0
  42. package/adapters/mcp/redaction.ts +21 -0
  43. package/adapters/mcp/repo.ts +24 -0
  44. package/adapters/mcp/runtime-gateway/artifact-adapter.ts +52 -0
  45. package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +87 -0
  46. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  47. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  48. package/adapters/mcp/runtime-gateway/context-adapter.ts +1167 -0
  49. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -0
  50. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +206 -0
  51. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  52. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +130 -0
  53. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  54. package/adapters/mcp/runtime-gateway/execution-control-adapter.ts +28 -0
  55. package/adapters/mcp/runtime-gateway/execution-tools.ts +173 -0
  56. package/adapters/mcp/runtime-gateway/filesystem-adapter.ts +38 -0
  57. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +412 -0
  58. package/adapters/mcp/runtime-gateway/legacy-ios-tool-adapter.ts +105 -0
  59. package/adapters/mcp/runtime-gateway/maintenance-adapter.ts +44 -0
  60. package/adapters/mcp/runtime-gateway/model-adapter.ts +63 -0
  61. package/adapters/mcp/runtime-gateway/persisted-check-process.ts +3 -0
  62. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +380 -0
  63. package/adapters/mcp/runtime-gateway/process-tools.ts +457 -0
  64. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +88 -0
  65. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +285 -0
  66. package/adapters/mcp/runtime-gateway/recovery-client-adapter.ts +70 -0
  67. package/adapters/mcp/runtime-gateway/recovery-tool-contract.ts +99 -0
  68. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +79 -0
  69. package/adapters/mcp/runtime-gateway/result-adapter.ts +114 -0
  70. package/adapters/mcp/runtime-gateway/router.ts +242 -0
  71. package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
  72. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1200 -0
  73. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  74. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +574 -0
  75. package/adapters/mcp/runtime-gateway/runtime-tool-shared.ts +27 -0
  76. package/adapters/mcp/runtime-gateway/runtime-tools.ts +78 -0
  77. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +187 -0
  78. package/adapters/mcp/runtime-gateway/shared-adapter.ts +45 -0
  79. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +962 -0
  80. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
  81. package/adapters/mcp/runtime-gateway/work-adapter.ts +325 -0
  82. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  83. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  84. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +246 -0
  85. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  86. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  87. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  88. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  89. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  90. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +263 -0
  91. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +1 -0
  92. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  93. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
  94. package/adapters/mcp/server.ts +1092 -0
  95. package/adapters/mcp/setup.ts +789 -0
  96. package/adapters/mcp/tool-capability-cache.ts +87 -0
  97. package/adapters/mcp/tool-mapping/access-tools.ts +387 -0
  98. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +5139 -0
  99. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +145 -0
  100. package/adapters/mcp/tool-mapping/repository-tools.ts +1682 -0
  101. package/adapters/mcp/tool-mapping/tools.ts +9 -0
  102. package/adapters/mcp/tool-mapping/umbrella-tools.ts +117 -0
  103. package/adapters/mcp/toolset-names.ts +79 -0
  104. package/adapters/mcp/toolset-selection.ts +41 -0
  105. package/adapters/mcp/toolset.ts +337 -0
  106. package/adapters/mcp/transports/http-observation.ts +365 -0
  107. package/adapters/mcp/transports/http.ts +933 -0
  108. package/adapters/mcp/transports/oauth-http.ts +322 -0
  109. package/adapters/mcp/transports/session-registry.ts +519 -0
  110. package/adapters/mcp/transports/stdio.ts +8 -0
  111. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +223 -0
  112. package/adapters/mcp/types.ts +41 -0
  113. package/assets/AGENTS.md +2 -16
  114. package/assets/CLAUDE.md +2 -16
  115. package/assets/hooks/AGENTS.md +3 -14
  116. package/assets/hooks/CLAUDE.md +3 -14
  117. package/assets/hooks/hook-input.sh +9 -2
  118. package/assets/hooks/lib/workflow-state.sh +28 -10
  119. package/assets/hooks/prompt-guard.sh +63 -37
  120. package/assets/hooks/security-sentinel.sh +2 -1
  121. package/assets/hooks/session-start-context.sh +7 -5
  122. package/assets/hooks/stop-orchestrator.sh +13 -3
  123. package/assets/initializer-question-pack.v4.json +11 -7
  124. package/assets/partials/05-workflow.partial.md +18 -73
  125. package/assets/partials/07-footer.partial.md +1 -1
  126. package/assets/partials-agents/02-operating-mode.partial.md +1 -2
  127. package/assets/partials-agents/04-task-protocol.partial.md +14 -59
  128. package/assets/partials-agents/06-quality-safety.partial.md +11 -16
  129. package/assets/partials-agents/08-deep-docs.partial.md +1 -2
  130. package/assets/plan-map.json +11 -11
  131. package/assets/plugin-registry.v1.json +11 -3
  132. package/assets/plugin-trust-policy.v1.json +6 -0
  133. package/assets/recovery/ForgeRecovery.ps1 +100 -0
  134. package/assets/recovery/forge-wsl-rescue +271 -0
  135. package/assets/reference-configs/agentic-development-flow.md +25 -0
  136. package/assets/reference-configs/development-protocol.md +11 -15
  137. package/assets/reference-configs/document-generation.md +1 -1
  138. package/assets/reference-configs/global-working-rules.md +28 -1
  139. package/assets/reference-configs/harness-overview.md +22 -112
  140. package/assets/reference-configs/hook-operations.md +1 -1
  141. package/assets/reference-configs/sprint-contracts.md +2 -2
  142. package/assets/skill-version.json +2 -2
  143. package/assets/templates/helpers/architecture-event.ts +3 -34
  144. package/assets/templates/helpers/architecture-queue.sh +61 -10
  145. package/assets/templates/helpers/archive-workflow.sh +90 -180
  146. package/assets/templates/helpers/capability-config.ts +8 -11
  147. package/assets/templates/helpers/capability-resolver.ts +37 -19
  148. package/assets/templates/helpers/capture-plan.sh +2 -2
  149. package/assets/templates/helpers/check-architecture-sync.sh +1 -9
  150. package/assets/templates/helpers/check-task-sync.sh +82 -11
  151. package/assets/templates/helpers/check-task-workflow.sh +1 -3
  152. package/assets/templates/helpers/context-contract-sync.sh +1 -12
  153. package/assets/templates/helpers/contract-worktree.sh +26 -24
  154. package/assets/templates/helpers/ensure-task-workflow.sh +6 -8
  155. package/assets/templates/helpers/inspect-project-state.ts +1 -1
  156. package/assets/templates/helpers/migrate-project-template.sh +1 -1
  157. package/assets/templates/helpers/migrate-workflow-docs.ts +53 -239
  158. package/assets/templates/helpers/new-plan.sh +2 -2
  159. package/assets/templates/helpers/plan-to-todo.sh +3 -31
  160. package/assets/templates/helpers/sprint-backlog.sh +1 -1
  161. package/assets/templates/helpers/switch-plan.sh +1 -1
  162. package/assets/templates/helpers/workflow-contract.ts +1 -0
  163. package/assets/workflow-contract.v1.json +63 -171
  164. package/assets/workflows/xiaohongshu/xiaohongshu.collect-metrics.v1.draft.json +118 -0
  165. package/assets/workflows/xiaohongshu/xiaohongshu.publish-image-note.v1.draft.json +316 -0
  166. package/assets/workflows/xiaohongshu/xiaohongshu.publish-long-text.v1.draft.json +324 -0
  167. package/docs/architecture/CURRENT.md +233 -28
  168. package/docs/architecture/EVOLUTION.md +13 -0
  169. package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +2 -1
  170. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  171. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  172. package/docs/architecture/decisions/20260831-independent-windows-wsl-host-rescue.md +59 -0
  173. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +120 -0
  174. package/docs/architecture/decisions/20260904-repository-runtime-data-boundary.md +42 -0
  175. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +37 -0
  176. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +311 -0
  177. package/docs/architecture/decisions/20260907-maintenance-diagnosis-bounded-read.md +39 -0
  178. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  179. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  180. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +221 -0
  181. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  182. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +72 -0
  183. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +237 -0
  184. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  185. package/docs/architecture/domains/verification.md +8 -0
  186. package/docs/architecture/domains/workflow-engine.md +7 -1
  187. package/docs/architecture/index.md +3 -3
  188. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +19 -8
  189. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +124 -0
  190. package/docs/forge-chatgpt-mcp-setup.md +5 -3
  191. package/docs/forge-plugin-management.md +20 -4
  192. package/docs/forge-runtime-self-healing-loop.md +2 -0
  193. package/docs/operations/benchmark-cross-version-freeze.md +38 -0
  194. package/docs/operations/controller-browser-plugin.md +3 -1
  195. package/docs/operations/controller-performance-and-502.md +17 -0
  196. package/docs/operations/controller-reliability-runbook.md +2 -2
  197. package/docs/operations/features.md +1 -1
  198. package/docs/operations/features.zh-CN.md +1 -1
  199. package/docs/operations/homebrew.md +2 -2
  200. package/docs/operations/mcp-tool-exposure.md +2 -0
  201. package/docs/operations/platform-support.md +16 -8
  202. package/docs/operations/platform-support.zh-CN.md +2 -2
  203. package/docs/operations/releasing.md +2 -0
  204. package/docs/operations/standalone-disaster-recovery.md +38 -5
  205. package/docs/operations/uu-remote-rescue.md +41 -0
  206. package/docs/operations/windows-wsl-host-rescue.md +133 -0
  207. package/docs/public-usage-guide.md +1 -1
  208. package/docs/public-usage-guide.zh-CN.md +1 -1
  209. package/docs/tutorials/01-install-and-start.md +1 -1
  210. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  211. package/docs/tutorials/02-connect-chatgpt.md +4 -4
  212. package/docs/tutorials/02-connect-chatgpt.zh-CN.md +4 -4
  213. package/docs/wiki/Implementation.md +1 -1
  214. package/package.json +46 -26
  215. package/packages/kernel/cognition/api/index.ts +6 -0
  216. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  217. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  218. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  219. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  220. package/packages/kernel/cognition/domain/learning.ts +106 -0
  221. package/packages/kernel/cognition/domain/memory.ts +254 -0
  222. package/packages/kernel/controller/api/index.ts +3 -0
  223. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  224. package/packages/kernel/controller/application/controller-round-service.ts +41 -0
  225. package/packages/kernel/controller/application/controller-service.ts +30 -0
  226. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +529 -0
  227. package/packages/kernel/controller/domain/controller-round.ts +110 -0
  228. package/packages/kernel/controller/domain/execution-quality.ts +135 -0
  229. package/packages/kernel/controller/domain/types.ts +56 -0
  230. package/packages/kernel/controller/index.ts +1 -0
  231. package/packages/kernel/controller/infrastructure/controller-binding-store.ts +84 -0
  232. package/packages/kernel/controller/infrastructure/controller-round-store.ts +1970 -0
  233. package/packages/kernel/controller/infrastructure/controller-session-store.ts +804 -0
  234. package/packages/kernel/controller/ports/controller-host.ts +18 -0
  235. package/packages/kernel/goal/api/index.ts +1 -0
  236. package/packages/kernel/goal/domain/types.ts +40 -0
  237. package/packages/kernel/goal/index.ts +1 -0
  238. package/packages/kernel/identity/api/index.ts +15 -0
  239. package/packages/kernel/identity/application/identity-service.ts +67 -0
  240. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  241. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  242. package/packages/kernel/identity/domain/grant.ts +72 -0
  243. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  244. package/packages/kernel/identity/domain/scope.ts +63 -0
  245. package/packages/kernel/identity/domain/semantic-sync.ts +81 -0
  246. package/packages/kernel/identity/domain/types.ts +44 -0
  247. package/packages/kernel/identity/domain/user-request.ts +93 -0
  248. package/packages/kernel/identity/domain/workspace.ts +56 -0
  249. package/packages/kernel/identity/index.ts +1 -0
  250. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +77 -0
  251. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  252. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  253. package/packages/kernel/identity/infrastructure/identity-store.ts +75 -0
  254. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  255. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  256. package/packages/kernel/memory/api/index.ts +5 -0
  257. package/packages/kernel/memory/application/experience-service.ts +118 -0
  258. package/packages/kernel/memory/application/outcome-service.ts +77 -0
  259. package/packages/kernel/memory/domain/experience.ts +103 -0
  260. package/packages/kernel/memory/domain/operational-prior.ts +92 -0
  261. package/packages/kernel/memory/index.ts +1 -0
  262. package/packages/kernel/scheduler/api/index.ts +4 -0
  263. package/packages/kernel/scheduler/application/eligibility.ts +252 -0
  264. package/packages/kernel/scheduler/application/schedule-service.ts +27 -0
  265. package/packages/kernel/scheduler/application/settlement.ts +182 -0
  266. package/packages/kernel/scheduler/domain/schedule.ts +236 -0
  267. package/packages/kernel/scheduler/index.ts +1 -0
  268. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +805 -0
  269. package/packages/kernel/work/api/index.ts +16 -0
  270. package/packages/kernel/work/application/work-service.ts +123 -0
  271. package/packages/kernel/work/domain/check-receipt.ts +43 -0
  272. package/packages/kernel/work/domain/context-closure-receipt.ts +32 -0
  273. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  274. package/packages/kernel/work/domain/engineering-contracts.ts +157 -0
  275. package/packages/kernel/work/domain/engineering-design.ts +286 -0
  276. package/packages/kernel/work/domain/engineering-profile.ts +238 -0
  277. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  278. package/packages/kernel/work/domain/execution-concurrency.ts +247 -0
  279. package/packages/kernel/work/domain/execution-snapshot.ts +2 -0
  280. package/packages/kernel/work/domain/implementation-review.ts +193 -0
  281. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  282. package/packages/kernel/work/domain/project-engineering-contract.ts +224 -0
  283. package/packages/kernel/work/domain/repository-completion-receipt.ts +73 -0
  284. package/{src/runtime/control-plane/facade/work-state-machine.ts → packages/kernel/work/domain/state-machine.ts} +37 -66
  285. package/packages/kernel/work/domain/types.ts +534 -0
  286. package/packages/kernel/work/index.ts +1 -0
  287. package/packages/kernel/work/infrastructure/work-contract-store.ts +1967 -0
  288. package/packages/kernel/work/ports/work-contract-store.ts +21 -0
  289. package/packages/plugin-runtime/browser/index.ts +3 -0
  290. package/packages/plugin-runtime/browser/provider-registry.ts +110 -0
  291. package/packages/plugin-runtime/browser/runtime-contract.ts +150 -0
  292. package/packages/plugin-runtime/browser/session-authority.ts +62 -0
  293. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  294. package/packages/plugin-runtime/computer/conversation-target.ts +143 -0
  295. package/packages/plugin-runtime/computer/index.ts +8 -0
  296. package/packages/plugin-runtime/computer/provider-error.ts +26 -0
  297. package/packages/plugin-runtime/computer/provider-registration.ts +52 -0
  298. package/packages/plugin-runtime/computer/provider-registry.ts +63 -0
  299. package/packages/plugin-runtime/computer/provider.ts +19 -0
  300. package/packages/plugin-runtime/computer/target-authority.ts +215 -0
  301. package/packages/plugin-runtime/computer/target-persistence.ts +54 -0
  302. package/packages/plugin-runtime/external/index.ts +1 -0
  303. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +581 -0
  304. package/packages/plugin-runtime/index.ts +3 -0
  305. package/packages/protocols/browser/index.ts +1 -0
  306. package/packages/protocols/browser/session.ts +98 -0
  307. package/packages/protocols/computer/contract.ts +225 -0
  308. package/packages/protocols/computer/index.ts +1 -0
  309. package/packages/protocols/failure/contract.ts +158 -0
  310. package/packages/protocols/failure/index.ts +1 -0
  311. package/packages/protocols/handoff/index.ts +1 -0
  312. package/packages/protocols/handoff/status.ts +22 -0
  313. package/packages/protocols/mcp/execution-context.ts +11 -0
  314. package/packages/protocols/mcp/index.ts +2 -0
  315. package/packages/protocols/mcp/tool-contract.ts +42 -0
  316. package/packages/workflow-runtime/api/index.ts +2 -0
  317. package/packages/workflow-runtime/application/interpreter.ts +342 -0
  318. package/packages/workflow-runtime/domain/workflow-asset.ts +223 -0
  319. package/packages/workflow-runtime/index.ts +1 -0
  320. package/scripts/activate-source-baseline.ts +7 -9
  321. package/scripts/assemble-template.ts +1 -1
  322. package/scripts/bootstrap-runtime-maintenance-recovery.sh +4 -1
  323. package/scripts/canary-chatgpt-provider-delivery.ts +97 -0
  324. package/scripts/canary-controller-semantic-wait.ts +183 -0
  325. package/scripts/canary-global-hook.sh +2 -2
  326. package/scripts/check-mcp-compatibility.ts +85 -7
  327. package/scripts/check-platform-support.mjs +28 -2
  328. package/scripts/check-public-docs.sh +1 -1
  329. package/scripts/check-repository-hygiene.mjs +92 -0
  330. package/scripts/check-runtime-architecture.mjs +1643 -127
  331. package/scripts/check-source-duplication.mjs +9 -1
  332. package/scripts/controller-ngrok-rotation.sh +5 -4
  333. package/scripts/create-project-dirs.sh +10 -74
  334. package/scripts/forge-local-recovery-helper.mjs +282 -0
  335. package/scripts/forge-uu-remote-rescue-helper.d.mts +31 -0
  336. package/scripts/forge-uu-remote-rescue-helper.mjs +409 -0
  337. package/scripts/forge-windows-host-recovery-helper.mjs +136 -0
  338. package/scripts/hook-shim.sh +2 -2
  339. package/scripts/init-project.sh +12 -70
  340. package/scripts/install-desktop-operator-registration.ts +4 -2
  341. package/scripts/install-independent-windows-wsl-recovery.ts +125 -0
  342. package/scripts/install-standalone-recovery.ts +122 -10
  343. package/scripts/install-uu-remote-rescue-registration.ts +74 -0
  344. package/scripts/install-windows-host-recovery-registration.ts +22 -0
  345. package/scripts/lib/controller-home-env.sh +6 -3
  346. package/scripts/lib/project-init-lib.sh +42 -582
  347. package/scripts/migrate-chatgpt-automation-schedules.ts +2 -2
  348. package/scripts/migrate-windows-wsl-controller-home.ts +306 -0
  349. package/scripts/open-source-audit-allowlist.txt +11 -1
  350. package/scripts/portability-bindings.mjs +70 -0
  351. package/scripts/run-bounded-command.mjs +60 -0
  352. package/scripts/run-bun-test-file.ts +22 -6
  353. package/scripts/run-governed-gate.ts +4 -2
  354. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  355. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  356. package/scripts/smoke-mcp-http-runtime.ts +6 -1
  357. package/scripts/smoke-runtime-recovery.ts +13 -11
  358. package/scripts/smoke-schedule-engine.ts +24 -16
  359. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  360. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  361. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +92 -0
  362. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  363. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  364. package/scripts/smoke-workflow-supervisor.ts +103 -0
  365. package/scripts/test-governance.ts +51 -2
  366. package/scripts/verify-forge-runtime.sh +2 -1
  367. package/src/cli/agent-jobs/executor-health.ts +11 -34
  368. package/src/cli/agent-jobs/integration.ts +18 -49
  369. package/src/cli/agent-jobs/job-manager.ts +17 -4
  370. package/src/cli/chatgpt-browser/bind-server.ts +2 -1
  371. package/src/cli/chatgpt-browser/binding.ts +20 -10
  372. package/src/cli/chatgpt-browser/bridge-extension.ts +75 -0
  373. package/src/cli/chatgpt-browser/bridge-provider.ts +376 -11
  374. package/src/cli/chatgpt-browser/engine.ts +10 -11
  375. package/src/cli/chatgpt-browser/native-provider.ts +24 -83
  376. package/src/cli/chatgpt-browser/oracle-provider.ts +5 -3
  377. package/src/cli/chatgpt-browser/types.ts +1 -0
  378. package/src/cli/commands/bootstrap-control.ts +334 -0
  379. package/src/cli/commands/brain-assistant.ts +52 -0
  380. package/src/cli/commands/brain.ts +191 -40
  381. package/src/cli/commands/chatgpt.ts +32 -67
  382. package/src/cli/commands/computer.ts +437 -0
  383. package/src/cli/commands/doctor.ts +18 -1
  384. package/src/cli/commands/init-hook.ts +71 -61
  385. package/src/cli/commands/init.ts +3 -1
  386. package/src/cli/commands/mcp.ts +16 -10
  387. package/src/cli/commands/plugin.ts +38 -12
  388. package/src/cli/commands/recovery.ts +507 -80
  389. package/src/cli/commands/runtime.ts +12 -7
  390. package/src/cli/commands/setup-profile.ts +97 -39
  391. package/src/cli/commands/status.ts +2 -1
  392. package/src/cli/controller/check-runner.ts +500 -100
  393. package/src/cli/controller/completion-backlog.ts +3 -3
  394. package/src/cli/controller/completion-orchestrator.ts +4 -43
  395. package/src/cli/controller/completion-target.ts +3 -72
  396. package/src/cli/controller/context/source-materializer.ts +81 -100
  397. package/src/cli/controller/context/types.ts +7 -1
  398. package/src/cli/controller/context-pack.ts +28 -6
  399. package/src/cli/controller/execution-completion.ts +4 -7
  400. package/src/cli/controller/execution-policy.ts +36 -153
  401. package/src/cli/controller/governance.ts +2 -3
  402. package/src/cli/controller/issue-store.ts +4 -99
  403. package/src/cli/controller/launch-agents.ts +59 -18
  404. package/src/cli/controller/operational-plan.ts +24 -51
  405. package/src/cli/controller/runtime-config.ts +5 -1
  406. package/src/cli/controller/stuck-state-migration.ts +2 -3
  407. package/src/cli/controller/systemd-user.ts +148 -0
  408. package/src/cli/controller/types.ts +10 -70
  409. package/src/cli/controller/worklog.ts +67 -13
  410. package/src/cli/editing/edit-operation-contract.ts +92 -0
  411. package/src/cli/editing/edit-session.ts +290 -20
  412. package/src/cli/github/plugin.ts +17 -12
  413. package/src/cli/hook/route-registry.ts +3 -5
  414. package/src/cli/hook/runtime.ts +49 -3
  415. package/src/cli/index.ts +3 -0
  416. package/src/cli/local-bridge/connector-freshness.ts +2 -2
  417. package/src/cli/local-bridge/console-automations.ts +20 -15
  418. package/src/cli/local-bridge/console-view-models.ts +3 -12
  419. package/src/cli/local-bridge/facade-api.ts +105 -205
  420. package/src/cli/local-bridge/job-store.ts +1 -1
  421. package/src/cli/local-bridge/server.ts +48 -174
  422. package/src/cli/local-bridge/types.ts +0 -1
  423. package/src/cli/mcp/access-mode.ts +2 -132
  424. package/src/cli/mcp/access-tools.ts +2 -387
  425. package/src/cli/mcp/audit.ts +2 -32
  426. package/src/cli/mcp/auth.ts +2 -404
  427. package/src/cli/mcp/instructions.ts +2 -34
  428. package/src/cli/mcp/legacy-context.ts +2 -16
  429. package/src/cli/mcp/legacy-tool-service.ts +2 -5308
  430. package/src/cli/mcp/multi-repository.ts +2 -436
  431. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  432. package/src/cli/mcp/oauth.ts +2 -375
  433. package/src/cli/mcp/openai-secure-tunnel.ts +2 -0
  434. package/src/cli/mcp/paths.ts +2 -140
  435. package/src/cli/mcp/policy.ts +2 -232
  436. package/src/cli/mcp/post-finalize-work-attribution.ts +2 -150
  437. package/src/cli/mcp/proxy-env.ts +2 -62
  438. package/src/cli/mcp/readiness-projection.ts +2 -24
  439. package/src/cli/mcp/redaction.ts +2 -21
  440. package/src/cli/mcp/repo.ts +2 -24
  441. package/src/cli/mcp/repository-tools.ts +2 -1613
  442. package/src/cli/mcp/server.ts +2 -951
  443. package/src/cli/mcp/setup.ts +2 -737
  444. package/src/cli/mcp/tool-capability-cache.ts +2 -87
  445. package/src/cli/mcp/tool-contract.ts +2 -14
  446. package/src/cli/mcp/tools.ts +2 -9
  447. package/src/cli/mcp/toolset-names.ts +2 -70
  448. package/src/cli/mcp/toolset-selection.ts +2 -41
  449. package/src/cli/mcp/toolset.ts +2 -336
  450. package/src/cli/mcp/transports/AGENTS.md +1 -10
  451. package/src/cli/mcp/transports/CLAUDE.md +1 -10
  452. package/src/cli/mcp/transports/http.ts +2 -1414
  453. package/src/cli/mcp/transports/session-registry.ts +2 -490
  454. package/src/cli/mcp/transports/stdio.ts +2 -8
  455. package/src/cli/mcp/types.ts +2 -41
  456. package/src/cli/mcp/umbrella-tools.ts +2 -117
  457. package/src/cli/repositories/command-executor.ts +91 -39
  458. package/src/cli/repositories/command-scope.ts +139 -4
  459. package/src/cli/repositories/controller-home.ts +167 -1
  460. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  461. package/src/cli/repositories/git-command-executor.ts +2 -2
  462. package/src/cli/repositories/identity.ts +13 -0
  463. package/src/cli/repositories/registry.ts +145 -60
  464. package/src/cli/repositories/repository-snapshot.ts +53 -7
  465. package/src/cli/repositories/runtime-storage.ts +27 -2
  466. package/src/cli/repositories/safe-patch.ts +34 -38
  467. package/src/cli/repositories/selected-path-actions.ts +22 -2
  468. package/src/cli/repositories/structured-git.ts +167 -27
  469. package/src/cli/repository/session-cache.ts +92 -6
  470. package/src/cli/runtime/helper-runner.ts +7 -0
  471. package/src/cli/runtime-invocation.ts +8 -1
  472. package/src/cli/tools/codegraph.ts +44 -25
  473. package/src/core/adoption/manifest-templates.ts +1 -1
  474. package/src/core/adoption/plan.ts +3 -26
  475. package/src/core/adoption/workflow-contract-plan.ts +17 -9
  476. package/src/effects/process-runner.ts +8 -14
  477. package/src/runtime/context/assistant-context.ts +167 -0
  478. package/src/runtime/context/assistant-work-context.ts +209 -0
  479. package/src/runtime/context/automatic-learning.ts +565 -0
  480. package/src/runtime/context/codegraph-cache-boundary.ts +255 -0
  481. package/src/runtime/context/codegraph-read-provider.ts +55 -22
  482. package/src/runtime/context/codegraph-sidecar.cjs +8 -1
  483. package/src/runtime/context/cognitive-attention.ts +173 -0
  484. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  485. package/src/runtime/context/context-closure.ts +305 -0
  486. package/src/runtime/context/context-pack-process.ts +103 -0
  487. package/src/runtime/context/context-plane.ts +203 -0
  488. package/src/runtime/context/direct-controller-learning.ts +298 -0
  489. package/src/runtime/context/project-engineering-contract.ts +60 -0
  490. package/src/runtime/context/semantic-navigation-contract.ts +9 -0
  491. package/src/runtime/context/semantic-navigation.ts +6 -34
  492. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  493. package/src/runtime/context/typescript-navigation.ts +89 -3
  494. package/src/runtime/control-plane/bootstrap/capability-provider.ts +74 -0
  495. package/src/runtime/control-plane/bootstrap/control-api.ts +57 -0
  496. package/src/runtime/control-plane/bootstrap/index.ts +5 -0
  497. package/src/runtime/control-plane/bootstrap/state-machine.ts +141 -0
  498. package/src/runtime/control-plane/bootstrap/store.ts +21 -0
  499. package/src/runtime/control-plane/bootstrap/types.ts +87 -0
  500. package/src/runtime/control-plane/cleanup-artifact-retention.ts +531 -0
  501. package/src/runtime/control-plane/codegraph-cache-retention.ts +164 -0
  502. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +282 -0
  503. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +380 -0
  504. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +113 -16
  505. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  506. package/src/runtime/control-plane/execution/implementation-review-content.ts +95 -0
  507. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  508. package/src/runtime/control-plane/execution/retained-work-resume.ts +439 -102
  509. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  510. package/src/runtime/control-plane/execution/validation.ts +34 -11
  511. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +87 -0
  512. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  513. package/src/runtime/control-plane/execution/work-completion-authority.ts +31 -44
  514. package/src/runtime/control-plane/execution/work-delivery-service.ts +497 -0
  515. package/src/runtime/control-plane/execution/work-evidence-policy.ts +46 -53
  516. package/src/runtime/control-plane/execution/work-execution-support.ts +85 -164
  517. package/src/runtime/control-plane/execution/work-handle-authority.ts +349 -73
  518. package/src/runtime/control-plane/execution/work-handle-store.ts +55 -2
  519. package/src/runtime/control-plane/execution/work-head-settlement.ts +108 -0
  520. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +173 -28
  521. package/src/runtime/control-plane/execution/work-operation-service.ts +92 -40
  522. package/src/runtime/control-plane/execution/work-preparation-service.ts +145 -269
  523. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  524. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  525. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +543 -225
  526. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +59 -45
  527. package/src/runtime/control-plane/execution/work-verification-context.ts +1 -1
  528. package/src/runtime/control-plane/execution/work-verification-service.ts +662 -52
  529. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +205 -16
  530. package/src/runtime/control-plane/facade/capability-registry.ts +380 -44
  531. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  532. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  533. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  534. package/src/runtime/control-plane/facade/controller-session-store.ts +2 -488
  535. package/src/runtime/control-plane/facade/goal-workloop-access.ts +6 -22
  536. package/src/runtime/control-plane/facade/goal-workloop.ts +565 -1202
  537. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +145 -0
  538. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +266 -52
  539. package/src/runtime/control-plane/facade/index.ts +4 -3
  540. package/src/runtime/control-plane/facade/operation-digest.ts +34 -73
  541. package/src/runtime/control-plane/facade/plan-contract-store.ts +671 -245
  542. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  543. package/src/runtime/control-plane/facade/repository-work-admission.ts +31 -23
  544. package/src/runtime/control-plane/facade/requirement-authority.ts +121 -0
  545. package/src/runtime/control-plane/facade/requirement-board.ts +9 -4
  546. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +85 -0
  547. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  548. package/src/runtime/control-plane/facade/semantic-admission.ts +8 -16
  549. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -15
  550. package/src/runtime/control-plane/facade/types.ts +218 -620
  551. package/src/runtime/control-plane/facade/work-continuation.ts +8 -8
  552. package/src/runtime/control-plane/facade/work-contract-store.ts +2 -1043
  553. package/src/runtime/control-plane/generated-cache-retention.ts +336 -19
  554. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  555. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +13 -2
  556. package/src/runtime/control-plane/global-scheduler/maintenance.ts +274 -84
  557. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-entry.ts +55 -0
  558. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-process.ts +98 -0
  559. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -2
  560. package/src/runtime/control-plane/global-scheduler/scheduler-worker-entry.ts +10 -0
  561. package/src/runtime/control-plane/global-scheduler/scheduler.ts +227 -109
  562. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  563. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +18 -6
  564. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  565. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  566. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +160 -0
  567. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +2 -177
  568. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +139 -670
  569. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  570. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +25 -6
  571. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -194
  572. package/src/runtime/control-plane/lifecycle-retention-metrics.ts +60 -0
  573. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  574. package/src/runtime/control-plane/persistence/experience-store.ts +302 -0
  575. package/src/runtime/control-plane/persistence/operational-prior-store.ts +348 -0
  576. package/src/runtime/control-plane/persistence/requirement-store.ts +230 -80
  577. package/src/runtime/control-plane/persistence/sqlite-store.ts +654 -78
  578. package/src/runtime/control-plane/persistence/workflow-content-store.ts +98 -0
  579. package/src/runtime/control-plane/persistence/workflow-registry-store.ts +186 -0
  580. package/src/runtime/control-plane/persistence/workflow-run-store.ts +123 -0
  581. package/src/runtime/control-plane/release-retention.ts +154 -26
  582. package/src/runtime/control-plane/repository-namespace-retention.ts +208 -0
  583. package/src/runtime/control-plane/runtime-cleanup.ts +844 -38
  584. package/src/runtime/control-plane/runtime-generation.ts +6 -0
  585. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  586. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +479 -0
  587. package/src/runtime/control-plane/workspace/workspace-store.ts +249 -0
  588. package/src/runtime/diagnostics/incident-repair.ts +573 -0
  589. package/src/runtime/diagnostics/mcp-timing.ts +239 -6
  590. package/src/runtime/diagnostics/performance.ts +6 -14
  591. package/src/runtime/diagnostics/read-only-tool.ts +1 -1
  592. package/src/runtime/evidence/artifact-store.ts +216 -35
  593. package/src/runtime/evidence/evidence-store.ts +112 -8
  594. package/src/runtime/evidence/operational-shadow.ts +38 -0
  595. package/src/runtime/evidence/output-handle-index.ts +225 -0
  596. package/src/runtime/evidence/process-check-receipt.ts +5 -43
  597. package/src/runtime/evidence/result-store.ts +158 -44
  598. package/src/runtime/evidence/sensitive-output.ts +4 -4
  599. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -1
  600. package/src/runtime/execution/jobs/store.ts +124 -6
  601. package/src/runtime/execution/managed-workspace.ts +112 -5
  602. package/src/runtime/execution/process-runtime/canary.ts +19 -5
  603. package/src/runtime/execution/process-runtime/check-classification.ts +48 -0
  604. package/src/runtime/execution/process-runtime/check-facade.ts +24 -10
  605. package/src/runtime/execution/process-runtime/check-receipt.ts +1 -1
  606. package/src/runtime/execution/process-runtime/check-result-retention.ts +132 -0
  607. package/src/runtime/execution/process-runtime/check-result.ts +177 -2
  608. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +58 -9
  609. package/src/runtime/execution/process-runtime/check-storage.ts +187 -0
  610. package/src/runtime/execution/process-runtime/command-facade.ts +117 -114
  611. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  612. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  613. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  614. package/src/runtime/execution/process-runtime/index.ts +4 -0
  615. package/src/runtime/execution/process-runtime/interactive-admission.ts +2 -1
  616. package/src/runtime/execution/process-runtime/lightweight-managed.ts +283 -73
  617. package/src/runtime/execution/process-runtime/persisted-check.ts +130 -23
  618. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  619. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  620. package/src/runtime/execution/process-runtime/resource-claims.ts +125 -64
  621. package/src/runtime/execution/process-runtime/runtime.ts +167 -17
  622. package/src/runtime/execution/process-runtime/store.ts +30 -2
  623. package/src/runtime/execution/process-runtime/types.ts +27 -0
  624. package/src/runtime/execution/workers/executor.ts +18 -19
  625. package/src/runtime/execution/workers/worker-entry.ts +1 -1
  626. package/src/runtime/gateway/mcp/execution-tools.ts +2 -207
  627. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +2 -61
  628. package/src/runtime/gateway/mcp/persisted-check-process.ts +2 -3
  629. package/src/runtime/gateway/mcp/process-tools.ts +2 -289
  630. package/src/runtime/gateway/mcp/router.ts +2 -1125
  631. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +2 -565
  632. package/src/runtime/gateway/mcp/runtime-tools.ts +2 -6655
  633. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +2 -1
  634. package/src/runtime/maintenance/cleanup.ts +38 -24
  635. package/src/runtime/platform/browser-product-discovery.ts +174 -0
  636. package/src/runtime/platform/computer-platform.ts +14 -0
  637. package/src/runtime/platform/executable-discovery.ts +54 -0
  638. package/src/runtime/platform/fetch-http-server.ts +90 -0
  639. package/src/runtime/platform/service-inventory.ts +130 -0
  640. package/src/runtime/platform/service-manager.ts +146 -0
  641. package/src/runtime/platform/windows-host-discovery.ts +118 -0
  642. package/src/runtime/platform/windows-recovery-deployment.ts +67 -0
  643. package/src/runtime/plugins/action-application.ts +192 -0
  644. package/src/runtime/plugins/app-store-connect-adapter.ts +47 -35
  645. package/src/runtime/plugins/browser-adapter.ts +898 -135
  646. package/src/runtime/plugins/browser-automation-service.ts +33 -34
  647. package/src/runtime/plugins/browser-macos-bridge.ts +386 -46
  648. package/src/runtime/plugins/browser-manifest-surface.ts +75 -17
  649. package/src/runtime/plugins/browser-native-session-service.ts +64 -14
  650. package/src/runtime/plugins/browser-provider-registry.ts +2 -109
  651. package/src/runtime/plugins/browser-registration.ts +32 -0
  652. package/src/runtime/plugins/browser-runtime-contract.ts +2 -154
  653. package/src/runtime/plugins/browser-runtime.ts +55 -10
  654. package/src/runtime/plugins/browser-session-authority.ts +101 -291
  655. package/src/runtime/plugins/browser-session-legacy-migration.ts +203 -0
  656. package/src/runtime/plugins/browser-session-store.ts +243 -80
  657. package/src/runtime/plugins/browser-session-types.ts +2 -98
  658. package/src/runtime/plugins/capability-authorization-grants.ts +272 -59
  659. package/src/runtime/plugins/catalog-trust.ts +82 -0
  660. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +219 -0
  661. package/src/runtime/plugins/computer-chatgpt-macos-target.ts +891 -0
  662. package/src/runtime/plugins/computer-registration.ts +1050 -0
  663. package/src/runtime/plugins/config-store.ts +119 -0
  664. package/src/runtime/plugins/desktop-operator-external-policy.ts +964 -0
  665. package/src/runtime/plugins/desktop-operator-registration.ts +123 -12
  666. package/src/runtime/plugins/errors.ts +8 -1
  667. package/src/runtime/plugins/external-adapter.ts +82 -323
  668. package/src/runtime/plugins/external-provider-policy.ts +48 -0
  669. package/src/runtime/plugins/external-registration.ts +30 -2
  670. package/src/runtime/plugins/external-unix-socket-probe.cjs +9 -3
  671. package/src/runtime/plugins/external-unix-socket.ts +64 -193
  672. package/src/runtime/plugins/first-party-external-registration.ts +163 -0
  673. package/src/runtime/plugins/first-party-registry.ts +3 -1
  674. package/src/runtime/plugins/github-adapter.ts +1 -2
  675. package/src/runtime/plugins/gmail-adapter.ts +29 -8
  676. package/src/runtime/plugins/google-calendar-adapter.ts +8 -8
  677. package/src/runtime/plugins/google-shared.ts +45 -53
  678. package/src/runtime/plugins/google-tasks-adapter.ts +8 -8
  679. package/src/runtime/plugins/ios-adapter.ts +2 -3
  680. package/src/runtime/plugins/lightweight-action.ts +208 -2
  681. package/src/runtime/plugins/local-system-adapter.ts +192 -2
  682. package/src/runtime/plugins/macos-capability-broker.ts +15 -105
  683. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  684. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  685. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  686. package/src/runtime/plugins/resend-adapter.ts +15 -24
  687. package/src/runtime/plugins/store.ts +1003 -387
  688. package/src/runtime/plugins/types.ts +28 -1
  689. package/src/runtime/plugins/uu-remote-rescue-registration.ts +155 -0
  690. package/src/runtime/plugins/windows-host-recovery-install.ts +68 -0
  691. package/src/runtime/plugins/windows-host-recovery-registration.ts +85 -0
  692. package/src/runtime/plugins/xiaohongshu-publish.ts +102 -430
  693. package/src/runtime/projections/controller-context.ts +12 -6
  694. package/src/runtime/projections/git-status-sampler.ts +73 -22
  695. package/src/runtime/projections/invalidation.ts +7 -3
  696. package/src/runtime/projections/materialized-view.ts +93 -43
  697. package/src/runtime/recovery/actions.ts +3 -3
  698. package/src/runtime/recovery/capability-action-application.ts +229 -0
  699. package/src/runtime/recovery/index.ts +3 -0
  700. package/src/runtime/recovery/lifecycle-inventory.ts +338 -0
  701. package/src/runtime/recovery/local-jobs-repair.ts +14 -14
  702. package/src/runtime/recovery/maintenance-executor.ts +701 -168
  703. package/src/runtime/recovery/quarantine-retention.ts +256 -0
  704. package/src/runtime/recovery/store.ts +29 -11
  705. package/src/runtime/release/identity.ts +6 -0
  706. package/src/runtime/release/release-coordinator.ts +296 -0
  707. package/src/runtime/release/release-session.ts +716 -0
  708. package/src/runtime/release/release-state-migration.ts +25 -0
  709. package/src/runtime/resources/leases/store.ts +56 -25
  710. package/src/runtime/root/active-execution-power-assertion.ts +139 -0
  711. package/src/runtime/root/assistant-learning-loop.ts +45 -0
  712. package/src/runtime/root/browser-session-composition.ts +59 -0
  713. package/src/runtime/root/computer-composition.ts +376 -0
  714. package/src/runtime/root/computer-target-composition.ts +16 -0
  715. package/src/runtime/root/computer-target-persistence.ts +39 -0
  716. package/src/runtime/root/controller-progression-composition.ts +192 -0
  717. package/src/runtime/root/controller-round-composition.ts +126 -0
  718. package/src/runtime/root/controller-services.ts +2 -0
  719. package/src/runtime/root/deployment-topology.ts +106 -0
  720. package/src/runtime/root/entry.ts +8 -6
  721. package/src/runtime/root/gateway-adapter.ts +3 -3
  722. package/src/runtime/root/known-good-recovery.ts +184 -0
  723. package/src/runtime/root/local-bridge.ts +5 -3
  724. package/src/runtime/root/mcp-transport.ts +116 -23
  725. package/src/runtime/root/ownership.ts +261 -9
  726. package/src/runtime/root/package-connector-service.ts +212 -74
  727. package/src/runtime/root/package-runtime-release.ts +199 -33
  728. package/src/runtime/root/package-runtime-service.ts +77 -108
  729. package/src/runtime/root/release-execution-canary.ts +103 -0
  730. package/src/runtime/root/release-loader.ts +150 -0
  731. package/src/runtime/root/release-manifest.ts +185 -7
  732. package/src/runtime/root/release-materialize.ts +474 -31
  733. package/src/runtime/root/release-store.ts +425 -37
  734. package/src/runtime/root/runtime-lane.ts +191 -0
  735. package/src/runtime/root/runtime.ts +379 -32
  736. package/src/runtime/root/scheduled-controller-composition.ts +76 -0
  737. package/src/runtime/root/scheduler.ts +12 -4
  738. package/src/runtime/root/service-runner.ts +3 -3
  739. package/src/runtime/root/service.ts +73 -45
  740. package/src/runtime/root/status.ts +49 -0
  741. package/src/runtime/root/types.ts +55 -3
  742. package/src/runtime/root/workflow-supervisor-composition.ts +493 -0
  743. package/src/runtime/root/workflow-supervisor-runtime.ts +209 -0
  744. package/src/runtime/root/write-fence.ts +50 -2
  745. package/src/runtime/safe-tooling/google-credential-store.ts +76 -21
  746. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  747. package/src/runtime/safe-tooling/workspace-auth.ts +1 -1
  748. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  749. package/src/runtime/shared/local-bridge-surface.ts +1 -1
  750. package/src/runtime/shared/process-environment.ts +36 -10
  751. package/src/runtime/shared/response-budget.ts +1 -3
  752. package/src/runtime/shared/storage-capacity.ts +68 -0
  753. package/src/runtime/standalone-recovery/controller-home-migration.ts +1108 -0
  754. package/src/runtime/standalone-recovery/core.ts +4609 -495
  755. package/src/runtime/standalone-recovery/entry.ts +642 -81
  756. package/src/runtime/standalone-recovery/independent-host-rescue.ts +172 -0
  757. package/src/runtime/standalone-recovery/installer.ts +399 -177
  758. package/src/runtime/standalone-recovery/mcp-server.ts +79 -0
  759. package/src/runtime/standalone-recovery/mutation-identity-contract.ts +21 -0
  760. package/src/runtime/standalone-recovery/operation-lock.ts +160 -0
  761. package/src/runtime/standalone-recovery/performance.ts +173 -0
  762. package/src/runtime/standalone-recovery/release.ts +58 -5
  763. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  764. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  765. package/src/runtime/watchdog/workflow-watchdog.ts +1 -1
  766. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  767. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -4
  768. package/src/runtime/workflow/schedules/engine.ts +298 -484
  769. package/src/runtime/workflow/schedules/pending-activation.ts +1 -1
  770. package/src/runtime/workflow/schedules/settlement.ts +2 -191
  771. package/src/runtime/workflow/schedules/store.ts +2 -607
  772. package/src/runtime/workflow/schedules/types.ts +2 -127
  773. package/src/runtime/workflow/schedules/work-continuation.ts +220 -16
  774. package/src/runtime/workflows/first-party/xiaohongshu.ts +122 -0
  775. package/src/runtime/workflows/runtime.ts +482 -0
  776. package/src/testing/test-governance.ts +95 -30
  777. package/supervisor/chatgpt-conversation.ts +23 -0
  778. package/supervisor/client.ts +201 -0
  779. package/supervisor/control-plane.ts +868 -0
  780. package/supervisor/entry.ts +15 -0
  781. package/supervisor/forge-validators.ts +80 -0
  782. package/supervisor/index.ts +5 -0
  783. package/supervisor/native-browser-adapter.ts +786 -0
  784. package/supervisor/native-messaging/host.ts +39 -0
  785. package/supervisor/native-messaging/manifest.ts +26 -0
  786. package/supervisor/native-messaging/protocol.ts +27 -0
  787. package/supervisor/paths.ts +18 -0
  788. package/supervisor/protocol.ts +202 -0
  789. package/supervisor/server.ts +404 -0
  790. package/supervisor/store.ts +1451 -0
  791. package/supervisor/tsconfig.json +8 -0
  792. package/supervisor/types.ts +255 -0
  793. package/assets/templates/helpers/archive-architecture-request.sh +0 -244
  794. package/docs/architecture/history/README.md +0 -7
  795. package/docs/architecture/history/chatgpt-handoff-facade.md +0 -397
  796. package/docs/architecture/history/global-hook-runtime.md +0 -166
  797. package/docs/architecture/history/ios-semantic-automation-provider-v2.md +0 -170
  798. package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  799. package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +0 -59
  800. package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +0 -59
  801. package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +0 -59
  802. package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +0 -59
  803. package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  804. package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  805. package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  806. package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  807. package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +0 -59
  808. package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  809. package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  810. package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  811. package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  812. package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  813. package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  814. package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  815. package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  816. package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  817. package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +0 -59
  818. package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +0 -59
  819. package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +0 -63
  820. package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  821. package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  822. package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  823. package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  824. package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +0 -60
  825. package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +0 -60
  826. package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +0 -68
  827. package/docs/architecture/requests/archive/2026/root.md +0 -68
  828. package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +0 -76
  829. package/docs/architecture/requests/archive/2026/verification-evals-checks.md +0 -68
  830. package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +0 -69
  831. package/scripts/archive-architecture-request.sh +0 -4
  832. package/scripts/benchmark-background-check-overlap.ts +0 -228
  833. package/scripts/benchmark-controller-hotpath.ts +0 -212
  834. package/scripts/benchmark-controller-round2.ts +0 -139
  835. package/scripts/benchmark-ios-agent-device.ts +0 -514
  836. package/scripts/benchmark-mcp-host.sh +0 -117
  837. package/scripts/benchmark-mcp-transport.ts +0 -170
  838. package/scripts/benchmark-quality-harness.ts +0 -146
  839. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  840. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  841. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  842. package/scripts/benchmark-thin-harness.ts +0 -251
  843. package/scripts/benchmark-typescript-navigation.ts +0 -186
  844. package/scripts/benchmark-work-efficiency.ts +0 -334
  845. package/scripts/build-controller-ui.ts +0 -28
  846. package/scripts/check-npm-release.sh +0 -32
  847. package/scripts/check-public-release-surface.sh +0 -19
  848. package/scripts/check-release-published.sh +0 -57
  849. package/scripts/check-release-readiness.sh +0 -37
  850. package/scripts/check-release-version.mjs +0 -74
  851. package/scripts/check-tarball-install-smoke.sh +0 -67
  852. package/scripts/package-source-archive.sh +0 -147
  853. package/scripts/public-release-files.txt +0 -39
  854. package/scripts/public-release.ts +0 -174
  855. package/scripts/publish-release-tarball.sh +0 -27
  856. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  857. package/scripts/run-skill-evals.ts +0 -1022
  858. package/scripts/stage-runtime-release.ts +0 -39
  859. package/src/cli/controller/progress.ts +0 -656
  860. package/src/cli/controller/work-mode.ts +0 -181
  861. package/src/cli/local-bridge/console-assets.ts +0 -17
  862. package/src/cli/local-bridge/dashboard.ts +0 -17
  863. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  864. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  865. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  866. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  867. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  868. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  869. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  870. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  871. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  872. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  873. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  874. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  875. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  876. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  877. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  878. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  879. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  880. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  881. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  882. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  883. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  884. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  885. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  886. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  887. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  888. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  889. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  890. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  891. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -385
  892. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -1913
  893. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  894. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -449
  895. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -1118
  896. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -93
  897. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  898. package/src/runtime/control-plane/routing/index.ts +0 -1
  899. package/src/runtime/control-plane/routing/route-policy.ts +0 -382
  900. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
@@ -6,8 +6,13 @@
6
6
  import type { ResourceClaimSpec } from '../jobs/types';
7
7
  import { readFileSync } from 'fs';
8
8
  import { join } from 'path';
9
- import type { ControllerCheckEffects } from '../../../cli/controller/check-runner';
10
- import { classifyRepositoryCommand, fixedShellWrapperCommand } from '../../../cli/repositories/command-classifier';
9
+ import type { ControllerCheckEffects, ControllerCheckExecutionAuthority } from '../../../cli/controller/check-runner';
10
+ import {
11
+ classifyRepositoryCommand,
12
+ fixedShellWrapperCommand,
13
+ shellSegments,
14
+ shellWordsPreservingQuotes,
15
+ } from '../../../cli/repositories/command-classifier';
11
16
  import { normalizeRepositoryCommand } from '../../../cli/repositories/command-normalization';
12
17
  import { isFocusedCheckCommand } from '../thin-harness/execution-router';
13
18
  import type { ProcessResourceClaim } from './types';
@@ -30,8 +35,12 @@ export type ResourceClaimKind =
30
35
  | 'heavy_check'
31
36
  | 'workspace_write';
32
37
 
33
- function checkoutScope(checkoutId?: string): string {
34
- return checkoutId?.trim() || 'active';
38
+ function checkoutScope(checkoutId?: string, repoId?: string): string {
39
+ const checkout = checkoutId?.trim();
40
+ if (checkout) return checkout;
41
+ const repository = repoId?.trim();
42
+ if (repository) return `repository-${repository.replace(/[^a-zA-Z0-9._-]+/g, '-')}`;
43
+ throw new Error('RESOURCE_CLAIM_PLACEMENT_REQUIRED');
35
44
  }
36
45
 
37
46
  /**
@@ -39,24 +48,24 @@ function checkoutScope(checkoutId?: string): string {
39
48
  * Conflict is expressed via mode (read vs write), not a separate key.
40
49
  * Legacy workspace-read:* keys are normalized in claims/conflicts.ts.
41
50
  */
42
- export function claimWorkspaceRead(checkoutId?: string): ResourceClaimSpec {
43
- return { resourceKey: `workspace:${checkoutScope(checkoutId)}`, mode: 'read' };
51
+ export function claimWorkspaceRead(checkoutId?: string, repoId?: string): ResourceClaimSpec {
52
+ return { resourceKey: `workspace:${checkoutScope(checkoutId, repoId)}`, mode: 'read' };
44
53
  }
45
54
 
46
- export function claimPathRead(path: string, checkoutId?: string): ResourceClaimSpec {
47
- if (path === '.') return claimWorkspaceRead(checkoutId);
55
+ export function claimPathRead(path: string, checkoutId?: string, repoId?: string): ResourceClaimSpec {
56
+ if (path === '.') return claimWorkspaceRead(checkoutId, repoId);
48
57
  const normalized = normalizeClaimPath(path);
49
- if (!normalized) return claimWorkspaceRead(checkoutId);
50
- return { resourceKey: `path:${checkoutScope(checkoutId)}:${normalized}`, mode: 'read' };
58
+ if (!normalized) return claimWorkspaceRead(checkoutId, repoId);
59
+ return { resourceKey: `path:${checkoutScope(checkoutId, repoId)}:${normalized}`, mode: 'read' };
51
60
  }
52
61
 
53
- export function claimPathWrite(path: string, checkoutId?: string): ResourceClaimSpec {
62
+ export function claimPathWrite(path: string, checkoutId?: string, repoId?: string): ResourceClaimSpec {
54
63
  const normalized = normalizeClaimPath(path);
55
64
  if (!normalized) {
56
65
  // Unsafe / ambiguous path → escalate to whole-checkout workspace write.
57
- return claimWorkspaceWrite(checkoutId);
66
+ return claimWorkspaceWrite(checkoutId, repoId);
58
67
  }
59
- return { resourceKey: `path:${checkoutScope(checkoutId)}:${normalized}`, mode: 'write' };
68
+ return { resourceKey: `path:${checkoutScope(checkoutId, repoId)}:${normalized}`, mode: 'write' };
60
69
  }
61
70
 
62
71
  export function claimBuildCacheRead(repoId: string): ResourceClaimSpec {
@@ -67,12 +76,12 @@ export function claimBuildCacheWrite(repoId: string): ResourceClaimSpec {
67
76
  return { resourceKey: `build-cache:${repoId}`, mode: 'write' };
68
77
  }
69
78
 
70
- export function claimGitIndexRead(checkoutId?: string): ResourceClaimSpec {
71
- return { resourceKey: `git-index:${checkoutScope(checkoutId)}`, mode: 'read' };
79
+ export function claimGitIndexRead(checkoutId?: string, repoId?: string): ResourceClaimSpec {
80
+ return { resourceKey: `git-index:${checkoutScope(checkoutId, repoId)}`, mode: 'read' };
72
81
  }
73
82
 
74
- export function claimGitIndex(checkoutId?: string): ResourceClaimSpec {
75
- return { resourceKey: `git-index:${checkoutScope(checkoutId)}`, mode: 'exclusive' };
83
+ export function claimGitIndex(checkoutId?: string, repoId?: string): ResourceClaimSpec {
84
+ return { resourceKey: `git-index:${checkoutScope(checkoutId, repoId)}`, mode: 'exclusive' };
76
85
  }
77
86
 
78
87
  export function claimGitRefsRead(repoId: string): ResourceClaimSpec {
@@ -87,16 +96,12 @@ export function claimIntegration(repoId: string): ResourceClaimSpec {
87
96
  return { resourceKey: `integration:${repoId}`, mode: 'exclusive' };
88
97
  }
89
98
 
90
- export function claimRelease(repoId: string): ResourceClaimSpec {
91
- return { resourceKey: `release:${repoId}`, mode: 'exclusive' };
99
+ export function claimRelease(_repoId: string): ResourceClaimSpec {
100
+ return { resourceKey: 'release:runtime-authority', mode: 'exclusive' };
92
101
  }
93
102
 
94
- export function claimRemoteMutation(repoId: string): ResourceClaimSpec {
95
- return { resourceKey: `remote:${repoId}`, mode: 'exclusive' };
96
- }
97
-
98
- export function claimWorkspaceWrite(checkoutId?: string): ResourceClaimSpec {
99
- return { resourceKey: `workspace:${checkoutScope(checkoutId)}`, mode: 'write' };
103
+ export function claimWorkspaceWrite(checkoutId?: string, repoId?: string): ResourceClaimSpec {
104
+ return { resourceKey: `workspace:${checkoutScope(checkoutId, repoId)}`, mode: 'write' };
100
105
  }
101
106
 
102
107
  export function claimHeavyCheck(repoId: string): ResourceClaimSpec {
@@ -153,7 +158,7 @@ function iosSimulatorTestCommandClaims(
153
158
  }
154
159
  if (!matches) return undefined;
155
160
  return normalizeClaims([
156
- claimWorkspaceRead(checkoutId),
161
+ claimWorkspaceRead(checkoutId, repoId),
157
162
  claimBuildCacheWrite(repoId),
158
163
  claimHostService('ios-simulator-test', 'write'),
159
164
  ]);
@@ -177,7 +182,7 @@ function localHttpServerClaims(command: string | readonly string[]): ResourceCla
177
182
  return [claimHostService(`tcp-listen:${bind}:${port}`, 'write')];
178
183
  }
179
184
 
180
- function loopbackCurlClaims(command: string | readonly string[], repoId: string): ResourceClaimSpec[] | undefined {
185
+ function loopbackCurlClaims(command: string | readonly string[], _repoId: string): ResourceClaimSpec[] | undefined {
181
186
  const canonical = normalizeRepositoryCommand(command);
182
187
  if (canonical.kind !== 'argv') return undefined;
183
188
  const program = (canonical.executable ?? '').split(/[\\/]/).at(-1)?.toLowerCase();
@@ -193,7 +198,7 @@ function loopbackCurlClaims(command: string | readonly string[], repoId: string)
193
198
  return !['127.0.0.1', 'localhost', '::1'].includes(host);
194
199
  } catch { return true; }
195
200
  })) return undefined;
196
- return [claimNetwork(repoId, 'read')];
201
+ return [claimHostService('tcp-client:loopback', 'read')];
197
202
  }
198
203
 
199
204
  function simpleViteScript(script: string): boolean {
@@ -231,10 +236,56 @@ function viteServiceClaims(
231
236
  if (!vite) return undefined;
232
237
  return normalizeClaims([
233
238
  claimBuildCacheWrite(repoId),
234
- claimHostService(`vite:${checkoutScope(checkoutId)}`, 'write'),
239
+ claimHostService(`vite:${checkoutScope(checkoutId, repoId)}`, 'write'),
235
240
  ]);
236
241
  }
237
242
 
243
+ const HOMEBREW_HOST_MUTATION_SUBCOMMANDS = new Set([
244
+ 'install',
245
+ 'uninstall',
246
+ 'reinstall',
247
+ 'upgrade',
248
+ 'update',
249
+ 'cleanup',
250
+ 'autoremove',
251
+ 'tap',
252
+ 'untap',
253
+ ]);
254
+
255
+ function homebrewHostMutationClaims(command: string | readonly string[]): ResourceClaimSpec[] | undefined {
256
+ const canonical = normalizeRepositoryCommand(command);
257
+ let words: string[];
258
+
259
+ if (canonical.kind === 'argv') {
260
+ const argv = [canonical.executable ?? '', ...(canonical.args ?? [])];
261
+ const wrapped = fixedShellWrapperCommand(argv);
262
+ if (wrapped) {
263
+ const segments = shellSegments(wrapped);
264
+ if (segments.length !== 1) return undefined;
265
+ words = shellWordsPreservingQuotes(segments[0]!);
266
+ } else {
267
+ words = argv;
268
+ }
269
+ } else {
270
+ const segments = shellSegments(canonical.shellCommand ?? '');
271
+ if (segments.length !== 1) return undefined;
272
+ words = shellWordsPreservingQuotes(segments[0]!);
273
+ }
274
+
275
+ const program = words[0]?.split(/[\\/]/).at(-1)?.toLowerCase();
276
+ if (program !== 'brew') return undefined;
277
+ const subcommand = words[1]?.toLowerCase();
278
+ if (!subcommand || !HOMEBREW_HOST_MUTATION_SUBCOMMANDS.has(subcommand)) return undefined;
279
+
280
+ // Keep local formula files, Brewfiles, and other path-shaped operands under
281
+ // conservative repository workspace coordination. Formula/cask identifiers
282
+ // are deliberately narrow so an ambiguous command still fails closed.
283
+ const positional = words.slice(2).filter((arg) => arg && !arg.startsWith('-'));
284
+ if (positional.some((arg) => !/^[A-Za-z0-9@+_.-]+$/.test(arg))) return undefined;
285
+
286
+ return [claimHostService('package-manager:homebrew', 'write')];
287
+ }
288
+
238
289
  function hostOnlyCommandClaims(command: string | readonly string[], repoId: string, checkoutId?: string, repoRoot?: string): ResourceClaimSpec[] | undefined {
239
290
  const localServer = localHttpServerClaims(command);
240
291
  if (localServer) return localServer;
@@ -242,6 +293,8 @@ function hostOnlyCommandClaims(command: string | readonly string[], repoId: stri
242
293
  if (loopbackCurl) return loopbackCurl;
243
294
  const vite = viteServiceClaims(command, repoId, checkoutId, repoRoot);
244
295
  if (vite) return vite;
296
+ const homebrew = homebrewHostMutationClaims(command);
297
+ if (homebrew) return homebrew;
245
298
  const canonical = normalizeRepositoryCommand(command);
246
299
  if (canonical.kind === 'shell') {
247
300
  return browserAppleScriptHeredocClaims(canonical.shellCommand ?? '');
@@ -278,13 +331,10 @@ function hostOnlyCommandClaims(command: string | readonly string[], repoId: stri
278
331
  return undefined;
279
332
  }
280
333
 
281
- function claimTemp(checkId: string, repoId: string, scope: 'isolated' | 'shared'): ResourceClaimSpec {
334
+ function claimTemp(checkId: string, repoId: string, scope: 'isolated' | 'shared', checkoutId?: string): ResourceClaimSpec {
282
335
  const identity = checkId.replace(/[^a-zA-Z0-9._-]+/g, '-');
283
- return { resourceKey: scope === 'shared' ? `temp:${repoId}` : `temp:${repoId}:${identity}`, mode: 'write' };
284
- }
285
-
286
- function claimNetwork(repoId: string, mode: 'read' | 'write'): ResourceClaimSpec {
287
- return { resourceKey: `network:${repoId}`, mode };
336
+ const placement = checkoutScope(checkoutId, repoId);
337
+ return { resourceKey: scope === 'shared' ? `temp:${placement}:shared` : `temp:${placement}:${identity}`, mode: 'write' };
288
338
  }
289
339
 
290
340
  function staticAnalysisCheckId(checkId: string): boolean {
@@ -303,22 +353,23 @@ function claimsForDeclaredCheckEffects(
303
353
  ): ResourceClaimSpec[] {
304
354
  const claims: ResourceClaimSpec[] = [];
305
355
  const hasDeclaredField = Object.keys(effects).length > 0;
306
- if (!hasDeclaredField) return [claimWorkspaceWrite(checkoutId)];
356
+ if (!hasDeclaredField) return [claimWorkspaceWrite(checkoutId, repoId)];
307
357
 
308
358
  // Missing read scope is unknown, so custom checks fail closed. An explicit
309
359
  // reads: [] means the command does not inspect repository content.
310
- if (effects.reads === undefined) claims.push(claimWorkspaceWrite(checkoutId));
311
- else for (const path of effects.reads) claims.push(claimPathRead(path, checkoutId));
312
- for (const path of effects.writes ?? []) claims.push(claimPathWrite(path, checkoutId));
360
+ if (effects.reads === undefined) claims.push(claimWorkspaceWrite(checkoutId, repoId));
361
+ else for (const path of effects.reads) claims.push(claimPathRead(path, checkoutId, repoId));
362
+ for (const path of effects.writes ?? []) claims.push(claimPathWrite(path, checkoutId, repoId));
313
363
 
314
364
  if (effects.cache === 'read') claims.push(claimBuildCacheRead(repoId));
315
365
  if (effects.cache === 'write') claims.push(claimBuildCacheWrite(repoId));
316
- if (effects.temp) claims.push(claimTemp(checkId, repoId, effects.temp));
317
- if (effects.git === 'read') claims.push(claimGitIndexRead(checkoutId), claimGitRefsRead(repoId));
318
- if (effects.git === 'index') claims.push(claimGitIndex(checkoutId));
366
+ if (effects.temp) claims.push(claimTemp(checkId, repoId, effects.temp, checkoutId));
367
+ if (effects.git === 'read') claims.push(claimGitIndexRead(checkoutId, repoId), claimGitRefsRead(repoId));
368
+ if (effects.git === 'index') claims.push(claimGitIndex(checkoutId, repoId));
319
369
  if (effects.git === 'refs') claims.push(claimGitRefs(repoId));
320
- if (effects.git === 'write') claims.push(claimWorkspaceWrite(checkoutId), claimGitIndex(checkoutId), claimGitRefs(repoId));
321
- if (effects.network) claims.push(claimNetwork(repoId, effects.network));
370
+ if (effects.git === 'write') claims.push(claimWorkspaceWrite(checkoutId, repoId), claimGitIndex(checkoutId, repoId), claimGitRefs(repoId));
371
+ // A generic network bit has no concrete endpoint/provider identity. Checks
372
+ // that need serialization must name the real shared target in hostServices.
322
373
  for (const service of effects.hostServices ?? []) claims.push(claimHostService(service, 'write'));
323
374
 
324
375
  return normalizeClaims(claims, { readOnly: claims.every((claim) => claim.mode === 'read') });
@@ -442,15 +493,18 @@ export function claimsForRepositoryCommand(
442
493
  if (hostClaims) return hostClaims;
443
494
 
444
495
  if (classification.risk === 'readonly') {
445
- return [claimWorkspaceRead(checkoutId)];
496
+ return [claimWorkspaceRead(checkoutId, repoId)];
446
497
  }
447
498
  if (classification.risk === 'remote_write') {
448
- return [claimRemoteMutation(repoId), claimGitRefs(repoId)];
499
+ // Raw command text cannot prove the external provider/account target. Keep
500
+ // the concrete local Git-ref fence; typed domain APIs own remote-effect
501
+ // identity, idempotency and provider-target serialization.
502
+ return [claimGitRefs(repoId)];
449
503
  }
450
504
  if (classification.risk === 'destructive') {
451
505
  return [
452
- claimWorkspaceWrite(checkoutId),
453
- claimGitIndex(checkoutId),
506
+ claimWorkspaceWrite(checkoutId, repoId),
507
+ claimGitIndex(checkoutId, repoId),
454
508
  claimGitRefs(repoId),
455
509
  ];
456
510
  }
@@ -459,22 +513,22 @@ export function claimsForRepositoryCommand(
459
513
  // while ordinary focused tests are observation unless snapshot-update mode is
460
514
  // explicit. Both can share repository source reads without a workspace writer.
461
515
  if (isTypedTypeScriptNoEmit(command)) {
462
- return [claimWorkspaceRead(checkoutId), claimBuildCacheWrite(repoId)];
516
+ return [claimWorkspaceRead(checkoutId, repoId), claimBuildCacheWrite(repoId)];
463
517
  }
464
518
  if (focused) {
465
- if (!focusedTestRequestsWorkspaceMutation(command)) return [claimWorkspaceRead(checkoutId)];
466
- const claims: ResourceClaimSpec[] = [claimWorkspaceRead(checkoutId)];
467
- for (const path of extractLikelyPaths(command).slice(0, 16)) claims.push(claimPathWrite(path, checkoutId));
519
+ if (!focusedTestRequestsWorkspaceMutation(command)) return [claimWorkspaceRead(checkoutId, repoId)];
520
+ const claims: ResourceClaimSpec[] = [claimWorkspaceRead(checkoutId, repoId)];
521
+ for (const path of extractLikelyPaths(command).slice(0, 16)) claims.push(claimPathWrite(path, checkoutId, repoId));
468
522
  return normalizeClaims(claims);
469
523
  }
470
524
  if (looksLikeBuildOrTest(command)) {
471
525
  const paths = extractLikelyPaths(command);
472
526
  if (paths.length === 0) {
473
527
  // Broad or opaque build/test commands may create arbitrary artifacts.
474
- return [claimWorkspaceWrite(checkoutId), claimBuildCacheWrite(repoId)];
528
+ return [claimWorkspaceWrite(checkoutId, repoId), claimBuildCacheWrite(repoId)];
475
529
  }
476
- const claims: ResourceClaimSpec[] = [claimWorkspaceRead(checkoutId), claimBuildCacheWrite(repoId)];
477
- for (const path of paths.slice(0, 16)) claims.push(claimPathWrite(path, checkoutId));
530
+ const claims: ResourceClaimSpec[] = [claimWorkspaceRead(checkoutId, repoId), claimBuildCacheWrite(repoId)];
531
+ for (const path of paths.slice(0, 16)) claims.push(claimPathWrite(path, checkoutId, repoId));
478
532
  return normalizeClaims(claims);
479
533
  }
480
534
 
@@ -484,23 +538,26 @@ export function claimsForRepositoryCommand(
484
538
  const sub = canonical.kind === 'argv' ? canonical.args?.[0]?.toLowerCase() : undefined;
485
539
  if (program === 'git') {
486
540
  if (sub === 'add' || sub === 'rm' || sub === 'mv' || sub === 'restore' || sub === 'apply') {
487
- return [claimGitIndex(checkoutId), claimWorkspaceWrite(checkoutId)];
541
+ return [claimGitIndex(checkoutId, repoId), claimWorkspaceWrite(checkoutId, repoId)];
488
542
  }
489
543
  if (sub === 'commit' || sub === 'merge' || sub === 'rebase' || sub === 'cherry-pick' || sub === 'revert') {
490
- return [claimGitIndex(checkoutId), claimGitRefs(repoId), claimWorkspaceWrite(checkoutId)];
544
+ return [claimGitIndex(checkoutId, repoId), claimGitRefs(repoId), claimWorkspaceWrite(checkoutId, repoId)];
491
545
  }
492
546
  if (sub === 'checkout' || sub === 'switch' || sub === 'branch' || sub === 'tag') {
493
- return [claimGitRefs(repoId), claimWorkspaceWrite(checkoutId)];
547
+ return [claimGitRefs(repoId), claimWorkspaceWrite(checkoutId, repoId)];
494
548
  }
495
549
  }
496
550
 
497
551
  // Unknown mutating command — workspace write, not heavy-check exclusive.
498
- return [claimWorkspaceWrite(checkoutId)];
552
+ return [claimWorkspaceWrite(checkoutId, repoId)];
499
553
  }
500
554
 
501
555
  /**
502
556
  * Claims for run_check by check id / command.
503
- * Only full CI / release / multi-phase checks take heavy-check exclusive.
557
+ * Full CI/release/multi-phase checks and compiler-intensive latency gates take
558
+ * heavy-check exclusive. The latter fence protects performance assertions from
559
+ * same-repository CPU/JSC contention; it does not replace their real read/cache
560
+ * claims.
504
561
  */
505
562
  export function claimsForCheck(
506
563
  checkId: string,
@@ -508,19 +565,23 @@ export function claimsForCheck(
508
565
  repoId: string,
509
566
  checkoutId?: string,
510
567
  effects?: ControllerCheckEffects,
568
+ executionAuthority?: ControllerCheckExecutionAuthority,
511
569
  ): ResourceClaimSpec[] {
512
- const heavy = /(?:^|:)(?:test(?::coverage)?|check:(?:ci|forge-runtime|public-export|release(?:-[a-z0-9-]+)?))$/.test(checkId)
570
+ const heavy = /(?:^|:)(?:test(?::coverage)?|check:(?:ci|forge-runtime|public-export|release(?:-[a-z0-9-]+)?|type|typescript-navigation))$/.test(checkId)
513
571
  || /release|migration|integrate/i.test(checkId);
514
572
  const baseClaims = effects
515
573
  ? claimsForDeclaredCheckEffects(checkId, effects, repoId, checkoutId)
516
574
  : staticAnalysisCheckId(checkId)
517
- ? [claimWorkspaceRead(checkoutId), claimBuildCacheWrite(repoId)]
575
+ ? [claimWorkspaceRead(checkoutId, repoId), claimBuildCacheWrite(repoId)]
518
576
  : command && command.length > 0
519
577
  ? claimsForRepositoryCommand(command, repoId, checkoutId)
520
- : [claimWorkspaceWrite(checkoutId)];
578
+ : [claimWorkspaceWrite(checkoutId, repoId)];
521
579
  // Heavy-check is an additional cross-check serialization fence, not a
522
580
  // substitute for the resources the check actually reads or writes.
523
- return heavy ? normalizeClaims([claimHeavyCheck(repoId), ...baseClaims]) : baseClaims;
581
+ const liveAuthorityClaims = executionAuthority === 'live_controller_home' ? [claimRelease(repoId)] : [];
582
+ return heavy
583
+ ? normalizeClaims([claimHeavyCheck(repoId), ...liveAuthorityClaims, ...baseClaims])
584
+ : normalizeClaims([...liveAuthorityClaims, ...baseClaims]);
524
585
  }
525
586
 
526
587
  export function scopeResourceClaims(
@@ -30,6 +30,9 @@ import {
30
30
  import { dirname, join } from 'path';
31
31
  import { fileURLToPath } from 'url';
32
32
  import { capProcessOutput } from '../../../effects/process-runner';
33
+ import { getRepository, selectRepositoryCheckout } from '../../../cli/repositories/registry';
34
+ import { recordProcessHandleIndexEntry } from './handle-index';
35
+ import { processScopeExecutionTarget, processScopeFromKey } from './process-scope';
33
36
  import { redactSensitiveText, sanitizeSensitiveTextFileInPlace } from '../../evidence/sensitive-output';
34
37
  import { isProcessAlive, terminateProcessTree } from '../../shared/process-tree';
35
38
  import { repositoryChildProcessEnvironment, resolveBunExecutable } from '../../shared/process-environment';
@@ -54,6 +57,13 @@ import {
54
57
  updateProcessRecord,
55
58
  } from './store';
56
59
  import { assertExecutionIdentity } from '../../control-plane/execution/execution-identity';
60
+ import { settleWorkHandleExpectedHeadAfterRepositoryCommand } from '../../control-plane/execution/work-head-settlement';
61
+ import {
62
+ clearWorkExecutionConcurrencyWaitForAttempt,
63
+ evaluateManagedProcessWorkCompatibility,
64
+ executionConcurrencyWaitProjection,
65
+ recordWorkExecutionConcurrencyWait,
66
+ } from '../../control-plane/concurrency/work-execution-concurrency';
57
67
  import {
58
68
  DEFAULT_INTERACTIVE_WAIT_MS,
59
69
  DEFAULT_MAX_OUTPUT_BYTES,
@@ -487,7 +497,7 @@ export function releaseProcessLeasesOnce(
487
497
  repoId,
488
498
  processId,
489
499
  expectedRefs,
490
- { visibility: 'ephemeral', notifyScheduler: false, invalidateProjection: false, emitRuntimeEvent: false },
500
+ { visibility: 'ephemeral', notifyScheduler: Boolean(record.workId), invalidateProjection: false, emitRuntimeEvent: false },
491
501
  );
492
502
  } catch (error) {
493
503
  // Exact-set or token mismatch remains pending and retryable. Failed cleanup
@@ -587,6 +597,38 @@ export function completeProcessFromEvidence(
587
597
  const afterTerminal = completion.record ?? getProcessRecord(controllerHome, repoId, processId);
588
598
  if (afterTerminal && (completion.ok || completion.reason === 'already_terminal' || afterTerminal.terminalWritten === true)) {
589
599
  const released = releaseProcessLeasesOnce(controllerHome, repoId, processId) ?? afterTerminal;
600
+ // Successful repository mutation settlement is deliberately downstream of
601
+ // durable terminal persistence. Recovery may repeat this block, but the
602
+ // WorkHandle CAS plus immutable expectedHead makes reconciliation idempotent.
603
+ if (
604
+ released.status === 'succeeded'
605
+ && released.exitCode === 0
606
+ && released.cancelled !== true
607
+ && released.timedOut !== true
608
+ && released.workId
609
+ && released.executionIdentity
610
+ ) {
611
+ try {
612
+ const repository = selectRepositoryCheckout(
613
+ getRepository(released.executionIdentity.repositoryId, controllerHome),
614
+ released.executionIdentity.checkoutId,
615
+ { allowArchived: released.executionIdentity.allowArchived },
616
+ );
617
+ settleWorkHandleExpectedHeadAfterRepositoryCommand({
618
+ controllerHome,
619
+ repository,
620
+ executionIdentity: released.executionIdentity,
621
+ workId: released.workId,
622
+ ok: true,
623
+ cancelled: false,
624
+ timedOut: false,
625
+ });
626
+ } catch {
627
+ // Terminal Process evidence remains valid even when its exact historical
628
+ // checkout is no longer selectable. Never infer authority from active
629
+ // checkout/session state; Work finalization will continue to fail closed.
630
+ }
631
+ }
590
632
  cleanupTerminalRunnerReceipts(released);
591
633
  return released;
592
634
  }
@@ -737,16 +779,14 @@ export function resolveProcessRunnerRuntime(
737
779
  return resolveBunExecutable(execPath, env);
738
780
  }
739
781
 
740
- function runnerInvocation(entry: string, descriptorPath: string): { command: string; args: string[] } {
782
+ export function resolveProcessRunnerInvocation(entry: string, descriptorPath: string): { command: string; args: string[] } {
741
783
  const scriptEntry = /\.(?:[cm]?js|tsx?)$/i.test(entry);
742
784
  let standalone = !scriptEntry && process.env.FORGE_RUNTIME_EXECUTION === 'standalone-binary';
743
- if (!scriptEntry && !standalone) {
744
- try {
745
- const manifest = JSON.parse(readFileSync(join(dirname(entry), 'manifest.json'), 'utf8')) as { executionMode?: unknown };
746
- standalone = manifest.executionMode === 'standalone-binary';
747
- } catch {
748
- /* source and legacy script releases have no execution manifest */
749
- }
785
+ try {
786
+ const manifest = JSON.parse(readFileSync(join(dirname(entry), 'manifest.json'), 'utf8')) as { executionMode?: unknown };
787
+ if (manifest.executionMode === 'standalone-binary') standalone = true;
788
+ } catch {
789
+ /* source and legacy script releases have no execution manifest */
750
790
  }
751
791
  const args = ['--descriptor', descriptorPath];
752
792
  return standalone
@@ -1043,6 +1083,7 @@ function recordToHandle(
1043
1083
  : completed ? safeProcessText(safeRecord.stderrTail || persistedStderr || '') : undefined,
1044
1084
  stdoutTail: safeRecord.stdoutTail ? safeProcessText(safeRecord.stdoutTail) : undefined,
1045
1085
  stderrTail: safeRecord.stderrTail ? safeProcessText(safeRecord.stderrTail) : undefined,
1086
+ concurrencyWait: safeRecord.concurrencyWait,
1046
1087
  durableSideEffects: {
1047
1088
  executionJobCount: 0,
1048
1089
  localJobCount: 0,
@@ -1061,7 +1102,7 @@ function spawnProcessRunner(descriptor: ProcessCommandDescriptor, descriptorPath
1061
1102
  writeFileSync(descriptorPath, `${JSON.stringify(descriptor, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 });
1062
1103
  const entry = resolveProcessRunnerEntryPath();
1063
1104
  const useProcessGroup = process.platform !== 'win32';
1064
- const invocation = runnerInvocation(entry, descriptorPath);
1105
+ const invocation = resolveProcessRunnerInvocation(entry, descriptorPath);
1065
1106
  // Detached so Controller crash does not kill the runner.
1066
1107
  return spawn(invocation.command, invocation.args, {
1067
1108
  cwd: descriptor.command.cwd,
@@ -1185,7 +1226,9 @@ export async function spawnManagedProcess(input: SpawnManagedProcessInput): Prom
1185
1226
  processId,
1186
1227
  repoId: input.repoId,
1187
1228
  checkoutId: input.checkoutId,
1229
+ ...(input.principalId ? { principalId: input.principalId } : {}),
1188
1230
  workId: input.workId,
1231
+ executionIdentity: input.executionIdentity,
1189
1232
  commandId: input.commandId?.trim() || processId,
1190
1233
  requestFingerprint: requestId ? commandFingerprint : undefined,
1191
1234
  checkExecution: input.checkExecution,
@@ -1213,6 +1256,16 @@ export async function spawnManagedProcess(input: SpawnManagedProcessInput): Prom
1213
1256
  logPath: stdoutPath,
1214
1257
  };
1215
1258
  createProcessRecord(record);
1259
+ // Instance-level locator so attachment resolves the target from the handle
1260
+ // instead of replaying placement inputs or scanning repository partitions.
1261
+ recordProcessHandleIndexEntry(input.controllerHome, {
1262
+ processId,
1263
+ lane: 'managed',
1264
+ target: processScopeExecutionTarget(input.controllerHome, processScopeFromKey(input.repoId)),
1265
+ principalId: input.principalId,
1266
+ workId: input.workId,
1267
+ commandId: record.commandId,
1268
+ });
1216
1269
 
1217
1270
  if (input.signal?.aborted) {
1218
1271
  completeProcessFromEvidence(input.controllerHome, input.repoId, processId, fenceToken, {
@@ -1253,6 +1306,61 @@ export async function spawnManagedProcess(input: SpawnManagedProcessInput): Prom
1253
1306
  return recordToHandle(completed!, { completed: true });
1254
1307
  }
1255
1308
 
1309
+ const leaseWaitMs = Math.max(
1310
+ 0,
1311
+ Math.min(Math.trunc(input.leaseWaitMs ?? 0), 30_000),
1312
+ );
1313
+ let compatibility = evaluateManagedProcessWorkCompatibility({
1314
+ controllerHome: input.controllerHome,
1315
+ repoId: input.repoId,
1316
+ processId,
1317
+ workId: input.workId,
1318
+ resourceClaims,
1319
+ checkExecution: input.checkExecution,
1320
+ origin: input.origin,
1321
+ });
1322
+ if (!compatibility.compatible && !compatibility.hardBlocked && leaseWaitMs > 0) {
1323
+ const semanticDeadline = Date.now() + leaseWaitMs;
1324
+ while (!compatibility.compatible && !compatibility.hardBlocked && Date.now() < semanticDeadline) {
1325
+ if (input.signal?.aborted) break;
1326
+ await new Promise((resolvePromise) => setTimeout(resolvePromise, 50));
1327
+ compatibility = evaluateManagedProcessWorkCompatibility({
1328
+ controllerHome: input.controllerHome,
1329
+ repoId: input.repoId,
1330
+ processId,
1331
+ workId: input.workId,
1332
+ resourceClaims,
1333
+ checkExecution: input.checkExecution,
1334
+ origin: input.origin,
1335
+ });
1336
+ }
1337
+ }
1338
+ if (!compatibility.compatible && compatibility.wait) {
1339
+ recordWorkExecutionConcurrencyWait({
1340
+ controllerHome: input.controllerHome,
1341
+ repoId: input.repoId,
1342
+ workId: input.workId,
1343
+ attemptId: processId,
1344
+ wait: compatibility.wait,
1345
+ resourceClaims,
1346
+ leaseRepoId: input.repoId,
1347
+ });
1348
+ updateProcessRecord(input.controllerHome, input.repoId, processId, { concurrencyWait: compatibility.wait });
1349
+ const code = compatibility.hardBlocked ? 'PROCESS_WORK_COMPATIBILITY_INVALID' : 'PROCESS_WORK_COMPATIBILITY_WAIT';
1350
+ completeProcessFromEvidence(input.controllerHome, input.repoId, processId, fenceToken, {
1351
+ status: 'failed',
1352
+ exitCode: 1,
1353
+ errorMessage: `${code}: ${compatibility.wait.blockerCode}`,
1354
+ exitReceiptPath,
1355
+ }, { authority: 'durable_pre_spawn_abandonment' });
1356
+ const blocked = getProcessRecord(input.controllerHome, input.repoId, processId)!;
1357
+ return recordToHandle(blocked, {
1358
+ completed: true,
1359
+ stdout: '',
1360
+ stderr: blocked.error?.message ?? `${code}: ${compatibility.wait.blockerCode}`,
1361
+ });
1362
+ }
1363
+
1256
1364
  // Acquire real execution leases BEFORE spawning the runner. Fail closed on conflict.
1257
1365
  let leaseRefs: ProcessLeaseRef[] = [];
1258
1366
  if (resourceClaims.length > 0) {
@@ -1313,10 +1421,6 @@ export async function spawnManagedProcess(input: SpawnManagedProcessInput): Prom
1313
1421
  // Minimal bounded queue behavior: when the caller opts in, wait for
1314
1422
  // conflicting leases to release instead of failing immediately. The Lease
1315
1423
  // store remains the single conflict authority; this loop only polls it.
1316
- const leaseWaitMs = Math.max(
1317
- 0,
1318
- Math.min(Math.trunc(input.leaseWaitMs ?? 0), 30_000),
1319
- );
1320
1424
  if (!acquisition.acquired && leaseWaitMs > 0) {
1321
1425
  const leaseDeadline = Date.now() + leaseWaitMs;
1322
1426
  while (!acquisition.acquired && Date.now() < leaseDeadline) {
@@ -1338,6 +1442,31 @@ export async function spawnManagedProcess(input: SpawnManagedProcessInput): Prom
1338
1442
  }
1339
1443
  }
1340
1444
  if (!acquisition.acquired) {
1445
+ const resourceKeys = [...new Set(acquisition.blockers.map((blocker) => blocker.resourceKey))].sort();
1446
+ const blockingWorkId = acquisition.blockers
1447
+ .map((blocker) => blocker.ownerJobId.startsWith('process:')
1448
+ ? getProcessRecord(input.controllerHome, input.repoId, blocker.ownerJobId.slice('process:'.length))?.workId
1449
+ : undefined)
1450
+ .find((value): value is string => Boolean(value));
1451
+ const wait = executionConcurrencyWaitProjection({
1452
+ source: 'resource_lease',
1453
+ blockerCode: 'resource_claim_conflict',
1454
+ disposition: 'wait',
1455
+ blockingWorkId,
1456
+ semanticScopeKeys: [],
1457
+ resourceKeys,
1458
+ wakeTrigger: { kind: 'resource_release', resourceKeys },
1459
+ });
1460
+ recordWorkExecutionConcurrencyWait({
1461
+ controllerHome: input.controllerHome,
1462
+ repoId: input.repoId,
1463
+ workId: input.workId,
1464
+ attemptId: processId,
1465
+ wait,
1466
+ resourceClaims,
1467
+ leaseRepoId: input.repoId,
1468
+ });
1469
+ updateProcessRecord(input.controllerHome, input.repoId, processId, { concurrencyWait: wait });
1341
1470
  const blockers = acquisition.blockers
1342
1471
  .map((b) => `${b.resourceKey}@${b.ownerJobId}`)
1343
1472
  .join(', ');
@@ -1363,7 +1492,8 @@ export async function spawnManagedProcess(input: SpawnManagedProcessInput): Prom
1363
1492
  checkoutId: lease.checkoutId,
1364
1493
  workId: lease.workId,
1365
1494
  }));
1366
- updateProcessRecord(input.controllerHome, input.repoId, processId, { leaseRefs });
1495
+ clearWorkExecutionConcurrencyWaitForAttempt({ controllerHome: input.controllerHome, repoId: input.repoId, workId: input.workId, attemptId: processId });
1496
+ updateProcessRecord(input.controllerHome, input.repoId, processId, { leaseRefs, concurrencyWait: undefined });
1367
1497
  }
1368
1498
 
1369
1499
  const descriptor: ProcessCommandDescriptor = {
@@ -1372,6 +1502,7 @@ export async function spawnManagedProcess(input: SpawnManagedProcessInput): Prom
1372
1502
  repoId: input.repoId,
1373
1503
  controllerHome: input.controllerHome,
1374
1504
  command,
1505
+ ...(input.trustedRuntimeChild ? { trustedRuntimeChild: input.trustedRuntimeChild } : {}),
1375
1506
  timeoutMs,
1376
1507
  maxStdoutBytes: maxOutputBytes,
1377
1508
  maxStderrBytes: maxOutputBytes,
@@ -1510,6 +1641,18 @@ function applyReceiptIfPresent(
1510
1641
  }, { authority: 'durable_exit_receipt' });
1511
1642
  }
1512
1643
 
1644
+
1645
+ function reconcileObservedTerminalProcess(
1646
+ controllerHome: string,
1647
+ repoId: string,
1648
+ record: ManagedProcessRecord,
1649
+ ): ManagedProcessRecord {
1650
+ if (record.terminalWritten !== true) return record;
1651
+ const reconciled = releaseProcessLeasesOnce(controllerHome, repoId, record.processId) ?? record;
1652
+ cleanupTerminalRunnerReceipts(reconciled);
1653
+ return reconciled;
1654
+ }
1655
+
1513
1656
  export function getProcessHandle(
1514
1657
  controllerHome: string,
1515
1658
  repoId: string,
@@ -1517,6 +1660,9 @@ export function getProcessHandle(
1517
1660
  ): ProcessHandle | undefined {
1518
1661
  const record = getProcessRecord(controllerHome, repoId, processId);
1519
1662
  if (!record) return undefined;
1663
+ if (record.terminalWritten === true) {
1664
+ return recordToHandle(reconcileObservedTerminalProcess(controllerHome, repoId, record), { completed: true });
1665
+ }
1520
1666
  if (isManagedProcessActive(record) && !liveMonitors.has(processId)) {
1521
1667
  const fromReceipt = applyReceiptIfPresent(controllerHome, repoId, processId, record);
1522
1668
  if (fromReceipt) return recordToHandle(fromReceipt, { completed: true });
@@ -1539,7 +1685,9 @@ export async function waitForProcess(
1539
1685
  ): Promise<ProcessHandle> {
1540
1686
  const existing = getProcessRecord(controllerHome, repoId, processId);
1541
1687
  if (!existing) throw new Error(`PROCESS_NOT_FOUND: ${processId}`);
1542
- if (existing.terminalWritten) return recordToHandle(existing, { completed: true });
1688
+ if (existing.terminalWritten) {
1689
+ return recordToHandle(reconcileObservedTerminalProcess(controllerHome, repoId, existing), { completed: true });
1690
+ }
1543
1691
 
1544
1692
  const monitor = liveMonitors.get(processId);
1545
1693
  if (monitor) {
@@ -1627,7 +1775,9 @@ export async function cancelProcess(
1627
1775
  ): Promise<ProcessHandle> {
1628
1776
  const record = getProcessRecord(controllerHome, repoId, processId);
1629
1777
  if (!record) throw new Error(`PROCESS_NOT_FOUND: ${processId}`);
1630
- if (record.terminalWritten) return recordToHandle(record, { completed: true });
1778
+ if (record.terminalWritten) {
1779
+ return recordToHandle(reconcileObservedTerminalProcess(controllerHome, repoId, record), { completed: true });
1780
+ }
1631
1781
 
1632
1782
  // Process control is itself a writer mutation. Fence BEFORE sending any
1633
1783
  // signal so a passive/stale runtime cannot kill the active runtime's work.