@moretea-labs/forge 1.7.2 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (685) hide show
  1. package/AGENTS.md +58 -62
  2. package/CHANGELOG.md +26 -0
  3. package/CLAUDE.md +42 -62
  4. package/README.md +2 -2
  5. package/SKILL.md +0 -1
  6. package/THIRD_PARTY_NOTICES.md +5 -2
  7. package/adapters/browser/index.ts +2 -0
  8. package/adapters/chatgpt/browser-delivery-host.ts +71 -0
  9. package/adapters/chatgpt/browser-delivery-runtime.ts +783 -0
  10. package/adapters/chatgpt/controller-binding-store.ts +55 -0
  11. package/adapters/chatgpt/controller-host.ts +119 -0
  12. package/adapters/chatgpt/controller-round-host.ts +78 -0
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +45 -0
  14. package/adapters/chatgpt/provider-delivery.ts +113 -0
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +192 -0
  16. package/adapters/chatgpt/wsl-bridge-delivery-host.ts +63 -0
  17. package/adapters/computer/desktop-operator-contract.ts +7 -0
  18. package/adapters/computer/desktop-operator-discovery.ts +201 -0
  19. package/adapters/computer/desktop-operator-negotiation.ts +174 -0
  20. package/adapters/computer/desktop-operator-provider.ts +312 -0
  21. package/adapters/computer/index.ts +1 -0
  22. package/adapters/computer/interaction-target-authority.ts +944 -0
  23. package/adapters/controller-process/binding-store.ts +34 -0
  24. package/adapters/controller-process/controller-host.ts +26 -0
  25. package/adapters/mcp/access-mode.ts +132 -0
  26. package/adapters/mcp/audit.ts +32 -0
  27. package/adapters/mcp/auth.ts +407 -0
  28. package/adapters/mcp/controller-round-compatibility.ts +184 -0
  29. package/adapters/mcp/frozen-client-semantic-compatibility.ts +292 -0
  30. package/adapters/mcp/instructions.ts +36 -0
  31. package/adapters/mcp/legacy-context.ts +18 -0
  32. package/adapters/mcp/multi-repository.ts +437 -0
  33. package/adapters/mcp/oauth.ts +391 -0
  34. package/adapters/mcp/paths.ts +140 -0
  35. package/adapters/mcp/policy.ts +232 -0
  36. package/adapters/mcp/proxy-env.ts +62 -0
  37. package/adapters/mcp/readiness-projection.ts +24 -0
  38. package/adapters/mcp/redaction.ts +21 -0
  39. package/adapters/mcp/repo.ts +24 -0
  40. package/adapters/mcp/runtime-gateway/artifact-adapter.ts +52 -0
  41. package/adapters/mcp/runtime-gateway/context-adapter.ts +829 -0
  42. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +191 -0
  43. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +147 -0
  44. package/adapters/mcp/runtime-gateway/execution-control-adapter.ts +28 -0
  45. package/adapters/mcp/runtime-gateway/execution-tools.ts +207 -0
  46. package/adapters/mcp/runtime-gateway/filesystem-adapter.ts +38 -0
  47. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +411 -0
  48. package/adapters/mcp/runtime-gateway/legacy-ios-tool-adapter.ts +105 -0
  49. package/adapters/mcp/runtime-gateway/maintenance-adapter.ts +44 -0
  50. package/adapters/mcp/runtime-gateway/model-adapter.ts +63 -0
  51. package/adapters/mcp/runtime-gateway/persisted-check-process.ts +3 -0
  52. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +308 -0
  53. package/adapters/mcp/runtime-gateway/process-tools.ts +289 -0
  54. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +76 -0
  55. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +268 -0
  56. package/adapters/mcp/runtime-gateway/recovery-client-adapter.ts +70 -0
  57. package/adapters/mcp/runtime-gateway/recovery-tool-contract.ts +99 -0
  58. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +110 -0
  59. package/adapters/mcp/runtime-gateway/result-adapter.ts +108 -0
  60. package/adapters/mcp/runtime-gateway/router.ts +728 -0
  61. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1251 -0
  62. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +634 -0
  63. package/adapters/mcp/runtime-gateway/runtime-tool-shared.ts +27 -0
  64. package/adapters/mcp/runtime-gateway/runtime-tools.ts +68 -0
  65. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +186 -0
  66. package/adapters/mcp/runtime-gateway/shared-adapter.ts +25 -0
  67. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +870 -0
  68. package/adapters/mcp/runtime-gateway/work-adapter.ts +3186 -0
  69. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +502 -0
  70. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +1 -0
  71. package/adapters/mcp/server.ts +1048 -0
  72. package/adapters/mcp/setup.ts +791 -0
  73. package/adapters/mcp/tool-capability-cache.ts +87 -0
  74. package/adapters/mcp/tool-mapping/access-tools.ts +387 -0
  75. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +5265 -0
  76. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +150 -0
  77. package/adapters/mcp/tool-mapping/repository-tools.ts +1691 -0
  78. package/adapters/mcp/tool-mapping/tools.ts +9 -0
  79. package/adapters/mcp/tool-mapping/umbrella-tools.ts +117 -0
  80. package/adapters/mcp/toolset-names.ts +74 -0
  81. package/adapters/mcp/toolset-selection.ts +41 -0
  82. package/adapters/mcp/toolset.ts +336 -0
  83. package/adapters/mcp/transports/http.ts +1456 -0
  84. package/adapters/mcp/transports/session-registry.ts +513 -0
  85. package/adapters/mcp/transports/stdio.ts +8 -0
  86. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +139 -0
  87. package/adapters/mcp/types.ts +41 -0
  88. package/assets/AGENTS.md +2 -16
  89. package/assets/CLAUDE.md +2 -16
  90. package/assets/hooks/AGENTS.md +3 -14
  91. package/assets/hooks/CLAUDE.md +3 -14
  92. package/assets/hooks/hook-input.sh +9 -2
  93. package/assets/hooks/lib/workflow-state.sh +28 -10
  94. package/assets/hooks/prompt-guard.sh +63 -37
  95. package/assets/hooks/security-sentinel.sh +2 -1
  96. package/assets/hooks/session-start-context.sh +7 -5
  97. package/assets/hooks/stop-orchestrator.sh +13 -3
  98. package/assets/initializer-question-pack.v4.json +11 -7
  99. package/assets/partials/05-workflow.partial.md +18 -73
  100. package/assets/partials/07-footer.partial.md +1 -1
  101. package/assets/partials-agents/02-operating-mode.partial.md +1 -2
  102. package/assets/partials-agents/04-task-protocol.partial.md +14 -59
  103. package/assets/partials-agents/06-quality-safety.partial.md +11 -16
  104. package/assets/partials-agents/08-deep-docs.partial.md +1 -2
  105. package/assets/plan-map.json +11 -11
  106. package/assets/plugin-registry.v1.json +9 -3
  107. package/assets/plugin-trust-policy.v1.json +6 -0
  108. package/assets/recovery/ForgeRecovery.ps1 +100 -0
  109. package/assets/recovery/forge-wsl-rescue +271 -0
  110. package/assets/reference-configs/development-protocol.md +11 -15
  111. package/assets/reference-configs/document-generation.md +1 -1
  112. package/assets/reference-configs/global-working-rules.md +9 -1
  113. package/assets/reference-configs/harness-overview.md +22 -112
  114. package/assets/reference-configs/hook-operations.md +1 -1
  115. package/assets/reference-configs/sprint-contracts.md +2 -2
  116. package/assets/skill-version.json +2 -2
  117. package/assets/templates/helpers/architecture-event.ts +3 -34
  118. package/assets/templates/helpers/architecture-queue.sh +61 -10
  119. package/assets/templates/helpers/archive-workflow.sh +90 -180
  120. package/assets/templates/helpers/capability-config.ts +8 -11
  121. package/assets/templates/helpers/capability-resolver.ts +37 -19
  122. package/assets/templates/helpers/capture-plan.sh +2 -2
  123. package/assets/templates/helpers/check-architecture-sync.sh +1 -9
  124. package/assets/templates/helpers/check-task-sync.sh +82 -11
  125. package/assets/templates/helpers/check-task-workflow.sh +1 -3
  126. package/assets/templates/helpers/context-contract-sync.sh +1 -12
  127. package/assets/templates/helpers/contract-worktree.sh +26 -24
  128. package/assets/templates/helpers/ensure-task-workflow.sh +6 -8
  129. package/assets/templates/helpers/inspect-project-state.ts +1 -1
  130. package/assets/templates/helpers/migrate-project-template.sh +1 -1
  131. package/assets/templates/helpers/migrate-workflow-docs.ts +53 -239
  132. package/assets/templates/helpers/new-plan.sh +2 -2
  133. package/assets/templates/helpers/plan-to-todo.sh +3 -31
  134. package/assets/templates/helpers/sprint-backlog.sh +1 -1
  135. package/assets/templates/helpers/switch-plan.sh +1 -1
  136. package/assets/templates/helpers/workflow-contract.ts +1 -0
  137. package/assets/workflow-contract.v1.json +63 -171
  138. package/assets/workflows/xiaohongshu/xiaohongshu.collect-metrics.v1.draft.json +118 -0
  139. package/assets/workflows/xiaohongshu/xiaohongshu.publish-image-note.v1.draft.json +316 -0
  140. package/assets/workflows/xiaohongshu/xiaohongshu.publish-long-text.v1.draft.json +324 -0
  141. package/docs/architecture/CURRENT.md +148 -13
  142. package/docs/architecture/EVOLUTION.md +13 -0
  143. package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +2 -1
  144. package/docs/architecture/decisions/20260831-independent-windows-wsl-host-rescue.md +59 -0
  145. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +120 -0
  146. package/docs/architecture/decisions/20260904-repository-runtime-data-boundary.md +42 -0
  147. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +35 -0
  148. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +296 -0
  149. package/docs/architecture/decisions/20260907-maintenance-diagnosis-bounded-read.md +39 -0
  150. package/docs/architecture/domains/verification.md +7 -0
  151. package/docs/architecture/domains/workflow-engine.md +1 -1
  152. package/docs/architecture/index.md +3 -3
  153. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +19 -8
  154. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +124 -0
  155. package/docs/forge-chatgpt-mcp-setup.md +5 -3
  156. package/docs/forge-plugin-management.md +20 -4
  157. package/docs/forge-runtime-self-healing-loop.md +2 -0
  158. package/docs/operations/benchmark-cross-version-freeze.md +38 -0
  159. package/docs/operations/controller-browser-plugin.md +3 -1
  160. package/docs/operations/homebrew.md +2 -2
  161. package/docs/operations/platform-support.md +16 -8
  162. package/docs/operations/platform-support.zh-CN.md +2 -2
  163. package/docs/operations/standalone-disaster-recovery.md +26 -1
  164. package/docs/operations/uu-remote-rescue.md +41 -0
  165. package/docs/operations/windows-wsl-host-rescue.md +133 -0
  166. package/docs/public-usage-guide.md +1 -1
  167. package/docs/public-usage-guide.zh-CN.md +1 -1
  168. package/docs/tutorials/01-install-and-start.md +1 -1
  169. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  170. package/docs/tutorials/02-connect-chatgpt.md +4 -4
  171. package/docs/tutorials/02-connect-chatgpt.zh-CN.md +4 -4
  172. package/docs/wiki/Implementation.md +1 -1
  173. package/package.json +23 -14
  174. package/packages/kernel/controller/api/index.ts +2 -0
  175. package/packages/kernel/controller/application/controller-round-service.ts +29 -0
  176. package/packages/kernel/controller/application/controller-service.ts +30 -0
  177. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +308 -0
  178. package/packages/kernel/controller/domain/controller-round.ts +107 -0
  179. package/packages/kernel/controller/domain/execution-quality.ts +133 -0
  180. package/packages/kernel/controller/domain/types.ts +56 -0
  181. package/packages/kernel/controller/index.ts +1 -0
  182. package/packages/kernel/controller/infrastructure/controller-binding-store.ts +84 -0
  183. package/packages/kernel/controller/infrastructure/controller-round-store.ts +1384 -0
  184. package/packages/kernel/controller/infrastructure/controller-session-store.ts +578 -0
  185. package/packages/kernel/controller/ports/controller-host.ts +16 -0
  186. package/packages/kernel/goal/api/index.ts +1 -0
  187. package/packages/kernel/goal/domain/types.ts +40 -0
  188. package/packages/kernel/goal/index.ts +1 -0
  189. package/packages/kernel/identity/api/index.ts +5 -0
  190. package/packages/kernel/identity/application/identity-service.ts +67 -0
  191. package/packages/kernel/identity/domain/scope.ts +63 -0
  192. package/packages/kernel/identity/domain/semantic-sync.ts +81 -0
  193. package/packages/kernel/identity/domain/types.ts +44 -0
  194. package/packages/kernel/identity/domain/workspace.ts +56 -0
  195. package/packages/kernel/identity/index.ts +1 -0
  196. package/packages/kernel/identity/infrastructure/identity-store.ts +75 -0
  197. package/packages/kernel/memory/api/index.ts +5 -0
  198. package/packages/kernel/memory/application/experience-service.ts +118 -0
  199. package/packages/kernel/memory/application/outcome-service.ts +77 -0
  200. package/packages/kernel/memory/domain/experience.ts +103 -0
  201. package/packages/kernel/memory/domain/operational-prior.ts +92 -0
  202. package/packages/kernel/memory/index.ts +1 -0
  203. package/packages/kernel/progression/api/index.ts +2 -0
  204. package/packages/kernel/progression/application/projector.ts +211 -0
  205. package/packages/kernel/progression/domain/types.ts +116 -0
  206. package/packages/kernel/progression/index.ts +1 -0
  207. package/packages/kernel/scheduler/api/index.ts +6 -0
  208. package/packages/kernel/scheduler/application/continuation-service.ts +212 -0
  209. package/packages/kernel/scheduler/application/eligibility.ts +252 -0
  210. package/packages/kernel/scheduler/application/schedule-service.ts +24 -0
  211. package/packages/kernel/scheduler/application/settlement.ts +197 -0
  212. package/packages/kernel/scheduler/domain/continuation.ts +38 -0
  213. package/packages/kernel/scheduler/domain/schedule.ts +149 -0
  214. package/packages/kernel/scheduler/index.ts +1 -0
  215. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +38 -0
  216. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +785 -0
  217. package/packages/kernel/work/api/index.ts +15 -0
  218. package/packages/kernel/work/application/work-service.ts +148 -0
  219. package/packages/kernel/work/domain/admission-policy.ts +34 -0
  220. package/packages/kernel/work/domain/check-receipt.ts +43 -0
  221. package/packages/kernel/work/domain/context-closure-receipt.ts +32 -0
  222. package/packages/kernel/work/domain/engineering-contracts.ts +157 -0
  223. package/packages/kernel/work/domain/engineering-design.ts +281 -0
  224. package/packages/kernel/work/domain/engineering-profile.ts +242 -0
  225. package/packages/kernel/work/domain/execution-concurrency.ts +254 -0
  226. package/packages/kernel/work/domain/execution-snapshot.ts +33 -0
  227. package/packages/kernel/work/domain/implementation-review.ts +510 -0
  228. package/packages/kernel/work/domain/project-engineering-contract.ts +202 -0
  229. package/packages/kernel/work/domain/repository-completion-receipt.ts +73 -0
  230. package/packages/kernel/work/domain/state-machine.ts +259 -0
  231. package/packages/kernel/work/domain/types.ts +528 -0
  232. package/packages/kernel/work/index.ts +1 -0
  233. package/packages/kernel/work/infrastructure/work-contract-store.ts +1876 -0
  234. package/packages/kernel/work/ports/work-contract-store.ts +18 -0
  235. package/packages/plugin-runtime/browser/index.ts +3 -0
  236. package/packages/plugin-runtime/browser/provider-registry.ts +110 -0
  237. package/packages/plugin-runtime/browser/runtime-contract.ts +150 -0
  238. package/packages/plugin-runtime/browser/session-authority.ts +61 -0
  239. package/packages/plugin-runtime/computer/index.ts +6 -0
  240. package/packages/plugin-runtime/computer/provider-error.ts +26 -0
  241. package/packages/plugin-runtime/computer/provider-registration.ts +52 -0
  242. package/packages/plugin-runtime/computer/provider-registry.ts +63 -0
  243. package/packages/plugin-runtime/computer/provider.ts +19 -0
  244. package/packages/plugin-runtime/computer/target-authority.ts +190 -0
  245. package/packages/plugin-runtime/computer/target-persistence.ts +54 -0
  246. package/packages/plugin-runtime/external/index.ts +1 -0
  247. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +457 -0
  248. package/packages/plugin-runtime/index.ts +3 -0
  249. package/packages/protocols/browser/index.ts +1 -0
  250. package/packages/protocols/browser/session.ts +98 -0
  251. package/packages/protocols/computer/contract.ts +199 -0
  252. package/packages/protocols/computer/index.ts +1 -0
  253. package/packages/protocols/failure/contract.ts +158 -0
  254. package/packages/protocols/failure/index.ts +1 -0
  255. package/packages/protocols/handoff/index.ts +1 -0
  256. package/packages/protocols/handoff/status.ts +22 -0
  257. package/packages/protocols/mcp/execution-context.ts +11 -0
  258. package/packages/protocols/mcp/index.ts +2 -0
  259. package/packages/protocols/mcp/tool-contract.ts +42 -0
  260. package/packages/workflow-runtime/api/index.ts +2 -0
  261. package/packages/workflow-runtime/application/interpreter.ts +342 -0
  262. package/packages/workflow-runtime/domain/workflow-asset.ts +223 -0
  263. package/packages/workflow-runtime/index.ts +1 -0
  264. package/scripts/assemble-template.ts +1 -1
  265. package/scripts/benchmark-computer-hotpath.ts +255 -0
  266. package/scripts/benchmark-controller-round2.ts +54 -2
  267. package/scripts/benchmark-ios-agent-device.ts +3 -6
  268. package/scripts/benchmark-mcp-transport.ts +3 -4
  269. package/scripts/benchmark-operational-memory-activation.ts +235 -0
  270. package/scripts/benchmark-operational-shadow.ts +28 -0
  271. package/scripts/bootstrap-runtime-maintenance-recovery.sh +4 -1
  272. package/scripts/canary-chatgpt-provider-delivery.ts +97 -0
  273. package/scripts/canary-controller-semantic-wait.ts +195 -0
  274. package/scripts/canary-global-hook.sh +2 -2
  275. package/scripts/check-mcp-compatibility.ts +173 -7
  276. package/scripts/check-platform-support.mjs +28 -2
  277. package/scripts/check-public-docs.sh +1 -1
  278. package/scripts/check-release-readiness.sh +1 -1
  279. package/scripts/check-repository-hygiene.mjs +92 -0
  280. package/scripts/check-runtime-architecture.mjs +1206 -95
  281. package/scripts/check-source-duplication.mjs +9 -1
  282. package/scripts/check-tarball-install-smoke.sh +98 -15
  283. package/scripts/controller-ngrok-rotation.sh +5 -4
  284. package/scripts/create-project-dirs.sh +10 -74
  285. package/scripts/forge-local-recovery-helper.mjs +204 -0
  286. package/scripts/forge-uu-remote-rescue-helper.d.mts +31 -0
  287. package/scripts/forge-uu-remote-rescue-helper.mjs +409 -0
  288. package/scripts/forge-windows-host-recovery-helper.mjs +136 -0
  289. package/scripts/hook-shim.sh +2 -2
  290. package/scripts/init-project.sh +12 -70
  291. package/scripts/install-desktop-operator-registration.ts +4 -2
  292. package/scripts/install-independent-windows-wsl-recovery.ts +125 -0
  293. package/scripts/install-standalone-recovery.ts +122 -10
  294. package/scripts/install-uu-remote-rescue-registration.ts +74 -0
  295. package/scripts/install-windows-host-recovery-registration.ts +22 -0
  296. package/scripts/lib/controller-home-env.sh +6 -3
  297. package/scripts/lib/project-init-lib.sh +39 -582
  298. package/scripts/migrate-chatgpt-automation-schedules.ts +2 -2
  299. package/scripts/migrate-windows-wsl-controller-home.ts +306 -0
  300. package/scripts/open-source-audit-allowlist.txt +12 -1
  301. package/scripts/portability-bindings.mjs +70 -0
  302. package/scripts/run-bounded-command.mjs +55 -0
  303. package/scripts/run-bun-test-file.ts +22 -6
  304. package/scripts/run-governed-gate.ts +4 -1
  305. package/scripts/smoke-mcp-http-runtime.ts +1 -1
  306. package/scripts/smoke-runtime-recovery.ts +34 -1
  307. package/scripts/smoke-schedule-engine.ts +1 -1
  308. package/scripts/stage-runtime-release.ts +6 -1
  309. package/scripts/test-governance.ts +51 -2
  310. package/src/cli/agent-jobs/job-manager.ts +10 -1
  311. package/src/cli/chatgpt-browser/bind-server.ts +2 -1
  312. package/src/cli/chatgpt-browser/binding.ts +20 -10
  313. package/src/cli/chatgpt-browser/bridge-extension.ts +75 -0
  314. package/src/cli/chatgpt-browser/bridge-provider.ts +376 -11
  315. package/src/cli/chatgpt-browser/engine.ts +10 -11
  316. package/src/cli/chatgpt-browser/native-provider.ts +24 -83
  317. package/src/cli/chatgpt-browser/oracle-provider.ts +5 -3
  318. package/src/cli/chatgpt-browser/types.ts +1 -0
  319. package/src/cli/commands/bootstrap-control.ts +334 -0
  320. package/src/cli/commands/brain-assistant.ts +38 -0
  321. package/src/cli/commands/brain.ts +193 -40
  322. package/src/cli/commands/chatgpt.ts +127 -0
  323. package/src/cli/commands/computer.ts +437 -0
  324. package/src/cli/commands/doctor.ts +18 -1
  325. package/src/cli/commands/init-hook.ts +71 -61
  326. package/src/cli/commands/init.ts +3 -1
  327. package/src/cli/commands/mcp.ts +16 -10
  328. package/src/cli/commands/plugin.ts +38 -12
  329. package/src/cli/commands/recovery.ts +493 -80
  330. package/src/cli/commands/runtime.ts +9 -4
  331. package/src/cli/commands/setup-profile.ts +89 -39
  332. package/src/cli/commands/status.ts +2 -1
  333. package/src/cli/controller/check-runner.ts +487 -98
  334. package/src/cli/controller/context/types.ts +7 -1
  335. package/src/cli/controller/context-pack.ts +23 -3
  336. package/src/cli/controller/issue-store.ts +1 -1
  337. package/src/cli/controller/systemd-user.ts +110 -0
  338. package/src/cli/controller/types.ts +10 -70
  339. package/src/cli/controller/worklog.ts +67 -13
  340. package/src/cli/editing/edit-operation-contract.ts +92 -0
  341. package/src/cli/editing/edit-session.ts +289 -13
  342. package/src/cli/github/plugin.ts +17 -12
  343. package/src/cli/hook/route-registry.ts +3 -5
  344. package/src/cli/hook/runtime.ts +49 -3
  345. package/src/cli/index.ts +3 -0
  346. package/src/cli/local-bridge/connector-freshness.ts +2 -2
  347. package/src/cli/local-bridge/console-automations.ts +2 -2
  348. package/src/cli/local-bridge/facade-api.ts +41 -14
  349. package/src/cli/local-bridge/job-store.ts +1 -1
  350. package/src/cli/local-bridge/server.ts +24 -27
  351. package/src/cli/mcp/access-mode.ts +2 -132
  352. package/src/cli/mcp/access-tools.ts +2 -387
  353. package/src/cli/mcp/audit.ts +2 -32
  354. package/src/cli/mcp/auth.ts +2 -404
  355. package/src/cli/mcp/instructions.ts +2 -34
  356. package/src/cli/mcp/legacy-context.ts +2 -16
  357. package/src/cli/mcp/legacy-tool-service.ts +2 -5308
  358. package/src/cli/mcp/multi-repository.ts +2 -436
  359. package/src/cli/mcp/oauth.ts +2 -375
  360. package/src/cli/mcp/openai-secure-tunnel.ts +2 -0
  361. package/src/cli/mcp/paths.ts +2 -140
  362. package/src/cli/mcp/policy.ts +2 -232
  363. package/src/cli/mcp/post-finalize-work-attribution.ts +2 -150
  364. package/src/cli/mcp/proxy-env.ts +2 -62
  365. package/src/cli/mcp/readiness-projection.ts +2 -24
  366. package/src/cli/mcp/redaction.ts +2 -21
  367. package/src/cli/mcp/repo.ts +2 -24
  368. package/src/cli/mcp/repository-tools.ts +2 -1613
  369. package/src/cli/mcp/server.ts +2 -951
  370. package/src/cli/mcp/setup.ts +2 -737
  371. package/src/cli/mcp/tool-capability-cache.ts +2 -87
  372. package/src/cli/mcp/tool-contract.ts +2 -14
  373. package/src/cli/mcp/tools.ts +2 -9
  374. package/src/cli/mcp/toolset-names.ts +2 -70
  375. package/src/cli/mcp/toolset-selection.ts +2 -41
  376. package/src/cli/mcp/toolset.ts +2 -336
  377. package/src/cli/mcp/transports/AGENTS.md +1 -10
  378. package/src/cli/mcp/transports/CLAUDE.md +1 -10
  379. package/src/cli/mcp/transports/http.ts +2 -1414
  380. package/src/cli/mcp/transports/session-registry.ts +2 -490
  381. package/src/cli/mcp/transports/stdio.ts +2 -8
  382. package/src/cli/mcp/types.ts +2 -41
  383. package/src/cli/mcp/umbrella-tools.ts +2 -117
  384. package/src/cli/repositories/command-executor.ts +64 -18
  385. package/src/cli/repositories/command-scope.ts +117 -1
  386. package/src/cli/repositories/controller-home.ts +119 -1
  387. package/src/cli/repositories/identity.ts +13 -0
  388. package/src/cli/repositories/registry.ts +68 -49
  389. package/src/cli/repositories/repository-snapshot.ts +53 -7
  390. package/src/cli/repositories/runtime-storage.ts +27 -2
  391. package/src/cli/repositories/safe-patch.ts +34 -38
  392. package/src/cli/repositories/selected-path-actions.ts +22 -2
  393. package/src/cli/repositories/structured-git.ts +105 -25
  394. package/src/cli/runtime/helper-runner.ts +7 -0
  395. package/src/cli/runtime-invocation.ts +8 -1
  396. package/src/cli/tools/codegraph.ts +44 -25
  397. package/src/core/adoption/manifest-templates.ts +1 -1
  398. package/src/core/adoption/plan.ts +3 -26
  399. package/src/core/adoption/workflow-contract-plan.ts +17 -9
  400. package/src/effects/process-runner.ts +8 -14
  401. package/src/runtime/context/assistant-context.ts +154 -0
  402. package/src/runtime/context/assistant-work-context.ts +147 -0
  403. package/src/runtime/context/codegraph-cache-boundary.ts +255 -0
  404. package/src/runtime/context/codegraph-read-provider.ts +55 -22
  405. package/src/runtime/context/codegraph-sidecar.cjs +8 -1
  406. package/src/runtime/context/context-closure.ts +268 -0
  407. package/src/runtime/context/context-plane.ts +211 -0
  408. package/src/runtime/context/project-engineering-contract.ts +60 -0
  409. package/src/runtime/control-plane/bootstrap/capability-provider.ts +74 -0
  410. package/src/runtime/control-plane/bootstrap/control-api.ts +57 -0
  411. package/src/runtime/control-plane/bootstrap/index.ts +5 -0
  412. package/src/runtime/control-plane/bootstrap/state-machine.ts +141 -0
  413. package/src/runtime/control-plane/bootstrap/store.ts +21 -0
  414. package/src/runtime/control-plane/bootstrap/types.ts +87 -0
  415. package/src/runtime/control-plane/cleanup-artifact-retention.ts +328 -0
  416. package/src/runtime/control-plane/codegraph-cache-retention.ts +164 -0
  417. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +320 -0
  418. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +169 -0
  419. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +350 -0
  420. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +85 -0
  421. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +369 -99
  422. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +103 -15
  423. package/src/runtime/control-plane/execution/implementation-review-content.ts +95 -0
  424. package/src/runtime/control-plane/execution/repository-work-attribution.ts +2 -2
  425. package/src/runtime/control-plane/execution/retained-work-resume.ts +336 -6
  426. package/src/runtime/control-plane/execution/validation.ts +28 -3
  427. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +116 -0
  428. package/src/runtime/control-plane/execution/work-completion-authority.ts +44 -2
  429. package/src/runtime/control-plane/execution/work-evidence-policy.ts +34 -3
  430. package/src/runtime/control-plane/execution/work-execution-support.ts +42 -22
  431. package/src/runtime/control-plane/execution/work-finalization-service.ts +1103 -166
  432. package/src/runtime/control-plane/execution/work-handle-authority.ts +219 -22
  433. package/src/runtime/control-plane/execution/work-handle-store.ts +77 -0
  434. package/src/runtime/control-plane/execution/work-head-settlement.ts +75 -0
  435. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +145 -23
  436. package/src/runtime/control-plane/execution/work-operation-service.ts +49 -13
  437. package/src/runtime/control-plane/execution/work-preparation-service.ts +31 -15
  438. package/src/runtime/control-plane/execution/work-remote-delivery.ts +1 -1
  439. package/src/runtime/control-plane/execution/work-task-receipt.ts +20 -1
  440. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +407 -76
  441. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +88 -18
  442. package/src/runtime/control-plane/execution/work-verification-context.ts +1 -1
  443. package/src/runtime/control-plane/execution/work-verification-service.ts +258 -4
  444. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +200 -15
  445. package/src/runtime/control-plane/facade/capability-registry.ts +21 -10
  446. package/src/runtime/control-plane/facade/controller-round-relay.ts +3 -1118
  447. package/src/runtime/control-plane/facade/controller-session-store.ts +2 -488
  448. package/src/runtime/control-plane/facade/goal-workloop-access.ts +6 -3
  449. package/src/runtime/control-plane/facade/goal-workloop.ts +972 -137
  450. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +158 -0
  451. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +10 -0
  452. package/src/runtime/control-plane/facade/index.ts +4 -2
  453. package/src/runtime/control-plane/facade/operation-digest.ts +22 -58
  454. package/src/runtime/control-plane/facade/plan-contract-store.ts +1004 -38
  455. package/src/runtime/control-plane/facade/repository-work-admission.ts +19 -1
  456. package/src/runtime/control-plane/facade/requirement-authority.ts +218 -0
  457. package/src/runtime/control-plane/facade/requirement-board.ts +6 -1
  458. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +48 -0
  459. package/src/runtime/control-plane/facade/semantic-admission.ts +8 -16
  460. package/src/runtime/control-plane/facade/suggested-actions.ts +4 -1
  461. package/src/runtime/control-plane/facade/types.ts +189 -532
  462. package/src/runtime/control-plane/facade/work-admission-policy.ts +84 -35
  463. package/src/runtime/control-plane/facade/work-contract-store.ts +2 -1043
  464. package/src/runtime/control-plane/facade/work-implementation-review.ts +2 -0
  465. package/src/runtime/control-plane/facade/work-state-machine.ts +2 -250
  466. package/src/runtime/control-plane/generated-cache-retention.ts +239 -18
  467. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +12 -1
  468. package/src/runtime/control-plane/global-scheduler/maintenance.ts +76 -13
  469. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-entry.ts +55 -0
  470. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-process.ts +98 -0
  471. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +1 -1
  472. package/src/runtime/control-plane/global-scheduler/scheduler-worker-entry.ts +10 -0
  473. package/src/runtime/control-plane/global-scheduler/scheduler.ts +173 -81
  474. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +18 -6
  475. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +397 -0
  476. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +2 -177
  477. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +301 -560
  478. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +20 -4
  479. package/src/runtime/control-plane/launcher/thin-launcher.ts +50 -4
  480. package/src/runtime/control-plane/lifecycle-retention-metrics.ts +60 -0
  481. package/src/runtime/control-plane/persistence/experience-store.ts +169 -0
  482. package/src/runtime/control-plane/persistence/operational-prior-store.ts +348 -0
  483. package/src/runtime/control-plane/persistence/requirement-store.ts +30 -22
  484. package/src/runtime/control-plane/persistence/sqlite-store.ts +545 -76
  485. package/src/runtime/control-plane/persistence/workflow-content-store.ts +98 -0
  486. package/src/runtime/control-plane/persistence/workflow-registry-store.ts +186 -0
  487. package/src/runtime/control-plane/persistence/workflow-run-store.ts +123 -0
  488. package/src/runtime/control-plane/release-retention.ts +56 -16
  489. package/src/runtime/control-plane/repository-namespace-retention.ts +208 -0
  490. package/src/runtime/control-plane/routing/route-policy.ts +19 -0
  491. package/src/runtime/control-plane/runtime-cleanup.ts +574 -37
  492. package/src/runtime/control-plane/runtime-generation.ts +6 -0
  493. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +465 -0
  494. package/src/runtime/control-plane/workspace/workspace-store.ts +80 -0
  495. package/src/runtime/diagnostics/incident-repair.ts +406 -0
  496. package/src/runtime/diagnostics/mcp-timing.ts +125 -6
  497. package/src/runtime/diagnostics/performance.ts +6 -14
  498. package/src/runtime/diagnostics/read-only-tool.ts +1 -1
  499. package/src/runtime/evidence/artifact-store.ts +65 -2
  500. package/src/runtime/evidence/operational-shadow.ts +38 -0
  501. package/src/runtime/evidence/process-check-receipt.ts +5 -43
  502. package/src/runtime/evidence/sensitive-output.ts +4 -4
  503. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -1
  504. package/src/runtime/execution/jobs/store.ts +121 -2
  505. package/src/runtime/execution/managed-workspace.ts +55 -5
  506. package/src/runtime/execution/process-runtime/canary.ts +19 -5
  507. package/src/runtime/execution/process-runtime/check-classification.ts +48 -0
  508. package/src/runtime/execution/process-runtime/check-facade.ts +23 -9
  509. package/src/runtime/execution/process-runtime/check-receipt.ts +1 -1
  510. package/src/runtime/execution/process-runtime/check-result-retention.ts +132 -0
  511. package/src/runtime/execution/process-runtime/check-result.ts +73 -2
  512. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +42 -3
  513. package/src/runtime/execution/process-runtime/check-storage.ts +187 -0
  514. package/src/runtime/execution/process-runtime/command-facade.ts +38 -87
  515. package/src/runtime/execution/process-runtime/index.ts +1 -0
  516. package/src/runtime/execution/process-runtime/interactive-admission.ts +2 -1
  517. package/src/runtime/execution/process-runtime/lightweight-managed.ts +32 -1
  518. package/src/runtime/execution/process-runtime/persisted-check.ts +128 -21
  519. package/src/runtime/execution/process-runtime/resource-claims.ts +60 -3
  520. package/src/runtime/execution/process-runtime/runtime.ts +132 -15
  521. package/src/runtime/execution/process-runtime/types.ts +22 -0
  522. package/src/runtime/execution/workers/executor.ts +16 -13
  523. package/src/runtime/execution/workers/worker-entry.ts +1 -1
  524. package/src/runtime/gateway/mcp/execution-tools.ts +2 -207
  525. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +2 -61
  526. package/src/runtime/gateway/mcp/persisted-check-process.ts +2 -3
  527. package/src/runtime/gateway/mcp/process-tools.ts +2 -289
  528. package/src/runtime/gateway/mcp/router.ts +2 -1125
  529. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +2 -565
  530. package/src/runtime/gateway/mcp/runtime-tools.ts +2 -6655
  531. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +2 -1
  532. package/src/runtime/maintenance/cleanup.ts +38 -24
  533. package/src/runtime/platform/browser-product-discovery.ts +174 -0
  534. package/src/runtime/platform/computer-platform.ts +14 -0
  535. package/src/runtime/platform/executable-discovery.ts +54 -0
  536. package/src/runtime/platform/fetch-http-server.ts +90 -0
  537. package/src/runtime/platform/service-manager.ts +138 -0
  538. package/src/runtime/platform/windows-host-discovery.ts +118 -0
  539. package/src/runtime/platform/windows-recovery-deployment.ts +67 -0
  540. package/src/runtime/plugins/action-application.ts +135 -0
  541. package/src/runtime/plugins/app-store-connect-adapter.ts +9 -21
  542. package/src/runtime/plugins/browser-adapter.ts +140 -100
  543. package/src/runtime/plugins/browser-automation-service.ts +15 -36
  544. package/src/runtime/plugins/browser-macos-bridge.ts +69 -21
  545. package/src/runtime/plugins/browser-manifest-surface.ts +30 -6
  546. package/src/runtime/plugins/browser-native-session-service.ts +1 -1
  547. package/src/runtime/plugins/browser-provider-registry.ts +2 -109
  548. package/src/runtime/plugins/browser-registration.ts +16 -0
  549. package/src/runtime/plugins/browser-runtime-contract.ts +2 -154
  550. package/src/runtime/plugins/browser-runtime.ts +41 -9
  551. package/src/runtime/plugins/browser-session-authority.ts +101 -291
  552. package/src/runtime/plugins/browser-session-legacy-migration.ts +203 -0
  553. package/src/runtime/plugins/browser-session-store.ts +229 -36
  554. package/src/runtime/plugins/browser-session-types.ts +2 -98
  555. package/src/runtime/plugins/capability-authorization-grants.ts +17 -0
  556. package/src/runtime/plugins/catalog-trust.ts +82 -0
  557. package/src/runtime/plugins/computer-registration.ts +839 -0
  558. package/src/runtime/plugins/config-store.ts +119 -0
  559. package/src/runtime/plugins/desktop-operator-external-policy.ts +932 -0
  560. package/src/runtime/plugins/desktop-operator-registration.ts +111 -8
  561. package/src/runtime/plugins/errors.ts +8 -1
  562. package/src/runtime/plugins/external-adapter.ts +45 -322
  563. package/src/runtime/plugins/external-provider-policy.ts +48 -0
  564. package/src/runtime/plugins/external-registration.ts +9 -1
  565. package/src/runtime/plugins/external-unix-socket-probe.cjs +9 -3
  566. package/src/runtime/plugins/external-unix-socket.ts +64 -193
  567. package/src/runtime/plugins/first-party-external-registration.ts +163 -0
  568. package/src/runtime/plugins/first-party-registry.ts +3 -1
  569. package/src/runtime/plugins/github-adapter.ts +1 -2
  570. package/src/runtime/plugins/gmail-adapter.ts +6 -6
  571. package/src/runtime/plugins/google-calendar-adapter.ts +6 -6
  572. package/src/runtime/plugins/google-shared.ts +31 -46
  573. package/src/runtime/plugins/google-tasks-adapter.ts +6 -6
  574. package/src/runtime/plugins/ios-adapter.ts +1 -2
  575. package/src/runtime/plugins/local-system-adapter.ts +180 -0
  576. package/src/runtime/plugins/macos-capability-broker.ts +15 -105
  577. package/src/runtime/plugins/resend-adapter.ts +15 -24
  578. package/src/runtime/plugins/store.ts +493 -51
  579. package/src/runtime/plugins/types.ts +8 -1
  580. package/src/runtime/plugins/uu-remote-rescue-registration.ts +155 -0
  581. package/src/runtime/plugins/windows-host-recovery-install.ts +68 -0
  582. package/src/runtime/plugins/windows-host-recovery-registration.ts +85 -0
  583. package/src/runtime/plugins/xiaohongshu-publish.ts +86 -430
  584. package/src/runtime/projections/controller-context.ts +12 -6
  585. package/src/runtime/projections/git-status-sampler.ts +73 -22
  586. package/src/runtime/projections/materialized-view.ts +14 -8
  587. package/src/runtime/recovery/capability-action-application.ts +228 -0
  588. package/src/runtime/recovery/index.ts +3 -0
  589. package/src/runtime/recovery/lifecycle-inventory.ts +338 -0
  590. package/src/runtime/recovery/local-jobs-repair.ts +14 -14
  591. package/src/runtime/recovery/maintenance-executor.ts +358 -76
  592. package/src/runtime/recovery/quarantine-retention.ts +256 -0
  593. package/src/runtime/release/identity.ts +6 -0
  594. package/src/runtime/resources/leases/store.ts +1 -1
  595. package/src/runtime/root/active-execution-power-assertion.ts +139 -0
  596. package/src/runtime/root/assistant-learning-loop.ts +45 -0
  597. package/src/runtime/root/browser-session-composition.ts +59 -0
  598. package/src/runtime/root/computer-composition.ts +191 -0
  599. package/src/runtime/root/computer-target-composition.ts +16 -0
  600. package/src/runtime/root/computer-target-persistence.ts +39 -0
  601. package/src/runtime/root/controller-round-composition.ts +107 -0
  602. package/src/runtime/root/controller-services.ts +2 -0
  603. package/src/runtime/root/entry.ts +4 -3
  604. package/src/runtime/root/gateway-adapter.ts +3 -3
  605. package/src/runtime/root/local-bridge.ts +5 -2
  606. package/src/runtime/root/mcp-transport.ts +5 -5
  607. package/src/runtime/root/package-connector-service.ts +108 -56
  608. package/src/runtime/root/package-runtime-release.ts +85 -18
  609. package/src/runtime/root/package-runtime-service.ts +60 -97
  610. package/src/runtime/root/release-execution-canary.ts +71 -0
  611. package/src/runtime/root/release-loader.ts +68 -0
  612. package/src/runtime/root/release-manifest.ts +106 -2
  613. package/src/runtime/root/release-materialize.ts +103 -4
  614. package/src/runtime/root/release-store.ts +31 -2
  615. package/src/runtime/root/runtime.ts +240 -25
  616. package/src/runtime/root/scheduled-controller-composition.ts +51 -0
  617. package/src/runtime/root/scheduler.ts +12 -4
  618. package/src/runtime/root/service-runner.ts +1 -1
  619. package/src/runtime/root/service.ts +41 -16
  620. package/src/runtime/root/status.ts +1 -0
  621. package/src/runtime/root/types.ts +24 -1
  622. package/src/runtime/shared/local-bridge-surface.ts +1 -1
  623. package/src/runtime/shared/process-environment.ts +19 -4
  624. package/src/runtime/shared/storage-capacity.ts +68 -0
  625. package/src/runtime/standalone-recovery/controller-home-migration.ts +1116 -0
  626. package/src/runtime/standalone-recovery/core.ts +984 -230
  627. package/src/runtime/standalone-recovery/entry.ts +182 -51
  628. package/src/runtime/standalone-recovery/independent-host-rescue.ts +172 -0
  629. package/src/runtime/standalone-recovery/installer.ts +212 -104
  630. package/src/runtime/standalone-recovery/mcp-server.ts +243 -0
  631. package/src/runtime/standalone-recovery/mutation-identity-contract.ts +21 -0
  632. package/src/runtime/standalone-recovery/operation-lock.ts +160 -0
  633. package/src/runtime/standalone-recovery/performance.ts +135 -0
  634. package/src/runtime/standalone-recovery/release.ts +5 -0
  635. package/src/runtime/watchdog/workflow-watchdog.ts +1 -1
  636. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +1 -1
  637. package/src/runtime/workflow/schedules/engine.ts +191 -343
  638. package/src/runtime/workflow/schedules/pending-activation.ts +1 -1
  639. package/src/runtime/workflow/schedules/settlement.ts +2 -191
  640. package/src/runtime/workflow/schedules/store.ts +2 -607
  641. package/src/runtime/workflow/schedules/types.ts +2 -127
  642. package/src/runtime/workflow/schedules/work-continuation.ts +180 -15
  643. package/src/runtime/workflows/first-party/xiaohongshu.ts +122 -0
  644. package/src/runtime/workflows/runtime.ts +486 -0
  645. package/src/testing/test-governance.ts +90 -29
  646. package/assets/templates/helpers/archive-architecture-request.sh +0 -244
  647. package/docs/architecture/history/README.md +0 -7
  648. package/docs/architecture/history/chatgpt-handoff-facade.md +0 -397
  649. package/docs/architecture/history/global-hook-runtime.md +0 -166
  650. package/docs/architecture/history/ios-semantic-automation-provider-v2.md +0 -170
  651. package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  652. package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +0 -59
  653. package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +0 -59
  654. package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +0 -59
  655. package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +0 -59
  656. package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  657. package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  658. package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  659. package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  660. package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +0 -59
  661. package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  662. package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  663. package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  664. package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  665. package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  666. package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  667. package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  668. package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  669. package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  670. package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +0 -59
  671. package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +0 -59
  672. package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +0 -63
  673. package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  674. package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  675. package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  676. package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  677. package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +0 -60
  678. package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +0 -60
  679. package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +0 -68
  680. package/docs/architecture/requests/archive/2026/root.md +0 -68
  681. package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +0 -76
  682. package/docs/architecture/requests/archive/2026/verification-evals-checks.md +0 -68
  683. package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +0 -69
  684. package/scripts/archive-architecture-request.sh +0 -4
  685. package/scripts/run-skill-evals.ts +0 -1022
@@ -1,10 +1,15 @@
1
1
  import { randomUUID } from 'crypto';
2
- import { statSync } from 'fs';
3
- import { dirname } from 'path';
4
- import { Client } from '@modelcontextprotocol/sdk/client/index.js';
5
- import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
2
+ import { mkdirSync, statSync } from 'fs';
3
+ import { writeJsonAtomic } from '../shared/json-files';
4
+ import { ensureForgeInstanceIdentity } from '../../../packages/kernel/identity/api/index';
5
+ import { dirname, join } from 'path';
6
+ import { Client, StreamableHTTPClientTransport } from "@modelcontextprotocol/client";
6
7
  import type { ControlPlaneDatabaseInspection } from '../control-plane/persistence/sqlite-store';
7
- import { inspectControlPlaneDatabase } from '../control-plane/persistence/sqlite-store';
8
+ import {
9
+ disableControlPlaneReadConnectionReuse,
10
+ enableControlPlaneReadConnectionReuse,
11
+ inspectControlPlaneDatabase,
12
+ } from '../control-plane/persistence/sqlite-store';
8
13
  import { activateExclusiveWorkAdmission } from '../control-plane/facade/work-admission-policy';
9
14
  import { closeCodeGraphReadProviderSessions } from '../context/codegraph-read-provider';
10
15
  import { cancelAllLightweightProcesses } from '../execution/process-runtime/lightweight-managed';
@@ -17,27 +22,36 @@ import { createRuntimeGatewayServer, runtimeGatewayToolSurfaceFingerprint } from
17
22
  import { startRuntimeMcpTransport, type RuntimeMcpTransportHandle } from './mcp-transport';
18
23
  import { acquireRuntimeOwnership, type RuntimeOwnershipHandle } from './ownership';
19
24
  import { RuntimeReadinessState } from './readiness';
20
- import { loadRuntimeReleaseManifest } from './release-manifest';
21
- import { ensureActiveRuntimeRelease, type RuntimeReleaseAuthority } from './release-store';
25
+ import { loadRuntimeReleaseManifest, requireCompleteCompiledRuntimeReleaseManifest } from './release-manifest';
26
+ import { ensureActiveRuntimeRelease, readRuntimeReleaseAuthority, type RuntimeReleaseAuthority } from './release-store';
22
27
  import { bindRuntimeWriteClaim, clearRuntimeWriteClaim } from './write-fence';
23
28
  import { startInProcessScheduler, type RuntimeSchedulerHandle } from './scheduler';
24
29
  import { startConfiguredRuntimeLocalBridge, type RuntimeLocalBridgeHandle } from './local-bridge';
30
+ import { startActiveExecutionPowerAssertion, type RuntimePowerAssertionHandle } from './active-execution-power-assertion';
25
31
  import { removeRuntimeStatusSnapshot, writeRuntimeStatusSnapshot } from './status';
26
32
  import type {
27
33
  CanonicalRuntimeConfig,
34
+ CanonicalRuntimeStatusSnapshot,
28
35
  RuntimeExitEvidence,
29
36
  RuntimeReadiness,
30
37
  RuntimeReleaseManifest,
31
38
  } from './types';
32
39
 
40
+ export interface RuntimeReleaseAuthorityMonitor {
41
+ stop(): void;
42
+ }
43
+
33
44
  export interface CanonicalRuntimeDependencies {
34
45
  loadReleaseManifest(path: string, controllerHome: string): RuntimeReleaseManifest;
35
46
  ensureReleaseAuthority(controllerHome: string, manifestPath: string): RuntimeReleaseAuthority;
47
+ readReleaseAuthority(controllerHome: string): RuntimeReleaseAuthority | undefined;
48
+ startReleaseAuthorityMonitor(observe: () => void): RuntimeReleaseAuthorityMonitor;
36
49
  bindWriteClaim(input: { controllerHome: string; owner: RuntimeOwnershipHandle['record']; authority: RuntimeReleaseAuthority }): void;
37
50
  acquireOwnership(controllerHome: string, runtimeInstanceId: string): RuntimeOwnershipHandle;
38
51
  inspectDatabase(controllerHome: string): ControlPlaneDatabaseInspection;
39
- startScheduler(controllerHome: string, timeoutMs?: number): RuntimeSchedulerHandle;
40
- startLocalBridge(input: { controllerHome: string; repositoryRoot: string }): Promise<RuntimeLocalBridgeHandle | undefined>;
52
+ startScheduler(input: Parameters<typeof startInProcessScheduler>[0]): RuntimeSchedulerHandle;
53
+ startLocalBridge(input: { controllerHome: string; repositoryRoot?: string }): Promise<RuntimeLocalBridgeHandle | undefined>;
54
+ startPowerAssertion(input: { controllerHome: string; runtimePid: number }): RuntimePowerAssertionHandle;
41
55
  startTransport(options: Parameters<typeof startRuntimeMcpTransport>[0]): Promise<RuntimeMcpTransportHandle>;
42
56
  runMcpProbe(endpoint: string, authToken: string): Promise<void>;
43
57
  collectRuntimeSourceIdentity: typeof collectRuntimeSourceIdentity;
@@ -45,6 +59,8 @@ export interface CanonicalRuntimeDependencies {
45
59
  stopLightweightProcesses(controllerHome: string): Promise<number>;
46
60
  stopContextReadHelpers(): Promise<void>;
47
61
  computeToolSurfaceFingerprint: typeof runtimeGatewayToolSurfaceFingerprint;
62
+ ensureForgeInstanceIdentity: typeof ensureForgeInstanceIdentity;
63
+ startJscSamplingProfiler(directory: string): Promise<void>;
48
64
  }
49
65
 
50
66
  async function defaultMcpProbe(endpoint: string, authToken: string): Promise<void> {
@@ -70,14 +86,31 @@ async function defaultMcpProbe(endpoint: string, authToken: string): Promise<voi
70
86
  }
71
87
  }
72
88
 
89
+ const DEFAULT_RELEASE_AUTHORITY_MONITOR_INTERVAL_MS = 1_000;
90
+
91
+ function startDefaultReleaseAuthorityMonitor(observe: () => void): RuntimeReleaseAuthorityMonitor {
92
+ const timer = setInterval(observe, DEFAULT_RELEASE_AUTHORITY_MONITOR_INTERVAL_MS);
93
+ timer.unref?.();
94
+ return { stop: () => clearInterval(timer) };
95
+ }
96
+
97
+ async function startDefaultJscSamplingProfiler(directory: string): Promise<void> {
98
+ mkdirSync(directory, { recursive: true });
99
+ const { startSamplingProfiler } = await import('bun:jsc');
100
+ startSamplingProfiler(directory);
101
+ }
102
+
73
103
  const DEFAULT_DEPENDENCIES: CanonicalRuntimeDependencies = {
74
104
  loadReleaseManifest: loadRuntimeReleaseManifest,
75
105
  ensureReleaseAuthority: ensureActiveRuntimeRelease,
106
+ readReleaseAuthority: readRuntimeReleaseAuthority,
107
+ startReleaseAuthorityMonitor: startDefaultReleaseAuthorityMonitor,
76
108
  bindWriteClaim: (input) => { bindRuntimeWriteClaim(input); },
77
109
  acquireOwnership: acquireRuntimeOwnership,
78
110
  inspectDatabase: inspectControlPlaneDatabase,
79
111
  startScheduler: startInProcessScheduler,
80
112
  startLocalBridge: startConfiguredRuntimeLocalBridge,
113
+ startPowerAssertion: startActiveExecutionPowerAssertion,
81
114
  startTransport: startRuntimeMcpTransport,
82
115
  runMcpProbe: defaultMcpProbe,
83
116
  collectRuntimeSourceIdentity,
@@ -85,24 +118,34 @@ const DEFAULT_DEPENDENCIES: CanonicalRuntimeDependencies = {
85
118
  stopLightweightProcesses: cancelAllLightweightProcesses,
86
119
  stopContextReadHelpers: closeCodeGraphReadProviderSessions,
87
120
  computeToolSurfaceFingerprint: runtimeGatewayToolSurfaceFingerprint,
121
+ ensureForgeInstanceIdentity,
122
+ startJscSamplingProfiler: startDefaultJscSamplingProfiler,
88
123
  };
89
124
 
90
125
  export class CanonicalForgeRuntime {
126
+ readonly forgeInstanceId: string;
91
127
  readonly runtimeInstanceId: string;
92
128
  private readonly readinessState = new RuntimeReadinessState();
93
129
  private readonly dependencies: CanonicalRuntimeDependencies;
94
130
  private ownership?: RuntimeOwnershipHandle;
95
131
  private scheduler?: RuntimeSchedulerHandle;
96
132
  private localBridge?: RuntimeLocalBridgeHandle;
133
+ private powerAssertion?: RuntimePowerAssertionHandle;
97
134
  private toolSurfaceFingerprint?: string;
98
135
  private transport?: RuntimeMcpTransportHandle;
99
136
  private controller?: RuntimeControllerServices;
100
137
  private release?: RuntimeReleaseManifest;
138
+ private releaseAuthorityMonitor?: RuntimeReleaseAuthorityMonitor;
101
139
  private stopPromise?: Promise<void>;
102
140
  private stoppedResolve!: () => void;
103
141
  private readonly stopped = new Promise<void>((resolve) => { this.stoppedResolve = resolve; });
104
142
  private started = false;
105
143
  private stopping = false;
144
+ private jscHeapDiagnosticsSignalHandler?: () => void;
145
+ private jscHeapDiagnosticsCaptureInFlight = false;
146
+ private jscSamplingProfilerSignalHandler?: () => void;
147
+ private jscSamplingProfilerStartInFlight = false;
148
+ private jscSamplingProfilerStarted = false;
106
149
  lastExit?: RuntimeExitEvidence;
107
150
 
108
151
  constructor(
@@ -112,11 +155,12 @@ export class CanonicalForgeRuntime {
112
155
  this.runtimeInstanceId = config.runtimeInstanceId?.trim() || `runtime_${randomUUID().replaceAll('-', '')}`;
113
156
  this.dependencies = { ...DEFAULT_DEPENDENCIES, ...dependencies };
114
157
  if (!config.controllerHome.trim()) throw new Error('RUNTIME_CONFIG_REQUIRED: controllerHome');
115
- if (!config.repositoryRoot.trim()) throw new Error('RUNTIME_CONFIG_REQUIRED: repositoryRoot');
116
- try {
117
- if (!statSync(config.repositoryRoot).isDirectory()) throw new Error('not a directory');
118
- } catch {
119
- throw new Error('RUNTIME_CONFIG_INVALID: repositoryRoot must be an existing directory');
158
+ if (config.repositoryRoot?.trim()) {
159
+ try {
160
+ if (!statSync(config.repositoryRoot).isDirectory()) throw new Error('not a directory');
161
+ } catch {
162
+ throw new Error('RUNTIME_CONFIG_INVALID: repositoryRoot must be an existing directory');
163
+ }
120
164
  }
121
165
  if (!config.releaseManifestPath.trim()) throw new Error('RUNTIME_CONFIG_REQUIRED: releaseManifestPath');
122
166
  if (!config.host.trim()) throw new Error('RUNTIME_CONFIG_REQUIRED: host');
@@ -124,17 +168,112 @@ export class CanonicalForgeRuntime {
124
168
  throw new Error('RUNTIME_CONFIG_INVALID: port');
125
169
  }
126
170
  if (!config.authToken.trim()) throw new Error('RUNTIME_CONFIG_REQUIRED: authToken');
171
+ this.forgeInstanceId = this.dependencies.ensureForgeInstanceIdentity({
172
+ controllerHome: config.controllerHome,
173
+ preferredInstanceId: process.env.FORGE_INSTANCE_ID?.trim(),
174
+ }).instanceId;
127
175
  }
128
176
 
129
177
  readiness(): RuntimeReadiness {
130
178
  return this.readinessState.snapshot();
131
179
  }
132
180
 
181
+ private installJscHeapDiagnosticsSignal(): void {
182
+ if (process.platform === 'win32' || this.jscHeapDiagnosticsSignalHandler) return;
183
+ const handler = () => {
184
+ if (this.jscHeapDiagnosticsCaptureInFlight) return;
185
+ this.jscHeapDiagnosticsCaptureInFlight = true;
186
+ void import('bun:jsc').then(({ heapStats, memoryUsage }) => {
187
+ const heap = heapStats();
188
+ const topTypes = (counts: Record<string, number>, limit: number) => Object.entries(counts)
189
+ .sort((left, right) => right[1] - left[1])
190
+ .slice(0, limit)
191
+ .map(([type, count]) => ({ type, count }));
192
+ writeJsonAtomic(join(this.config.controllerHome, 'diagnostics', 'jsc-heap.json'), {
193
+ schemaVersion: 1,
194
+ capturedAt: new Date().toISOString(),
195
+ pid: process.pid,
196
+ runtimeInstanceId: this.runtimeInstanceId,
197
+ releaseId: this.release?.releaseId,
198
+ heap: {
199
+ heapSize: heap.heapSize,
200
+ heapCapacity: heap.heapCapacity,
201
+ extraMemorySize: heap.extraMemorySize,
202
+ objectCount: heap.objectCount,
203
+ protectedObjectCount: heap.protectedObjectCount,
204
+ globalObjectCount: heap.globalObjectCount,
205
+ protectedGlobalObjectCount: heap.protectedGlobalObjectCount,
206
+ objectTypeCount: Object.keys(heap.objectTypeCounts).length,
207
+ protectedObjectTypeCount: Object.keys(heap.protectedObjectTypeCounts).length,
208
+ topObjectTypes: topTypes(heap.objectTypeCounts, 100),
209
+ topProtectedObjectTypes: topTypes(heap.protectedObjectTypeCounts, 50),
210
+ },
211
+ memoryUsage: memoryUsage(),
212
+ });
213
+ }).catch((error) => {
214
+ process.stderr.write(`${JSON.stringify({
215
+ event: 'forge_runtime_jsc_heap_diagnostics_failed',
216
+ runtimeInstanceId: this.runtimeInstanceId,
217
+ message: error instanceof Error ? error.message : String(error),
218
+ observedAt: new Date().toISOString(),
219
+ })}\n`);
220
+ }).finally(() => {
221
+ this.jscHeapDiagnosticsCaptureInFlight = false;
222
+ });
223
+ };
224
+ process.on('SIGUSR2', handler);
225
+ this.jscHeapDiagnosticsSignalHandler = handler;
226
+ }
227
+
228
+ private removeJscHeapDiagnosticsSignal(): void {
229
+ const handler = this.jscHeapDiagnosticsSignalHandler;
230
+ if (!handler) return;
231
+ process.off('SIGUSR2', handler);
232
+ this.jscHeapDiagnosticsSignalHandler = undefined;
233
+ }
234
+
235
+ private installJscSamplingProfilerSignal(): void {
236
+ if (process.platform === 'win32' || this.jscSamplingProfilerSignalHandler) return;
237
+ const handler = () => {
238
+ if (this.jscSamplingProfilerStarted || this.jscSamplingProfilerStartInFlight) return;
239
+ this.jscSamplingProfilerStartInFlight = true;
240
+ const directory = join(this.config.controllerHome, 'diagnostics', 'jsc-profile');
241
+ void this.dependencies.startJscSamplingProfiler(directory).then(() => {
242
+ this.jscSamplingProfilerStarted = true;
243
+ process.stderr.write(`${JSON.stringify({
244
+ event: 'forge_runtime_jsc_sampling_profiler_started',
245
+ runtimeInstanceId: this.runtimeInstanceId,
246
+ directory,
247
+ observedAt: new Date().toISOString(),
248
+ })}\n`);
249
+ }).catch((error) => {
250
+ process.stderr.write(`${JSON.stringify({
251
+ event: 'forge_runtime_jsc_sampling_profiler_failed',
252
+ runtimeInstanceId: this.runtimeInstanceId,
253
+ message: error instanceof Error ? error.message : String(error),
254
+ observedAt: new Date().toISOString(),
255
+ })}\n`);
256
+ }).finally(() => {
257
+ this.jscSamplingProfilerStartInFlight = false;
258
+ });
259
+ };
260
+ process.on('SIGUSR1', handler);
261
+ this.jscSamplingProfilerSignalHandler = handler;
262
+ }
263
+
264
+ private removeJscSamplingProfilerSignal(): void {
265
+ const handler = this.jscSamplingProfilerSignalHandler;
266
+ if (!handler) return;
267
+ process.off('SIGUSR1', handler);
268
+ this.jscSamplingProfilerSignalHandler = undefined;
269
+ }
270
+
133
271
  private publishStatus(): void {
134
272
  if (!this.ownership || !this.release) return;
135
273
  try {
136
- writeRuntimeStatusSnapshot(this.config.controllerHome, {
274
+ const snapshot: CanonicalRuntimeStatusSnapshot = {
137
275
  schemaVersion: 1,
276
+ forgeInstanceId: this.forgeInstanceId,
138
277
  runtimeInstanceId: this.runtimeInstanceId,
139
278
  pid: this.ownership.record.pid,
140
279
  releaseId: this.release.releaseId,
@@ -144,7 +283,8 @@ export class CanonicalForgeRuntime {
144
283
  readiness: this.readiness(),
145
284
  startedAt: this.ownership.record.acquiredAt,
146
285
  updatedAt: new Date().toISOString(),
147
- });
286
+ };
287
+ writeRuntimeStatusSnapshot(this.config.controllerHome, snapshot);
148
288
  } catch {
149
289
  // Status is a read-only projection. Projection failure cannot become a
150
290
  // second Runtime readiness or lifecycle authority.
@@ -166,6 +306,35 @@ export class CanonicalForgeRuntime {
166
306
  return this.transport?.endpoint;
167
307
  }
168
308
 
309
+ private startReleaseAuthorityMonitor(): void {
310
+ const release = this.release;
311
+ if (!release || this.releaseAuthorityMonitor) return;
312
+ this.releaseAuthorityMonitor = this.dependencies.startReleaseAuthorityMonitor(() => {
313
+ if (this.stopping || this.lastExit) return;
314
+ let authority: RuntimeReleaseAuthority | undefined;
315
+ try {
316
+ authority = this.dependencies.readReleaseAuthority(this.config.controllerHome);
317
+ } catch {
318
+ // A read failure or ambiguous authority is not proof that this Runtime
319
+ // was superseded. Existing write fencing remains authoritative.
320
+ return;
321
+ }
322
+ if (!authority) return;
323
+ const active = authority.active;
324
+ if (
325
+ active.releaseId === release.releaseId
326
+ && active.artifactIdentity === release.artifactIdentity
327
+ && active.workerProtocolVersion === release.workerProtocolVersion
328
+ ) return;
329
+ const reasonCode = 'RUNTIME_RELEASE_SUPERSEDED';
330
+ this.readinessState.setDiagnostic('releaseCoherence', 'fail', reasonCode);
331
+ this.failCore(
332
+ reasonCode,
333
+ `Active Runtime release authority changed from ${release.releaseId}/${release.artifactIdentity} to ${active.releaseId}/${active.artifactIdentity}.`,
334
+ );
335
+ });
336
+ }
337
+
169
338
  async start(): Promise<void> {
170
339
  if (this.started) throw new Error('RUNTIME_ALREADY_STARTED');
171
340
  this.started = true;
@@ -180,13 +349,27 @@ export class CanonicalForgeRuntime {
180
349
  stage = 'release';
181
350
  const releaseAuthority = this.dependencies.ensureReleaseAuthority(this.config.controllerHome, this.config.releaseManifestPath);
182
351
  stage = 'source';
183
- // A materialized immutable release carries its frozen source identity in
184
- // the release manifest and must snapshot that release directory. Source/
185
- // fixture manifests without source identity keep the historical explicit
186
- // repositoryRoot behavior so development-mode Runtime drift remains live.
187
- const runtimeSourceRoot = this.release.sourceCommit && this.release.releaseRevision
352
+ // A compiled release is a closed execution surface. Fail before Scheduler
353
+ // composition if a stale/corrupt manifest omits any immutable component;
354
+ // standalone Runtime must never regain source/import.meta.url fallback.
355
+ if (this.release.executionMode === 'standalone-binary') {
356
+ requireCompleteCompiledRuntimeReleaseManifest(this.release);
357
+ }
358
+ // A materialized immutable release carries either a source revision or a
359
+ // package release revision and must snapshot that release directory.
360
+ // Source/fixture manifests without either identity keep the historical
361
+ // explicit repositoryRoot behavior so development-mode Runtime drift
362
+ // remains live.
363
+ const materializedRelease = Boolean(
364
+ this.release.releaseRevision
365
+ && (this.release.sourceCommit || this.release.releaseRevision.startsWith('package:')),
366
+ );
367
+ const runtimeSourceRoot = materializedRelease
188
368
  ? dirname(this.config.releaseManifestPath)
189
369
  : this.config.repositoryRoot;
370
+ if (!runtimeSourceRoot) {
371
+ throw new Error('RUNTIME_CONFIG_REQUIRED: repositoryRoot is required only for non-materialized development Runtime');
372
+ }
190
373
  const runtimeSource = this.dependencies.collectRuntimeSourceIdentity(runtimeSourceRoot);
191
374
  this.dependencies.rotateRuntimeGeneration(this.config.controllerHome, runtimeSource);
192
375
 
@@ -208,6 +391,13 @@ export class CanonicalForgeRuntime {
208
391
  this.dependencies.inspectDatabase,
209
392
  );
210
393
  this.controller.initialize();
394
+ // The Canonical Runtime is the only process that keeps a control-plane
395
+ // reader alive across operations. Writers remain short-lived WAL/CAS
396
+ // transactions, while CLI/tests/workers keep their existing close-on-read
397
+ // semantics.
398
+ enableControlPlaneReadConnectionReuse(this.config.controllerHome);
399
+ this.installJscHeapDiagnosticsSignal();
400
+ this.installJscSamplingProfilerSignal();
211
401
  this.readinessState.setDiagnostic('database', 'pass');
212
402
  this.publishStatus();
213
403
  if (this.config.exclusiveWorkId) {
@@ -218,10 +408,20 @@ export class CanonicalForgeRuntime {
218
408
  }
219
409
 
220
410
  stage = 'scheduler';
221
- this.scheduler = this.dependencies.startScheduler(
222
- this.config.controllerHome,
223
- this.config.schedulerReadyTimeoutMs,
224
- );
411
+ const standaloneReleaseRoot = this.release.executionMode === 'standalone-binary'
412
+ ? dirname(this.config.releaseManifestPath)
413
+ : undefined;
414
+ this.scheduler = this.dependencies.startScheduler({
415
+ controllerHome: this.config.controllerHome,
416
+ readyTimeoutMs: this.config.schedulerReadyTimeoutMs,
417
+ runtimeSourceRoot: standaloneReleaseRoot ? undefined : runtimeSourceRoot,
418
+ workerExecutable: standaloneReleaseRoot && this.release.schedulerWorkerEntrypoint
419
+ ? join(standaloneReleaseRoot, this.release.schedulerWorkerEntrypoint)
420
+ : undefined,
421
+ periodicCleanupExecutable: standaloneReleaseRoot && this.release.periodicCleanupEntrypoint
422
+ ? join(standaloneReleaseRoot, this.release.periodicCleanupEntrypoint)
423
+ : undefined,
424
+ });
225
425
  await this.scheduler.ready;
226
426
  this.readinessState.setDiagnostic('scheduler', 'pass');
227
427
  this.publishStatus();
@@ -229,6 +429,10 @@ export class CanonicalForgeRuntime {
229
429
  () => this.failCore('SCHEDULER_STOPPED', 'Scheduler stopped while Runtime was active.'),
230
430
  (error) => this.failCore('SCHEDULER_STALLED', error instanceof Error ? error.message : String(error)),
231
431
  );
432
+ this.powerAssertion = this.dependencies.startPowerAssertion({
433
+ controllerHome: this.config.controllerHome,
434
+ runtimePid: this.ownership.record.pid,
435
+ });
232
436
 
233
437
  stage = 'localBridge';
234
438
  this.localBridge = await this.dependencies.startLocalBridge({
@@ -260,6 +464,8 @@ export class CanonicalForgeRuntime {
260
464
  this.readinessState.setDiagnostic('mcpEndToEnd', 'pass');
261
465
  this.readinessState.markReady();
262
466
  this.publishStatus();
467
+ stage = 'release';
468
+ this.startReleaseAuthorityMonitor();
263
469
  } catch (error) {
264
470
  const reason = this.startupReason(stage);
265
471
  this.markStartupFailure(stage, reason);
@@ -311,6 +517,12 @@ export class CanonicalForgeRuntime {
311
517
  this.stopping = true;
312
518
  this.readinessState.markNotReady(reasonCode);
313
519
  this.publishStatus();
520
+ // Stop the release observer before withdrawing MCP work so no second
521
+ // supersession callback can race the teardown sequence.
522
+ try { this.releaseAuthorityMonitor?.stop(); } catch { /* cleanup is best effort */ }
523
+ this.releaseAuthorityMonitor = undefined;
524
+ this.removeJscHeapDiagnosticsSignal();
525
+ this.removeJscSamplingProfilerSignal();
314
526
  // Stop accepting new MCP work before quiescing Scheduler activity, then
315
527
  // release the Controller Home claim only after all in-process services stop.
316
528
  await this.transport?.close().catch(() => undefined);
@@ -318,6 +530,9 @@ export class CanonicalForgeRuntime {
318
530
  await this.dependencies.stopContextReadHelpers().catch(() => undefined);
319
531
  await this.localBridge?.close().catch(() => undefined);
320
532
  await this.scheduler?.stop().catch(() => undefined);
533
+ try { this.powerAssertion?.stop(); } catch { /* power assertion cleanup is best effort */ }
534
+ this.powerAssertion = undefined;
535
+ disableControlPlaneReadConnectionReuse(this.config.controllerHome);
321
536
  const ownerPid = this.ownership?.record.pid;
322
537
  this.ownership?.release();
323
538
  clearRuntimeWriteClaim(this.runtimeInstanceId);
@@ -0,0 +1,51 @@
1
+ import {
2
+ bindControllerSessionBinding,
3
+ type ControllerBinding,
4
+ type ControllerHost,
5
+ type ControllerSession,
6
+ } from '../../../packages/kernel/controller/api/index';
7
+ import { createChatgptControllerHost } from '../../../adapters/chatgpt/controller-host';
8
+ import { upsertChatgptControllerBinding } from '../../../adapters/chatgpt/controller-binding-store';
9
+ import { getChatgptWorkConversationBinding } from '../../../adapters/chatgpt/work-conversation-binding-store';
10
+ import { createProcessControllerHost } from '../../../adapters/controller-process/controller-host';
11
+ import { upsertProcessControllerBinding, type ProcessControllerType } from '../../../adapters/controller-process/binding-store';
12
+
13
+ // Kernel V2 composition root: Scheduler selects Kernel continuation; this file wires concrete provider adapters.
14
+ export function ensureScheduledControllerBinding(
15
+ options: { controllerHome: string; repoId: string },
16
+ input: { workId: string; session: ControllerSession; scheduleName?: string; args: Record<string, unknown> },
17
+ ): ControllerBinding {
18
+ let binding: ControllerBinding;
19
+ if (input.session.controllerType === 'chatgpt') {
20
+ const durable = getChatgptWorkConversationBinding(options, input.workId);
21
+ binding = upsertChatgptControllerBinding(options, {
22
+ workId: input.workId, sessionId: input.session.sessionId,
23
+ browserSessionId: durable?.latestBrowserSessionId ?? (typeof input.args.browser_session_id === 'string' ? input.args.browser_session_id : undefined),
24
+ conversationUrl: durable?.conversationUrl ?? (typeof input.args.conversation_url === 'string' ? input.args.conversation_url : undefined),
25
+ title: input.scheduleName,
26
+ model: typeof input.args.model === 'string' ? input.args.model : 'gpt-5.6',
27
+ reasoning: input.args.reasoning === 'medium' || input.args.reasoning === 'xhigh' ? input.args.reasoning : 'high',
28
+ tabPolicy: input.args.tab_policy === 'reuse' || input.args.tab_policy === 'new' ? input.args.tab_policy : 'auto',
29
+ timeoutMs: typeof input.args.timeout_ms === 'number' ? input.args.timeout_ms : undefined,
30
+ }).binding;
31
+ } else if (input.session.controllerType !== 'human') {
32
+ binding = upsertProcessControllerBinding(options, {
33
+ workId: input.workId, sessionId: input.session.sessionId, controllerType: input.session.controllerType as ProcessControllerType,
34
+ executable: typeof input.args.executable === 'string' ? input.args.executable : undefined,
35
+ launchArgs: Array.isArray(input.args.launch_args) ? input.args.launch_args.map(String) : [],
36
+ handoffId: typeof input.args.handoff_id === 'string' ? input.args.handoff_id : undefined,
37
+ launchReservationMs: typeof input.args.launch_reservation_ms === 'number' ? input.args.launch_reservation_ms : undefined,
38
+ }).binding;
39
+ } else {
40
+ throw new Error('SCHEDULE_CONTINUATION_HUMAN_HOST_UNSUPPORTED');
41
+ }
42
+ bindControllerSessionBinding(options, { workId: input.workId, sessionId: input.session.sessionId, binding });
43
+ return binding;
44
+ }
45
+
46
+ export function controllerHostForScheduledBinding(
47
+ options: { controllerHome: string; repoId: string; repoRoot: string },
48
+ binding: ControllerBinding,
49
+ ): ControllerHost {
50
+ return binding.hostKind === 'chatgpt' ? createChatgptControllerHost(options) : createProcessControllerHost(options);
51
+ }
@@ -30,10 +30,14 @@ async function waitForSchedulerHeartbeat(
30
30
  throw new Error(`SCHEDULER_INITIALIZATION_TIMEOUT: ${timeoutMs}ms`);
31
31
  }
32
32
 
33
- export function startInProcessScheduler(
34
- controllerHome: string,
35
- readyTimeoutMs = 5_000,
36
- ): RuntimeSchedulerHandle {
33
+ export function startInProcessScheduler(input: {
34
+ controllerHome: string;
35
+ readyTimeoutMs?: number;
36
+ runtimeSourceRoot?: string;
37
+ workerExecutable?: string;
38
+ periodicCleanupExecutable?: string;
39
+ }): RuntimeSchedulerHandle {
40
+ const { controllerHome, readyTimeoutMs = 5_000 } = input;
37
41
  const abort = new AbortController();
38
42
  // Old Runtime releases ignore pending activation markers entirely. A naturally
39
43
  // restarted Runtime that contains this code consumes them once, before its
@@ -42,6 +46,10 @@ export function startInProcessScheduler(
42
46
  const startedAfterMs = Date.now();
43
47
  const scheduler = new GlobalScheduler(controllerHome, {}, {
44
48
  controllerPid: process.pid,
49
+ runtimeSourceRoot: input.runtimeSourceRoot,
50
+ workerExecutable: input.workerExecutable,
51
+ periodicCleanupExecutable: input.periodicCleanupExecutable,
52
+ isolatePeriodicCleanup: true,
45
53
  fatalOnTickError: true,
46
54
  });
47
55
  const done = scheduler.run(abort.signal);
@@ -25,7 +25,7 @@ export function resolveForgeRuntimeServiceCommand(controllerHome: string, config
25
25
  executable,
26
26
  args: [
27
27
  '--controller-home', home,
28
- '--repo', config.repositoryRoot,
28
+ ...(config.repositoryRoot ? ['--repo', config.repositoryRoot] : []),
29
29
  '--release-manifest', authority.active.manifestPath,
30
30
  '--host', config.host,
31
31
  '--port', String(config.port),
@@ -3,17 +3,13 @@ import { chmodSync, copyFileSync, existsSync, lstatSync, mkdirSync, readFileSync
3
3
  import { homedir } from 'os';
4
4
  import { dirname, isAbsolute, join, relative, resolve } from 'path';
5
5
  import { resolveControllerHome } from '../../cli/repositories/controller-home';
6
- import {
7
- bootstrapLaunchAgentWithRetryV2,
8
- bootoutLaunchAgentWithRetryV2,
9
- installLaunchAgent,
10
- retireConflictingForgeLaunchAgents,
11
- } from '../../cli/controller/launch-agents';
6
+ import { createPlatformServiceManagerHost } from '../platform/service-manager';
12
7
 
13
8
  export interface ForgeRuntimeServiceConfig {
14
9
  schemaVersion: 1;
15
10
  controllerHome: string;
16
- repositoryRoot: string;
11
+ /** Optional default repository overlay for development/embedded repository UI. */
12
+ repositoryRoot?: string;
17
13
  host: string;
18
14
  port: number;
19
15
  authTokenFile: string;
@@ -65,16 +61,16 @@ export function forgeRuntimeServicePaths(controllerHome: string): ForgeRuntimeSe
65
61
  export function validateForgeRuntimeServiceConfig(input: ForgeRuntimeServiceConfig): ForgeRuntimeServiceConfig {
66
62
  if (input.schemaVersion !== 1) throw new Error('FORGE_RUNTIME_SERVICE_CONFIG_VERSION_UNSUPPORTED');
67
63
  const controllerHome = resolve(input.controllerHome);
68
- const repositoryRoot = resolve(input.repositoryRoot);
64
+ const repositoryRoot = input.repositoryRoot?.trim() ? resolve(input.repositoryRoot) : undefined;
69
65
  const authTokenFile = resolve(input.authTokenFile);
70
66
  if (!input.host.trim()) throw new Error('FORGE_RUNTIME_SERVICE_HOST_REQUIRED');
71
67
  if (!Number.isInteger(input.port) || input.port < 1 || input.port > 65_535) throw new Error('FORGE_RUNTIME_SERVICE_PORT_INVALID');
72
- if (!existsSync(repositoryRoot)) throw new Error(`FORGE_RUNTIME_SERVICE_REPOSITORY_MISSING: ${repositoryRoot}`);
68
+ if (repositoryRoot && !existsSync(repositoryRoot)) throw new Error(`FORGE_RUNTIME_SERVICE_REPOSITORY_MISSING: ${repositoryRoot}`);
73
69
  if (!existsSync(authTokenFile)) throw new Error(`FORGE_RUNTIME_SERVICE_AUTH_TOKEN_MISSING: ${authTokenFile}`);
74
70
  return {
75
71
  ...input,
76
72
  controllerHome,
77
- repositoryRoot,
73
+ ...(repositoryRoot ? { repositoryRoot } : {}),
78
74
  host: input.host.trim(),
79
75
  authTokenFile,
80
76
  ...(input.exclusiveWorkId?.trim() ? { exclusiveWorkId: input.exclusiveWorkId.trim() } : {}),
@@ -99,6 +95,8 @@ interface RuntimeReleaseManifestRecord {
99
95
  artifactIdentity: string;
100
96
  arguments?: string[];
101
97
  diagnosticEntrypoint?: string;
98
+ packageRoot?: string;
99
+ packageArtifactIdentity?: string;
102
100
  browserAutomationHelperEntrypoint?: string;
103
101
  browserAutomationHelperArtifactIdentity?: string;
104
102
  browserAutomationHelperContractIdentity?: string;
@@ -152,6 +150,30 @@ export function activeRuntimeEntrypoint(controllerHome: string): string | undefi
152
150
  return readActiveRuntimeRelease(controllerHome)?.entrypoint;
153
151
  }
154
152
 
153
+ function activeRuntimeProductVersion(active: ActiveRuntimeReleaseRecord): string | undefined {
154
+ const packageRoot = active.manifest.packageRoot?.trim();
155
+ if (!packageRoot) return undefined;
156
+ if (!active.manifest.packageArtifactIdentity?.trim()) {
157
+ throw new Error('FORGE_RUNTIME_RELEASE_PACKAGE_VERSION_UNATTESTED');
158
+ }
159
+ const packageDirectory = resolve(active.releaseRoot, packageRoot);
160
+ if (!isInside(active.releaseRoot, packageDirectory)) {
161
+ throw new Error('FORGE_RUNTIME_RELEASE_PACKAGE_ROOT_OUTSIDE_RELEASE');
162
+ }
163
+ const packagePath = join(packageDirectory, 'package.json');
164
+ try {
165
+ const status = lstatSync(packagePath);
166
+ if (status.isSymbolicLink() || !status.isFile()) throw new Error('not a regular file');
167
+ const parsed = JSON.parse(readFileSync(packagePath, 'utf8')) as { version?: unknown };
168
+ const version = typeof parsed.version === 'string' ? parsed.version.trim() : '';
169
+ if (!version) throw new Error('version is missing');
170
+ return version;
171
+ } catch (error) {
172
+ const detail = error instanceof Error ? error.message : String(error);
173
+ throw new Error(`FORGE_RUNTIME_RELEASE_PACKAGE_VERSION_INVALID: ${detail}`);
174
+ }
175
+ }
176
+
155
177
  function legacyBrowserAutomationLaunchAgentPaths(controllerHome: string, accountHome = process.env.HOME ?? homedir()): { label: string; installedPlistPath: string } {
156
178
  const home = resolveControllerHome(controllerHome);
157
179
  const suffix = createHash('sha256').update(home).digest('hex').slice(0, 12);
@@ -165,7 +187,7 @@ function legacyBrowserAutomationLaunchAgentPaths(controllerHome: string, account
165
187
  async function retireLegacyBrowserAutomationLaunchAgent(controllerHome: string): Promise<void> {
166
188
  const legacy = legacyBrowserAutomationLaunchAgentPaths(controllerHome);
167
189
  if (!existsSync(legacy.installedPlistPath)) return;
168
- const result = await bootoutLaunchAgentWithRetryV2({ label: legacy.label, plistPath: legacy.installedPlistPath });
190
+ const result = await createPlatformServiceManagerHost({ platform: 'darwin' }).bootoutLaunchd({ label: legacy.label, plistPath: legacy.installedPlistPath });
169
191
  if (!result.ok) throw new Error(`FORGE_BROWSER_AUTOMATION_LEGACY_RETIRE_FAILED: ${result.diagnostics.join('; ')}`);
170
192
  rmSync(legacy.installedPlistPath, { force: true });
171
193
  }
@@ -186,10 +208,11 @@ export function activeRuntimeLaunchSpec(controllerHome: string): ActiveRuntimeLa
186
208
  if (diagnosticEntrypoint && (!isInside(active.releaseRoot, diagnosticEntrypoint) || !existsSync(diagnosticEntrypoint))) {
187
209
  throw new Error('FORGE_RUNTIME_RELEASE_DIAGNOSTIC_ENTRYPOINT_INVALID');
188
210
  }
211
+ const productVersion = activeRuntimeProductVersion(active);
189
212
  return {
190
213
  args: [
191
214
  '--controller-home', home,
192
- '--repo', config.repositoryRoot,
215
+ ...(config.repositoryRoot ? ['--repo', config.repositoryRoot] : []),
193
216
  '--release-manifest', active.manifestPath,
194
217
  '--host', config.host,
195
218
  '--port', String(config.port),
@@ -203,6 +226,7 @@ export function activeRuntimeLaunchSpec(controllerHome: string): ActiveRuntimeLa
203
226
  ...(diagnosticEntrypoint ? { FORGE_CLI_EXECUTABLE: diagnosticEntrypoint } : {}),
204
227
  FORGE_RELEASE_PATH: active.releaseRoot,
205
228
  FORGE_RELEASE_ID: active.releaseId,
229
+ ...(productVersion ? { FORGE_BUILD_VERSION: productVersion } : {}),
206
230
  FORGE_RELEASE_REVISION: active.manifest.releaseRevision ?? active.releaseId,
207
231
  ...(active.manifest.sourceCommit ? { FORGE_RELEASE_SOURCE_COMMIT: active.manifest.sourceCommit } : {}),
208
232
  FORGE_RELEASE_CLEAN_WORKSPACE: String(active.manifest.cleanWorkspace !== false),
@@ -353,14 +377,15 @@ export async function installForgeRuntimeService(input: { config: ForgeRuntimeSe
353
377
  bootstrapRunnerPath: input.runnerPath,
354
378
  });
355
379
  await retireLegacyBrowserAutomationLaunchAgent(config.controllerHome);
356
- await retireConflictingForgeLaunchAgents({
380
+ const serviceHost = createPlatformServiceManagerHost({ platform: 'darwin' });
381
+ await serviceHost.retireConflictingLaunchd({
357
382
  desiredLabel: paths.label,
358
383
  labelPrefix: 'com.moretea.forge.runtime.',
359
384
  port: config.port,
360
385
  requiredArguments: ['--controller-home'],
361
386
  });
362
- installLaunchAgent(paths.sourcePlistPath, paths.label);
363
- const result = await bootstrapLaunchAgentWithRetryV2({ label: paths.label, plistPath: paths.installedPlistPath });
387
+ serviceHost.installLaunchd(paths.sourcePlistPath, paths.label);
388
+ const result = await serviceHost.bootstrapLaunchd({ label: paths.label, plistPath: paths.installedPlistPath });
364
389
  if (!result.ok) throw new Error(`FORGE_RUNTIME_SERVICE_BOOTSTRAP_FAILED: ${result.diagnostics.join('; ')}`);
365
390
  return paths;
366
391
  }
@@ -368,7 +393,7 @@ export async function installForgeRuntimeService(input: { config: ForgeRuntimeSe
368
393
  export async function uninstallForgeRuntimeService(controllerHome: string): Promise<ForgeRuntimeServicePaths> {
369
394
  if (process.platform !== 'darwin') throw new Error('FORGE_RUNTIME_SERVICE_PLATFORM_UNSUPPORTED: launchd requires macOS');
370
395
  const paths = forgeRuntimeServicePaths(controllerHome);
371
- const result = await bootoutLaunchAgentWithRetryV2({ label: paths.label, plistPath: paths.installedPlistPath });
396
+ const result = await createPlatformServiceManagerHost({ platform: 'darwin' }).bootoutLaunchd({ label: paths.label, plistPath: paths.installedPlistPath });
372
397
  if (!result.ok) throw new Error(`FORGE_RUNTIME_SERVICE_BOOTOUT_FAILED: ${result.diagnostics.join('; ')}`);
373
398
  rmSync(paths.installedPlistPath, { force: true });
374
399