@moretea-labs/forge 1.8.0 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (695) hide show
  1. package/AGENTS.md +73 -7
  2. package/CHANGELOG.md +34 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.en.md +24 -3
  6. package/README.md +10 -6
  7. package/README.zh-CN.md +5 -3
  8. package/THIRD_PARTY_NOTICES.md +1 -2
  9. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
  11. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  12. package/adapters/chatgpt/controller-round-host.ts +15 -25
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  14. package/adapters/chatgpt/provider-delivery.ts +229 -2
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
  16. package/adapters/computer/chatgpt-extension-target.ts +708 -0
  17. package/adapters/computer/chrome-extension/background.js +541 -0
  18. package/adapters/computer/chrome-extension/content.js +402 -0
  19. package/adapters/computer/chrome-extension/core.js +24 -0
  20. package/adapters/computer/chrome-extension/manifest.json +32 -0
  21. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  22. package/adapters/computer/desktop-operator-provider.ts +18 -6
  23. package/adapters/computer/interaction-target-authority.ts +178 -24
  24. package/adapters/mcp/access-mode.ts +18 -39
  25. package/adapters/mcp/auth.ts +2 -7
  26. package/adapters/mcp/instructions.ts +6 -5
  27. package/adapters/mcp/multi-repository.ts +10 -47
  28. package/adapters/mcp/oauth.ts +73 -0
  29. package/adapters/mcp/paths.ts +4 -1
  30. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  31. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  32. package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
  33. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
  34. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  35. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  36. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  37. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  38. package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
  39. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  40. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
  41. package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
  42. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  43. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  44. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  45. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  46. package/adapters/mcp/runtime-gateway/router.ts +19 -507
  47. package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
  48. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
  49. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  50. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
  51. package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
  52. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
  53. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  54. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
  55. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
  56. package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
  57. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  58. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  59. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
  60. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  61. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  62. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  63. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  64. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  65. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
  66. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  67. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
  68. package/adapters/mcp/server.ts +91 -26
  69. package/adapters/mcp/setup.ts +5 -13
  70. package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
  71. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
  72. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
  73. package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
  74. package/adapters/mcp/toolset-names.ts +11 -37
  75. package/adapters/mcp/toolset.ts +19 -92
  76. package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
  77. package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
  78. package/adapters/mcp/transports/http-observation.ts +377 -0
  79. package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
  80. package/adapters/mcp/transports/http.ts +200 -683
  81. package/adapters/mcp/transports/oauth-http.ts +322 -0
  82. package/adapters/mcp/transports/session-registry.ts +6 -0
  83. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  84. package/adapters/mcp/types.ts +0 -6
  85. package/assets/hooks/lib/session-state.sh +0 -38
  86. package/assets/hooks/post-bash.sh +1 -1
  87. package/assets/hooks/post-tool-observer.sh +0 -5
  88. package/assets/hooks/prompt-guard.sh +0 -55
  89. package/assets/partials/04-project-structure.partial.md +1 -1
  90. package/assets/partials/07-footer.partial.md +1 -1
  91. package/assets/partials-agents/02-operating-mode.partial.md +1 -1
  92. package/assets/partials-agents/08-deep-docs.partial.md +1 -1
  93. package/assets/plugin-registry.v1.json +6 -4
  94. package/assets/reference-configs/agentic-development-flow.md +26 -1
  95. package/assets/reference-configs/external-tooling.md +0 -76
  96. package/assets/reference-configs/global-working-rules.md +19 -0
  97. package/assets/reference-configs/release-deploy.md +1 -1
  98. package/assets/templates/helpers/architecture-queue.sh +1 -1
  99. package/assets/templates/helpers/check-agent-tooling.sh +1 -327
  100. package/assets/templates/helpers/check-task-workflow.sh +1 -1
  101. package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
  102. package/assets/templates/helpers/migrate-project-template.sh +2 -2
  103. package/assets/workflow-contract.v1.json +0 -2
  104. package/docs/README.md +5 -2
  105. package/docs/architecture/CURRENT.md +205 -51
  106. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  107. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  108. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
  109. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  110. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  111. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  112. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  113. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
  114. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  115. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
  116. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
  117. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  118. package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
  119. package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
  120. package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
  121. package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
  122. package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
  123. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
  124. package/docs/architecture/domains/public-surface.md +3 -5
  125. package/docs/architecture/domains/verification.md +6 -5
  126. package/docs/architecture/domains/workflow-engine.md +6 -0
  127. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
  128. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
  129. package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
  130. package/docs/forge-plugin-management.md +16 -4
  131. package/docs/operations/controller-browser-plugin.md +23 -0
  132. package/docs/operations/controller-performance-and-502.md +17 -0
  133. package/docs/operations/controller-reliability-runbook.md +2 -2
  134. package/docs/operations/features.md +6 -7
  135. package/docs/operations/features.zh-CN.md +1 -1
  136. package/docs/operations/github-repository.md +4 -4
  137. package/docs/operations/github-semantic-release-projection.md +20 -0
  138. package/docs/operations/homebrew.md +2 -2
  139. package/docs/operations/mcp-tool-exposure.md +13 -52
  140. package/docs/operations/releasing.md +2 -0
  141. package/docs/operations/runtime-performance-diagnostics.md +8 -0
  142. package/docs/operations/standalone-disaster-recovery.md +15 -7
  143. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  144. package/docs/tutorials/03-first-repository-task.md +2 -0
  145. package/docs/wiki/Computer-and-Plugins.md +78 -0
  146. package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
  147. package/docs/wiki/Home.md +16 -2
  148. package/docs/wiki/Implementation.md +25 -13
  149. package/docs/wiki/Installation.md +28 -32
  150. package/docs/wiki/Integrations.md +4 -0
  151. package/docs/wiki/Quick-Start.md +35 -22
  152. package/docs/wiki/Releases-and-Upgrades.md +15 -25
  153. package/docs/wiki/_Sidebar.md +5 -1
  154. package/package.json +25 -25
  155. package/packages/kernel/cognition/api/index.ts +6 -0
  156. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  157. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  158. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  159. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  160. package/packages/kernel/cognition/domain/learning.ts +106 -0
  161. package/packages/kernel/cognition/domain/memory.ts +254 -0
  162. package/packages/kernel/controller/api/index.ts +1 -0
  163. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  164. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  165. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  166. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  167. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  168. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  169. package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
  170. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  171. package/packages/kernel/identity/api/index.ts +10 -0
  172. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  173. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  174. package/packages/kernel/identity/domain/grant.ts +72 -0
  175. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  176. package/packages/kernel/identity/domain/user-request.ts +93 -0
  177. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
  178. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  179. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  180. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  181. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  182. package/packages/kernel/scheduler/api/index.ts +0 -2
  183. package/packages/kernel/scheduler/application/eligibility.ts +4 -1
  184. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  185. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  186. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  187. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
  188. package/packages/kernel/work/api/index.ts +3 -2
  189. package/packages/kernel/work/application/work-service.ts +18 -42
  190. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  191. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  192. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  193. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  194. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  195. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  196. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  197. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  198. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  199. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  200. package/packages/kernel/work/domain/state-machine.ts +34 -65
  201. package/packages/kernel/work/domain/types.ts +57 -51
  202. package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
  203. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  204. package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
  205. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  206. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  207. package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
  208. package/packages/plugin-runtime/computer/index.ts +2 -0
  209. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  210. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  211. package/packages/protocols/computer/contract.ts +27 -1
  212. package/scripts/activate-source-baseline.ts +7 -9
  213. package/scripts/assemble-template.ts +11 -72
  214. package/scripts/canary-controller-semantic-wait.ts +12 -24
  215. package/scripts/check-mcp-compatibility.ts +94 -201
  216. package/scripts/check-package-identity.mjs +0 -5
  217. package/scripts/check-runtime-architecture.mjs +921 -239
  218. package/scripts/forge-local-recovery-helper.mjs +93 -15
  219. package/scripts/init-project.sh +0 -46
  220. package/scripts/install-ios-hid-toolchain.sh +60 -0
  221. package/scripts/install-standalone-recovery.ts +1 -1
  222. package/scripts/lib/project-init-lib.sh +6 -3
  223. package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
  224. package/scripts/open-source-audit-allowlist.txt +1 -3
  225. package/scripts/run-bounded-command.mjs +5 -0
  226. package/scripts/run-governed-gate.ts +2 -1
  227. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  228. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  229. package/scripts/smoke-ios-physical-device.ts +38 -10
  230. package/scripts/smoke-mcp-http-runtime.ts +12 -8
  231. package/scripts/smoke-mcp-tool-surface.ts +27 -41
  232. package/scripts/smoke-runtime-recovery.ts +12 -43
  233. package/scripts/smoke-schedule-engine.ts +23 -15
  234. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  235. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  236. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
  237. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  238. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  239. package/scripts/smoke-workflow-supervisor.ts +103 -0
  240. package/scripts/sync-generated-authority.mjs +0 -1
  241. package/scripts/verify-forge-runtime.sh +2 -1
  242. package/src/cli/agent-jobs/executor-health.ts +12 -35
  243. package/src/cli/agent-jobs/integration.ts +20 -51
  244. package/src/cli/agent-jobs/job-manager.ts +7 -3
  245. package/src/cli/chatgpt-browser/file-policy.ts +2 -2
  246. package/src/cli/commands/brain-assistant.ts +27 -13
  247. package/src/cli/commands/brain.ts +13 -15
  248. package/src/cli/commands/chatgpt.ts +1 -163
  249. package/src/cli/commands/doctor.ts +1 -143
  250. package/src/cli/commands/global-runtime.ts +3 -196
  251. package/src/cli/commands/init-hook.ts +6 -23
  252. package/src/cli/commands/init.ts +3 -252
  253. package/src/cli/commands/mcp.ts +0 -5
  254. package/src/cli/commands/prompt-guard-decision.ts +0 -2
  255. package/src/cli/commands/recovery.ts +137 -135
  256. package/src/cli/commands/repository.ts +17 -1
  257. package/src/cli/commands/runtime.ts +3 -3
  258. package/src/cli/commands/setup-execution.ts +41 -0
  259. package/src/cli/commands/setup-profile.ts +8 -0
  260. package/src/cli/controller/check-runner.ts +13 -2
  261. package/src/cli/controller/completion-backlog.ts +3 -3
  262. package/src/cli/controller/completion-orchestrator.ts +5 -44
  263. package/src/cli/controller/completion-target.ts +3 -72
  264. package/src/cli/controller/composite-operations.ts +1 -1
  265. package/src/cli/controller/context/instruction-context.ts +1 -1
  266. package/src/cli/controller/context/known-paths.ts +2 -2
  267. package/src/cli/controller/context/query-planning.ts +11 -4
  268. package/src/cli/controller/context/rule-resolution.ts +2 -2
  269. package/src/cli/controller/context/source-materializer.ts +83 -102
  270. package/src/cli/controller/context/structural-provider.ts +84 -0
  271. package/src/cli/controller/context/structural.ts +6 -6
  272. package/src/cli/controller/context/types.ts +8 -9
  273. package/src/cli/controller/context-pack.ts +107 -84
  274. package/src/cli/controller/execution-completion.ts +4 -7
  275. package/src/cli/controller/execution-policy.ts +36 -153
  276. package/src/cli/controller/governance.ts +2 -3
  277. package/src/cli/controller/issue-store.ts +4 -99
  278. package/src/cli/controller/launch-agents.ts +59 -18
  279. package/src/cli/controller/operational-plan.ts +25 -52
  280. package/src/cli/controller/runtime-config.ts +5 -1
  281. package/src/cli/controller/stuck-state-migration.ts +2 -3
  282. package/src/cli/controller/systemd-user.ts +42 -10
  283. package/src/cli/editing/edit-session.ts +18 -12
  284. package/src/cli/github/github.ts +4 -4
  285. package/src/cli/github/semantic-projection.ts +174 -0
  286. package/src/cli/hook/prompt-intents.ts +0 -9
  287. package/src/cli/index.ts +1 -43
  288. package/src/cli/local-bridge/connector-freshness.ts +1 -12
  289. package/src/cli/local-bridge/console-automations.ts +19 -14
  290. package/src/cli/local-bridge/console-view-models.ts +4 -13
  291. package/src/cli/local-bridge/facade-api.ts +64 -193
  292. package/src/cli/local-bridge/server.ts +24 -147
  293. package/src/cli/local-bridge/types.ts +0 -1
  294. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  295. package/src/cli/repositories/command-classifier.ts +0 -9
  296. package/src/cli/repositories/command-executor.ts +29 -23
  297. package/src/cli/repositories/command-scope.ts +37 -18
  298. package/src/cli/repositories/controller-home.ts +48 -0
  299. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  300. package/src/cli/repositories/git-command-executor.ts +2 -2
  301. package/src/cli/repositories/locks.ts +20 -0
  302. package/src/cli/repositories/registry.ts +79 -12
  303. package/src/cli/repositories/safe-patch.ts +2 -12
  304. package/src/cli/repositories/structured-git.ts +101 -5
  305. package/src/cli/repository/inspector.ts +185 -343
  306. package/src/cli/repository/session-cache.ts +92 -6
  307. package/src/effects/process-runner.ts +17 -1
  308. package/src/runtime/context/assistant-context.ts +20 -7
  309. package/src/runtime/context/assistant-work-context.ts +89 -27
  310. package/src/runtime/context/automatic-learning.ts +565 -0
  311. package/src/runtime/context/cognitive-attention.ts +173 -0
  312. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  313. package/src/runtime/context/context-closure.ts +46 -9
  314. package/src/runtime/context/context-pack-process.ts +103 -0
  315. package/src/runtime/context/context-plane.ts +1 -9
  316. package/src/runtime/context/direct-controller-learning.ts +298 -0
  317. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  318. package/src/runtime/context/semantic-navigation-contract.ts +16 -0
  319. package/src/runtime/context/semantic-navigation.ts +7 -35
  320. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  321. package/src/runtime/context/typescript-navigation.ts +89 -3
  322. package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
  323. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  324. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  325. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  326. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  327. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  328. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  329. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  330. package/src/runtime/control-plane/execution/validation.ts +6 -8
  331. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  332. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  333. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  334. package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
  335. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  336. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  337. package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
  338. package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
  339. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  340. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  341. package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
  342. package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
  343. package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
  344. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  345. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  346. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
  347. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
  348. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  349. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
  350. package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
  351. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  352. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  353. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  354. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  355. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  356. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  357. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  358. package/src/runtime/control-plane/facade/index.ts +0 -1
  359. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  360. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  361. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  362. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  363. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  364. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  365. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  366. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  367. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  368. package/src/runtime/control-plane/facade/types.ts +49 -108
  369. package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
  370. package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
  371. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  372. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  373. package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
  374. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
  375. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  376. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  377. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  378. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  379. package/src/runtime/control-plane/governance/external-effects.ts +1 -1
  380. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  381. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
  382. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  383. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  384. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  385. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  386. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  387. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  388. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  389. package/src/runtime/control-plane/release-retention.ts +135 -47
  390. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  391. package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
  392. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  393. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  394. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  395. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  396. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  397. package/src/runtime/evidence/artifact-store.ts +158 -40
  398. package/src/runtime/evidence/evidence-store.ts +112 -8
  399. package/src/runtime/evidence/output-handle-index.ts +225 -0
  400. package/src/runtime/evidence/result-store.ts +158 -44
  401. package/src/runtime/evidence/sensitive-output.ts +22 -2
  402. package/src/runtime/execution/jobs/child-reference.ts +11 -0
  403. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
  404. package/src/runtime/execution/jobs/store.ts +3 -4
  405. package/src/runtime/execution/managed-workspace.ts +57 -0
  406. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  407. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  408. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  409. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  410. package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
  411. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  412. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  413. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  414. package/src/runtime/execution/process-runtime/index.ts +3 -0
  415. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  416. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  417. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  418. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  419. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  420. package/src/runtime/execution/process-runtime/runtime.ts +55 -18
  421. package/src/runtime/execution/process-runtime/store.ts +30 -2
  422. package/src/runtime/execution/process-runtime/types.ts +6 -1
  423. package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
  424. package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
  425. package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
  426. package/src/runtime/execution/workers/executor.ts +3 -8
  427. package/src/runtime/maintenance/cleanup.ts +41 -5
  428. package/src/runtime/platform/service-inventory.ts +130 -0
  429. package/src/runtime/platform/service-manager.ts +8 -0
  430. package/src/runtime/plugins/action-application.ts +97 -29
  431. package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
  432. package/src/runtime/plugins/browser-adapter.ts +1124 -333
  433. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  434. package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
  435. package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
  436. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  437. package/src/runtime/plugins/browser-registration.ts +18 -0
  438. package/src/runtime/plugins/browser-runtime.ts +40 -36
  439. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  440. package/src/runtime/plugins/browser-session-store.ts +46 -76
  441. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  442. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
  443. package/src/runtime/plugins/computer-registration.ts +298 -20
  444. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  445. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  446. package/src/runtime/plugins/external-adapter.ts +42 -6
  447. package/src/runtime/plugins/external-registration.ts +21 -1
  448. package/src/runtime/plugins/github-adapter.ts +30 -3
  449. package/src/runtime/plugins/gmail-adapter.ts +189 -3
  450. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  451. package/src/runtime/plugins/google-shared.ts +24 -12
  452. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  453. package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
  454. package/src/runtime/plugins/ios-adapter.ts +46 -41
  455. package/src/runtime/plugins/ios-agent-device.ts +54 -4
  456. package/src/runtime/plugins/ios-device-ownership.ts +103 -0
  457. package/src/runtime/plugins/ios-physical-device.ts +497 -79
  458. package/src/runtime/plugins/lightweight-action.ts +208 -2
  459. package/src/runtime/plugins/local-system-adapter.ts +12 -100
  460. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  461. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  462. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  463. package/src/runtime/plugins/store.ts +682 -435
  464. package/src/runtime/plugins/types.ts +24 -0
  465. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  466. package/src/runtime/projections/git-status-sampler.ts +2 -19
  467. package/src/runtime/projections/invalidation.ts +7 -3
  468. package/src/runtime/projections/materialized-view.ts +80 -36
  469. package/src/runtime/recovery/actions.ts +4 -4
  470. package/src/runtime/recovery/capability-action-application.ts +46 -45
  471. package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
  472. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  473. package/src/runtime/recovery/probe.ts +2 -2
  474. package/src/runtime/recovery/store.ts +29 -11
  475. package/src/runtime/release/release-coordinator.ts +312 -0
  476. package/src/runtime/release/release-session.ts +716 -0
  477. package/src/runtime/release/release-state-migration.ts +25 -0
  478. package/src/runtime/resources/leases/store.ts +56 -25
  479. package/src/runtime/root/computer-composition.ts +191 -6
  480. package/src/runtime/root/controller-progression-composition.ts +254 -0
  481. package/src/runtime/root/controller-round-composition.ts +20 -1
  482. package/src/runtime/root/deployment-topology.ts +106 -0
  483. package/src/runtime/root/entry.ts +4 -3
  484. package/src/runtime/root/known-good-recovery.ts +184 -0
  485. package/src/runtime/root/local-bridge.ts +0 -1
  486. package/src/runtime/root/mcp-transport.ts +111 -18
  487. package/src/runtime/root/ownership.ts +261 -9
  488. package/src/runtime/root/package-connector-service.ts +227 -29
  489. package/src/runtime/root/package-runtime-release.ts +117 -30
  490. package/src/runtime/root/package-runtime-service.ts +24 -24
  491. package/src/runtime/root/release-execution-canary.ts +57 -12
  492. package/src/runtime/root/release-loader.ts +90 -8
  493. package/src/runtime/root/release-manifest.ts +80 -40
  494. package/src/runtime/root/release-materialize.ts +372 -106
  495. package/src/runtime/root/release-store.ts +395 -36
  496. package/src/runtime/root/runtime-lane.ts +191 -0
  497. package/src/runtime/root/runtime.ts +160 -29
  498. package/src/runtime/root/scheduled-controller-composition.ts +29 -3
  499. package/src/runtime/root/service-runner.ts +2 -2
  500. package/src/runtime/root/service.ts +126 -44
  501. package/src/runtime/root/status.ts +48 -0
  502. package/src/runtime/root/types.ts +32 -9
  503. package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
  504. package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
  505. package/src/runtime/root/write-fence.ts +50 -2
  506. package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
  507. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  508. package/src/runtime/safe-tooling/ios-development.ts +22 -8
  509. package/src/runtime/safe-tooling/job-summary.ts +1 -1
  510. package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
  511. package/src/runtime/shared/atomic-text-file.ts +21 -0
  512. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  513. package/src/runtime/shared/json-files.ts +8 -3
  514. package/src/runtime/shared/process-environment.ts +20 -9
  515. package/src/runtime/shared/response-budget.ts +1 -3
  516. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  517. package/src/runtime/standalone-recovery/core.ts +3792 -417
  518. package/src/runtime/standalone-recovery/entry.ts +507 -45
  519. package/src/runtime/standalone-recovery/installer.ts +262 -148
  520. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  521. package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
  522. package/src/runtime/standalone-recovery/performance.ts +54 -16
  523. package/src/runtime/standalone-recovery/release.ts +53 -5
  524. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  525. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  526. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  527. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
  528. package/src/runtime/workflow/schedules/engine.ts +166 -178
  529. package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
  530. package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
  531. package/src/runtime/workflows/runtime.ts +15 -19
  532. package/src/testing/test-governance.ts +5 -1
  533. package/supervisor/chatgpt-conversation.ts +23 -0
  534. package/supervisor/client.ts +218 -0
  535. package/supervisor/control-plane.ts +963 -0
  536. package/supervisor/entry.ts +15 -0
  537. package/supervisor/forge-validators.ts +147 -0
  538. package/supervisor/index.ts +5 -0
  539. package/supervisor/native-browser-adapter.ts +1151 -0
  540. package/supervisor/native-messaging/host.ts +58 -0
  541. package/supervisor/native-messaging/manifest.ts +26 -0
  542. package/supervisor/native-messaging/protocol.ts +27 -0
  543. package/supervisor/paths.ts +18 -0
  544. package/supervisor/protocol.ts +250 -0
  545. package/supervisor/server.ts +412 -0
  546. package/supervisor/store.ts +1870 -0
  547. package/supervisor/tsconfig.json +8 -0
  548. package/supervisor/types.ts +261 -0
  549. package/SKILL.md +0 -427
  550. package/adapters/chatgpt/controller-host.ts +0 -119
  551. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  552. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  553. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  554. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
  555. package/adapters/mcp/toolset-selection.ts +0 -41
  556. package/agents/openai.yaml +0 -4
  557. package/assets/skill-hooks.json +0 -41
  558. package/assets/skill-version.json +0 -189
  559. package/assets/skills/claude-review/SKILL.md +0 -231
  560. package/assets/skills/codex-review/SKILL.md +0 -103
  561. package/assets/templates/helpers/check-skill-version.ts +0 -193
  562. package/packages/kernel/progression/api/index.ts +0 -2
  563. package/packages/kernel/progression/application/projector.ts +0 -211
  564. package/packages/kernel/progression/domain/types.ts +0 -116
  565. package/packages/kernel/progression/index.ts +0 -1
  566. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  567. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  568. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  569. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  570. package/scripts/benchmark-background-check-overlap.ts +0 -228
  571. package/scripts/benchmark-computer-hotpath.ts +0 -255
  572. package/scripts/benchmark-controller-hotpath.ts +0 -212
  573. package/scripts/benchmark-controller-round2.ts +0 -191
  574. package/scripts/benchmark-ios-agent-device.ts +0 -511
  575. package/scripts/benchmark-mcp-host.sh +0 -117
  576. package/scripts/benchmark-mcp-transport.ts +0 -169
  577. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  578. package/scripts/benchmark-operational-shadow.ts +0 -28
  579. package/scripts/benchmark-quality-harness.ts +0 -146
  580. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  581. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  582. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  583. package/scripts/benchmark-thin-harness.ts +0 -251
  584. package/scripts/benchmark-typescript-navigation.ts +0 -186
  585. package/scripts/benchmark-work-efficiency.ts +0 -334
  586. package/scripts/build-controller-ui.ts +0 -28
  587. package/scripts/check-npm-release.sh +0 -32
  588. package/scripts/check-public-release-surface.sh +0 -19
  589. package/scripts/check-release-published.sh +0 -57
  590. package/scripts/check-release-readiness.sh +0 -37
  591. package/scripts/check-release-version.mjs +0 -74
  592. package/scripts/check-skill-version.ts +0 -5
  593. package/scripts/check-tarball-install-smoke.sh +0 -150
  594. package/scripts/ensure-codegraph.sh +0 -16
  595. package/scripts/package-source-archive.sh +0 -147
  596. package/scripts/public-release-files.txt +0 -39
  597. package/scripts/public-release.ts +0 -174
  598. package/scripts/publish-release-tarball.sh +0 -27
  599. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  600. package/scripts/run-skill-hook.ts +0 -244
  601. package/scripts/stage-runtime-release.ts +0 -44
  602. package/scripts/sync-codex-installed-copies.sh +0 -182
  603. package/src/cli/commands/tools.ts +0 -167
  604. package/src/cli/controller/progress.ts +0 -656
  605. package/src/cli/controller/work-mode.ts +0 -181
  606. package/src/cli/local-bridge/console-assets.ts +0 -17
  607. package/src/cli/local-bridge/dashboard.ts +0 -17
  608. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  609. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  610. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  611. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  612. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  613. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  614. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  615. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  616. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  617. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  618. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  619. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  620. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  621. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  622. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  623. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  624. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  625. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  626. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  627. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  628. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  629. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  630. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  631. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  632. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  633. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  634. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  635. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  636. package/src/cli/mcp/access-mode.ts +0 -2
  637. package/src/cli/mcp/access-tools.ts +0 -2
  638. package/src/cli/mcp/audit.ts +0 -2
  639. package/src/cli/mcp/auth.ts +0 -2
  640. package/src/cli/mcp/instructions.ts +0 -2
  641. package/src/cli/mcp/legacy-context.ts +0 -2
  642. package/src/cli/mcp/legacy-tool-service.ts +0 -2
  643. package/src/cli/mcp/multi-repository.ts +0 -2
  644. package/src/cli/mcp/oauth.ts +0 -2
  645. package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
  646. package/src/cli/mcp/paths.ts +0 -2
  647. package/src/cli/mcp/policy.ts +0 -2
  648. package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
  649. package/src/cli/mcp/proxy-env.ts +0 -2
  650. package/src/cli/mcp/readiness-projection.ts +0 -2
  651. package/src/cli/mcp/redaction.ts +0 -2
  652. package/src/cli/mcp/repo.ts +0 -2
  653. package/src/cli/mcp/repository-tools.ts +0 -2
  654. package/src/cli/mcp/server.ts +0 -2
  655. package/src/cli/mcp/setup.ts +0 -2
  656. package/src/cli/mcp/tool-capability-cache.ts +0 -2
  657. package/src/cli/mcp/tool-contract.ts +0 -2
  658. package/src/cli/mcp/tools.ts +0 -2
  659. package/src/cli/mcp/toolset-names.ts +0 -2
  660. package/src/cli/mcp/toolset-selection.ts +0 -2
  661. package/src/cli/mcp/toolset.ts +0 -2
  662. package/src/cli/mcp/transports/http.ts +0 -2
  663. package/src/cli/mcp/transports/session-registry.ts +0 -2
  664. package/src/cli/mcp/transports/stdio.ts +0 -2
  665. package/src/cli/mcp/types.ts +0 -2
  666. package/src/cli/mcp/umbrella-tools.ts +0 -2
  667. package/src/cli/tools/codegraph.ts +0 -695
  668. package/src/core/adoption/helper-wrapper-plan.ts +0 -159
  669. package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
  670. package/src/runtime/context/codegraph-read-provider.ts +0 -611
  671. package/src/runtime/context/codegraph-sidecar.cjs +0 -248
  672. package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
  673. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  674. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  675. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  676. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  677. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  678. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  679. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  680. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  681. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  682. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  683. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  684. package/src/runtime/control-plane/routing/index.ts +0 -1
  685. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  686. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
  687. package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
  688. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
  689. package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
  690. package/src/runtime/gateway/mcp/process-tools.ts +0 -2
  691. package/src/runtime/gateway/mcp/router.ts +0 -2
  692. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
  693. package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
  694. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
  695. package/src/runtime/plugins/browser-provider-registry.ts +0 -2
@@ -4,15 +4,46 @@ import { existsSync, readFileSync } from 'fs';
4
4
  import { isAbsolute, join, resolve } from 'path';
5
5
  import { pathToFileURL } from 'url';
6
6
  import { resolveControllerHome } from '../src/cli/repositories/controller-home.ts';
7
- import { findRegisteredRepositoryByCheckoutRoot } from '../src/cli/repositories/registry.ts';
7
+ import { findRegisteredRepositoryByCheckoutRoot, getRepository } from '../src/cli/repositories/registry.ts';
8
8
  import { createRecoveryConfig, gatewayToken, loadRecoveryConfig } from '../src/runtime/standalone-recovery/core.ts';
9
9
 
10
10
  export const PLUGIN_ID = 'local_recovery';
11
11
  export const PLUGIN_VERSION = '0.1.0';
12
12
  export const PROTOCOL_VERSION = 1;
13
13
  export const CAPABILITIES = ['forge.local_recovery.transport.v1'];
14
- export const ACTIONS = ['runtime_status', 'list_releases', 'stage_and_activate_runtime_release'];
15
- const MUTATING_ACTIONS = new Set(['stage_and_activate_runtime_release']);
14
+ export const ACTIONS = [
15
+ 'runtime_status',
16
+ 'list_releases',
17
+ 'verify_stable_runtime',
18
+ 'stage_and_activate_runtime_release',
19
+ 'release_session_status',
20
+ 'advance_runtime_release_session',
21
+ 'verify_runtime_release_session_static',
22
+ 'verify_runtime_release_session_candidate',
23
+ 'cutover_runtime_release_session',
24
+ 'cancel_runtime_release_session',
25
+ 'rollback_runtime_release_session',
26
+ 'promote_runtime_release_session_known_good',
27
+ ];
28
+ const RELEASE_SESSION_ACTIONS = new Set([
29
+ 'release_session_status',
30
+ 'verify_runtime_release_session_static',
31
+ 'verify_runtime_release_session_candidate',
32
+ 'cutover_runtime_release_session',
33
+ 'cancel_runtime_release_session',
34
+ 'rollback_runtime_release_session',
35
+ 'promote_runtime_release_session_known_good',
36
+ ]);
37
+ const MUTATING_ACTIONS = new Set([
38
+ 'stage_and_activate_runtime_release',
39
+ 'advance_runtime_release_session',
40
+ 'verify_runtime_release_session_static',
41
+ 'verify_runtime_release_session_candidate',
42
+ 'cutover_runtime_release_session',
43
+ 'cancel_runtime_release_session',
44
+ 'rollback_runtime_release_session',
45
+ 'promote_runtime_release_session_known_good',
46
+ ]);
16
47
  const LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost', '::1']);
17
48
 
18
49
  function providerError(code, message, retryable = false, details) {
@@ -91,8 +122,7 @@ export async function callRecoveryTool(controllerHome, toolName, args = {}, inje
91
122
  protocolVersion: '2025-06-18', capabilities: {}, clientInfo: { name: 'forge-local-recovery-provider', version: PLUGIN_VERSION },
92
123
  },
93
124
  });
94
- const sessionId = initialized.response.headers.get('mcp-session-id');
95
- if (!sessionId) throw providerError('LOCAL_RECOVERY_MCP_SESSION_MISSING', 'Recovery MCP initialize did not return a session id.');
125
+ const sessionId = initialized.response.headers.get('mcp-session-id') || undefined;
96
126
  try {
97
127
  await postRpc(fetchImpl, endpoint, token, { jsonrpc: '2.0', method: 'notifications/initialized' }, sessionId);
98
128
  const called = await postRpc(fetchImpl, endpoint, token, {
@@ -101,15 +131,21 @@ export async function callRecoveryTool(controllerHome, toolName, args = {}, inje
101
131
  if (called.payload?.error) throw providerError('LOCAL_RECOVERY_TOOL_FAILED', String(called.payload.error?.message ?? 'Recovery tool failed.'), false);
102
132
  const content = called.payload?.result?.content;
103
133
  const text = Array.isArray(content) ? content.find((entry) => entry?.type === 'text' && typeof entry.text === 'string')?.text : undefined;
134
+ if (called.payload?.result?.isError === true) {
135
+ const message = typeof text === 'string' && text.trim() ? text.trim().slice(0, 4000) : 'Recovery tool failed.';
136
+ throw providerError('LOCAL_RECOVERY_TOOL_FAILED', message, false);
137
+ }
104
138
  if (text) return parseJson(text, 'LOCAL_RECOVERY_TOOL_RESULT_INVALID');
105
139
  return called.payload?.result ?? {};
106
140
  } finally {
107
- try {
108
- await fetchImpl(endpoint, {
109
- method: 'DELETE',
110
- headers: { authorization: `Bearer ${token}`, accept: 'application/json, text/event-stream', 'mcp-session-id': sessionId },
111
- });
112
- } catch { /* Session cleanup is best effort; Recovery owns mutation transaction durability. */ }
141
+ if (sessionId) {
142
+ try {
143
+ await fetchImpl(endpoint, {
144
+ method: 'DELETE',
145
+ headers: { authorization: `Bearer ${token}`, accept: 'application/json, text/event-stream', 'mcp-session-id': sessionId },
146
+ });
147
+ } catch { /* Session cleanup is best effort; ReleaseSession durability is independent from this transport session. */ }
148
+ }
113
149
  }
114
150
  }
115
151
 
@@ -119,6 +155,17 @@ function assertEmptyInput(input) {
119
155
  }
120
156
  }
121
157
 
158
+ function releaseSessionInput(input) {
159
+ if (!input || typeof input !== 'object' || Array.isArray(input) || Object.keys(input).length !== 1 || typeof input.session_id !== 'string') {
160
+ throw providerError('LOCAL_RECOVERY_RELEASE_SESSION_ARGUMENTS_INVALID', 'ReleaseSession actions accept only session_id.');
161
+ }
162
+ const sessionId = input.session_id.trim();
163
+ if (sessionId.length < 8 || sessionId.length > 120) {
164
+ throw providerError('LOCAL_RECOVERY_RELEASE_SESSION_ID_INVALID', 'ReleaseSession session_id must be 8 to 120 characters.');
165
+ }
166
+ return { session_id: sessionId };
167
+ }
168
+
122
169
  function mutationRequestId(requestId) {
123
170
  return `local-recovery:${createHash('sha256').update(String(requestId)).digest('hex').slice(0, 32)}`;
124
171
  }
@@ -127,9 +174,36 @@ export function ensureSourceRepositoryProvenance(controllerHome, injected = {})
127
174
  const loadConfig = injected.loadRecoveryConfig ?? loadRecoveryConfig;
128
175
  const persistConfig = injected.createRecoveryConfig ?? createRecoveryConfig;
129
176
  const findRepository = injected.findRegisteredRepositoryByCheckoutRoot ?? findRegisteredRepositoryByCheckoutRoot;
177
+ const readRepository = injected.getRepository ?? getRepository;
130
178
  const recoveryConfig = loadConfig(controllerHome);
131
- if (typeof recoveryConfig.primaryRuntimeSourceRepositoryId === 'string' && recoveryConfig.primaryRuntimeSourceRepositoryId.trim()) return recoveryConfig;
179
+ const repositoryId = typeof recoveryConfig.primaryRuntimeSourceRepositoryId === 'string'
180
+ ? recoveryConfig.primaryRuntimeSourceRepositoryId.trim()
181
+ : '';
132
182
  const sourceRoot = typeof recoveryConfig.primaryRuntimeSourceRoot === 'string' ? recoveryConfig.primaryRuntimeSourceRoot.trim() : '';
183
+
184
+ if (repositoryId) {
185
+ let repository;
186
+ try {
187
+ repository = readRepository(repositoryId, controllerHome);
188
+ } catch {
189
+ throw providerError('LOCAL_RECOVERY_SOURCE_REPOSITORY_UNRESOLVED', 'Configured primary Runtime source repository id is not one enabled registered repository.');
190
+ }
191
+ if (!repository || repository.repoId !== repositoryId || repository.enabled === false || repository.removedAt) {
192
+ throw providerError('LOCAL_RECOVERY_SOURCE_REPOSITORY_UNRESOLVED', 'Configured primary Runtime source repository id is not one enabled registered repository.');
193
+ }
194
+ const canonicalRoot = typeof repository.canonicalRoot === 'string' && repository.canonicalRoot.trim()
195
+ ? resolve(repository.canonicalRoot.trim())
196
+ : '';
197
+ if (!canonicalRoot || !isAbsolute(canonicalRoot) || !existsSync(canonicalRoot)) {
198
+ throw providerError('LOCAL_RECOVERY_SOURCE_CANONICAL_ROOT_UNAVAILABLE', 'Configured primary Runtime source repository canonical root is unavailable.');
199
+ }
200
+ if (sourceRoot && resolve(sourceRoot) === canonicalRoot) return recoveryConfig;
201
+ return persistConfig(controllerHome, {
202
+ primaryRuntimeSourceRoot: canonicalRoot,
203
+ primaryRuntimeSourceRepositoryId: repositoryId,
204
+ });
205
+ }
206
+
133
207
  if (!sourceRoot) throw providerError('LOCAL_RECOVERY_SOURCE_ROOT_UNAVAILABLE', 'Installed Recovery config does not identify the primary Runtime source root.');
134
208
  const repository = findRepository(sourceRoot, controllerHome);
135
209
  if (!repository?.repoId) throw providerError('LOCAL_RECOVERY_SOURCE_REPOSITORY_UNRESOLVED', 'Configured primary Runtime source root is not owned by one registered repository.');
@@ -142,10 +216,14 @@ export function ensureSourceRepositoryProvenance(controllerHome, injected = {})
142
216
  export async function executeAction(actionId, input, providerConfig, injected = {}) {
143
217
  const config = validateProviderConfig(providerConfig);
144
218
  if (!ACTIONS.includes(actionId)) throw providerError('LOCAL_RECOVERY_ACTION_UNSUPPORTED', 'Unsupported Local Recovery action.');
145
- assertEmptyInput(input);
219
+ const sessionArgs = RELEASE_SESSION_ACTIONS.has(actionId) ? releaseSessionInput(input) : undefined;
220
+ if (!sessionArgs) assertEmptyInput(input);
146
221
  const callTool = injected.callRecoveryTool ?? callRecoveryTool;
147
- if (actionId === 'stage_and_activate_runtime_release') ensureSourceRepositoryProvenance(config.controllerHome, injected);
148
- const args = MUTATING_ACTIONS.has(actionId) ? { request_id: mutationRequestId(injected.requestId ?? actionId) } : {};
222
+ if (actionId === 'stage_and_activate_runtime_release' || actionId === 'advance_runtime_release_session') ensureSourceRepositoryProvenance(config.controllerHome, injected);
223
+ const args = {
224
+ ...(sessionArgs ?? {}),
225
+ ...(MUTATING_ACTIONS.has(actionId) ? { request_id: mutationRequestId(injected.requestId ?? actionId) } : {}),
226
+ };
149
227
  return await callTool(config.controllerHome, actionId, args, injected);
150
228
  }
151
229
 
@@ -373,60 +373,14 @@ install_dev_tools() {
373
373
  echo -e "${GREEN}Dev tools installed!${NC}"
374
374
  }
375
375
 
376
- # Write version stamp into the generated project
377
- write_version_stamp() {
378
- local skill_version_file="$SCRIPT_DIR/../assets/skill-version.json"
379
- local stamp_dir=".claude"
380
- local stamp_file="$stamp_dir/.skill-version"
381
- local sv_version="unknown"
382
- local sv_template_version="unknown"
383
-
384
- if [ -f "$skill_version_file" ] && command_exists bun; then
385
- sv_version=$(bun -e "console.log(JSON.parse(require('fs').readFileSync('$skill_version_file','utf-8')).version)")
386
- sv_template_version=$(bun -e "console.log(JSON.parse(require('fs').readFileSync('$skill_version_file','utf-8')).templateVersion)")
387
- elif [ -f "$skill_version_file" ] && command_exists node; then
388
- sv_version=$(node -e "console.log(JSON.parse(require('fs').readFileSync('$skill_version_file','utf-8')).version)")
389
- sv_template_version=$(node -e "console.log(JSON.parse(require('fs').readFileSync('$skill_version_file','utf-8')).templateVersion)")
390
- fi
391
-
392
- mkdir -p "$stamp_dir"
393
- cat > "$stamp_file" << STAMP_EOF
394
- skill_version=$sv_version
395
- template_version=$sv_template_version
396
- generated_at=$(date -u '+%Y-%m-%dT%H:%M:%SZ')
397
- plan_type=${STACK}
398
- STAMP_EOF
399
- echo -e "${GREEN}Version stamp written to $stamp_file${NC}"
400
- }
401
-
402
- # Run a skill lifecycle hook (if bun is available)
403
- run_skill_hook() {
404
- local event="$1"
405
- local hook_script="$SCRIPT_DIR/run-skill-hook.ts"
406
-
407
- if command_exists bun && [ -f "$hook_script" ]; then
408
- bun "$hook_script" "$event" --context "{\"projectName\":\"$PROJECT_NAME\",\"stack\":\"$STACK\"}" 2>&1 || {
409
- if [[ "$event" == pre-* ]]; then
410
- echo -e "${RED}Pre-hook $event failed, aborting.${NC}"
411
- return 1
412
- else
413
- echo -e "${YELLOW}Post-hook $event warning (non-fatal).${NC}"
414
- fi
415
- }
416
- fi
417
- }
418
-
419
376
  # Main execution
420
377
  main() {
421
- run_skill_hook "pre-init" || exit 1
422
378
 
423
379
  check_package_manager
424
380
  create_project
425
381
  create_structure
426
382
  install_dev_tools
427
- write_version_stamp
428
383
 
429
- run_skill_hook "post-init"
430
384
 
431
385
  echo ""
432
386
  echo -e "${GREEN}=== Project initialized successfully! ===${NC}"
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env bash
2
+ # Install the one Controller-owned physical-iPhone HID Python toolchain.
3
+ # Execute only with an authorized ForgeInstance host process:exec grant.
4
+ set -euo pipefail
5
+
6
+ if [[ $# -ne 1 || ! -d "$1" ]]; then
7
+ echo "Usage: $0 <existing-controller-home>" >&2
8
+ exit 2
9
+ fi
10
+ if [[ "$(uname -s)" != "Darwin" ]]; then
11
+ echo "The CoreDevice HID toolchain requires macOS." >&2
12
+ exit 2
13
+ fi
14
+
15
+ repo_root="$(cd "$(dirname "$0")/.." && pwd -P)"
16
+ controller_home="$(cd "$1" && pwd -P)"
17
+ version="11.24.0"
18
+ # The provider source is the sole runtime version authority. Refuse a stale installer.
19
+ if ! grep -Fq "export const IOS_HID_TOOLCHAIN_VERSION = '$version';" \
20
+ "$repo_root/src/runtime/plugins/ios/remote-xpc-hid.ts"; then
21
+ echo "Installer version no longer matches the RemoteXPC provider pin." >&2
22
+ exit 2
23
+ fi
24
+
25
+ toolchains="$controller_home/toolchains"
26
+ mkdir -p "$toolchains"
27
+ target="$toolchains/pymobiledevice3-$version"
28
+ lock="$toolchains/.pymobiledevice3-$version-install.lock"
29
+ if ! mkdir "$lock" 2>/dev/null; then
30
+ echo "The pinned HID toolchain is already being installed; no parallel writer." >&2
31
+ exit 1
32
+ fi
33
+
34
+ created=false
35
+ completed=false
36
+ cleanup() {
37
+ if [[ "$created" == true && "$completed" != true ]]; then
38
+ rm -rf -- "$target"
39
+ fi
40
+ rmdir "$lock" 2>/dev/null || true
41
+ }
42
+ trap cleanup EXIT
43
+
44
+ verify() {
45
+ "$1" -c "from importlib.metadata import version; from pymobiledevice3.remote.remote_service_discovery import RemoteServiceDiscoveryService; from pymobiledevice3.remote.core_device.pasteboard_service import PasteboardService; from pymobiledevice3.remote.core_device.hid_service import UniversalHIDServiceService, touch_session; actual=version('pymobiledevice3'); assert actual == '$version', (actual, '$version'); print('pymobiledevice3 ' + actual + ' verified')"
46
+ }
47
+
48
+ if [[ -e "$target" ]]; then
49
+ verify "$target/bin/python"
50
+ completed=true
51
+ exit 0
52
+ fi
53
+
54
+ # A newly created target is owned by this invocation. Never alter an old toolchain.
55
+ created=true
56
+ python3 -m venv "$target"
57
+ "$target/bin/python" -m pip install --disable-pip-version-check --no-input "pymobiledevice3==$version"
58
+ verify "$target/bin/python"
59
+ completed=true
60
+ printf 'Installed Controller-owned HID toolchain: %s\n' "$target"
@@ -2,7 +2,7 @@ import { createHash } from 'crypto';
2
2
  import { isAbsolute, join, resolve } from 'path';
3
3
  import { hostname } from 'os';
4
4
  import { systemdUserUnitName } from '../src/cli/controller/systemd-user';
5
- import { openAiSecureTunnelConnectArgs } from '../src/cli/mcp/openai-secure-tunnel';
5
+ import { openAiSecureTunnelConnectArgs } from '../adapters/mcp/tunnels/openai-secure-tunnel';
6
6
  import type { OpenAiSecureTunnelServiceConfig, PrimaryConnectorServiceConfig, PublicTunnelServiceConfig, RecoveryTunnelServiceConfig } from '../src/runtime/standalone-recovery/core';
7
7
  import { installStandaloneRecovery } from '../src/runtime/standalone-recovery/installer';
8
8
 
@@ -1029,7 +1029,7 @@ pi_install_helpers() {
1029
1029
  local target_dir="$1"
1030
1030
  local helpers_dir="$2"
1031
1031
  local mode="${3:-apply}"
1032
- local helper_names="${4:-new-spec.sh new-sprint.sh new-plan.sh capture-plan.sh plan-to-todo.sh contract-run.ts contract-worktree.sh ship-worktrees.sh archive-workflow.sh refresh-current-status.sh prepare-handoff.sh verify-contract.sh summarize-failures.sh verify-sprint.sh sprint-backlog.sh check-task-sync.sh check-deploy-sql-order.sh check-architecture-sync.sh check-agent-tooling.sh check-context-files.sh check-brain-manifest.sh sync-brain-docs.sh check-skill-version.ts select-agent-context-blocks.sh ensure-task-workflow.sh check-task-workflow.sh switch-plan.sh workflow-contract.ts inspect-project-state.ts migrate-workflow-docs.ts migrate-project-template.sh capability-resolver.ts architecture-event.ts capability-config.ts architecture-queue.sh context-contract-sync.sh workstream-sync.sh prepare-codex-handoff.sh codex-handoff-resume.sh}"
1032
+ local helper_names="${4:-new-spec.sh new-sprint.sh new-plan.sh capture-plan.sh plan-to-todo.sh contract-run.ts contract-worktree.sh ship-worktrees.sh archive-workflow.sh refresh-current-status.sh prepare-handoff.sh verify-contract.sh summarize-failures.sh verify-sprint.sh sprint-backlog.sh check-task-sync.sh check-deploy-sql-order.sh check-architecture-sync.sh check-agent-tooling.sh check-context-files.sh check-brain-manifest.sh sync-brain-docs.sh select-agent-context-blocks.sh ensure-task-workflow.sh check-task-workflow.sh switch-plan.sh workflow-contract.ts inspect-project-state.ts migrate-workflow-docs.ts migrate-project-template.sh capability-resolver.ts architecture-event.ts capability-config.ts architecture-queue.sh context-contract-sync.sh workstream-sync.sh prepare-codex-handoff.sh codex-handoff-resume.sh}"
1033
1033
  local scripts_dir="$target_dir/scripts"
1034
1034
  local runtime_dir="$target_dir/.ai/harness/scripts"
1035
1035
  local helper_name
@@ -1283,7 +1283,7 @@ pi_external_tooling_defaults_summary() {
1283
1283
  - Mode: optional-enhancements
1284
1284
  - Detection: setup/readiness only
1285
1285
  - Waza/gstack/gbrain/Mermaid: optional host enhancements; never required for Forge correctness
1286
- - CodeGraph: Forge bundled structural backend; global CLI/MCP is optional host integration
1286
+ - Code location: ripgrep lexical source search with explicit language-service definition/reference navigation; no managed graph index
1287
1287
  - Auto-actions: never install, upgrade, serve, sync, or enable unrelated third-party tooling automatically
1288
1288
  EOF_EXTERNAL_TOOLING_DEFAULTS
1289
1289
  }
@@ -1424,7 +1424,7 @@ pi_forge_version_for_refs() {
1424
1424
  printf '%s\n' "unknown"
1425
1425
  return 0
1426
1426
  fi
1427
- local version_file="$root_dir/assets/skill-version.json"
1427
+ local version_file="$root_dir/package.json"
1428
1428
 
1429
1429
  if [[ -f "$version_file" ]]; then
1430
1430
  sed -n 's/^[[:space:]]*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$version_file" | head -n 1
@@ -1825,6 +1825,9 @@ This is the root routing contract for Claude Code and Codex.
1825
1825
  - Keep root context concise; route durable human-authored detail into product, architecture, research, or intentional project documents.
1826
1826
  - Treat `_ref/` as ignored external reference material and `_ops/` as ignored local operations residue.
1827
1827
  - Use Controller Home for mutable workflow state instead of recreating repo-local task/workstream/session projections.
1828
+ - For architecture migrations, use one bounded Delivery Transaction: batch discovery -> architecture/root-cause decision -> freeze scope -> coherent implementation -> whole-diff review -> focused validation wave -> canonical gates -> one delivery/cleanup.
1829
+ - Do not create sibling Work, per-file commits, repeated broad validation, or release/canary cycles for same-root-cause discoveries while the current candidate is still moving.
1830
+ - Treat release as a source-complete candidate boundary. Defer workflow/lifecycle machinery improvements to a post-release Plan when they are not required to converge the current version safely.
1828
1831
  EOF_ROOT_CONTEXT
1829
1832
  }
1830
1833
 
@@ -12,6 +12,7 @@ import {
12
12
  import { homedir } from 'os';
13
13
  import { basename, dirname, join, resolve } from 'path';
14
14
  import { spawnSync } from 'child_process';
15
+ import { assertRuntimeReleaseExecutionCanaries } from '../src/runtime/root/release-execution-canary';
15
16
  import { stageRuntimeRelease } from '../src/runtime/root/release-materialize';
16
17
  import { publishRuntimeRelease } from '../src/runtime/root/release-store';
17
18
 
@@ -254,6 +255,7 @@ try {
254
255
  // the clean source checkout before any canonical unit starts.
255
256
  preserveLegacyReleaseAuthority(destination, timestamp);
256
257
  const stagedRelease = stageRuntimeRelease({ controllerHome: destination, sourceRoot });
258
+ assertRuntimeReleaseExecutionCanaries(stagedRelease.manifestPath, destination);
257
259
  publishRuntimeRelease(destination, stagedRelease.manifestPath, `windows-wsl-controller-home-migration-${timestamp}`);
258
260
  const release = readActiveRelease(destination);
259
261
  atomicWrite(unitPath(units.canonicalRuntime), renderRuntimeUnit(destination, units.canonicalRuntime, release), 0o644);
@@ -17,7 +17,6 @@ tests/readme-dx.test.ts
17
17
 
18
18
  # Runtime proxy bypass intentionally includes Tailscale's standardized CGNAT CIDR.
19
19
  adapters/mcp/proxy-env.ts
20
- src/cli/mcp/proxy-env.ts
21
20
 
22
21
  # Scanner / redaction implementations intentionally embed pattern samples.
23
22
  scripts/public-release.ts
@@ -45,8 +44,6 @@ tests/runtime/target-architecture.test.ts
45
44
  # and installation locations to prove discovery and identity fencing.
46
45
  scripts/portability-bindings.mjs
47
46
  tests/runtime/browser-product-discovery.test.ts
48
- tests/runtime/chatgpt-work-continuation.test.ts
49
- tests/runtime/frozen-tool-contract-abi.test.ts
50
47
  tests/runtime/windows-host-discovery.test.ts
51
48
  tests/runtime/standalone-recovery.test.ts
52
49
  # Secret-marker rejection tests use non-secret synthetic values by design.
@@ -55,3 +52,4 @@ tests/runtime/context-plane.test.ts
55
52
  # Supervisor service unit tests use synthetic homeDir placeholders for PATH assembly.
56
53
  # Local monitor bridge defaults may reference a development repository id.
57
54
  scripts/run-mobile-monitor-bridge.ts
55
+ tests/runtime/browser-session-authority.test.ts # Intentional placeholder user profile used to prove foreign Chrome profiles are never reclaimed.
@@ -49,6 +49,11 @@ if (!Number.isInteger(timeoutMs) || timeoutMs < 1 || commandArgs.length === 0) {
49
49
  });
50
50
  child.once('close', (code) => {
51
51
  clearTimeout(timeout);
52
+ // The direct child can exit on SIGTERM while a stubborn descendant remains
53
+ // alive in its detached process group. Before dropping the escalation timer,
54
+ // synchronously send SIGKILL to that process group once more so timeout
55
+ // completion cannot orphan compiler/test descendants.
56
+ if (timedOut && process.platform !== 'win32') stop('SIGKILL');
52
57
  if (escalation) clearTimeout(escalation);
53
58
  process.exitCode = launchFailed ? 1 : (timedOut ? 124 : code ?? 1);
54
59
  });
@@ -22,12 +22,13 @@ export function stepsFor(gate: Gate): Step[] {
22
22
  { label: 'repository hygiene', command: 'node', args: ['scripts/check-repository-hygiene.mjs'], timeoutMs: 2 * 60_000 },
23
23
  { label: 'generated authority', command: 'node', args: ['scripts/sync-generated-authority.mjs', '--check'], timeoutMs: 2 * 60_000 },
24
24
  { label: 'source duplication', command: 'node', args: ['scripts/check-source-duplication.mjs'], timeoutMs: 2 * 60_000 },
25
- { label: 'controller UI bundle', command: 'bun', args: ['run', 'check:controller-ui'], timeoutMs: 5 * 60_000 },
26
25
  { label: 'test manifest', command: 'bun', args: ['run', 'check:test-governance'], timeoutMs: 5 * 60_000 },
27
26
  { label: 'affected tests', command: 'bun', args: ['run', 'test'], timeoutMs: 30 * 60_000 },
28
27
  ];
29
28
  if (gate === 'main') return [
30
29
  { label: 'focused task receipt', gate: 'task' },
30
+ { label: 'frozen MCP tool contract', command: 'bun', args: ['run', 'check:mcp-compatibility'], timeoutMs: 2 * 60_000 },
31
+ { label: 'quality harness benchmark', command: 'bun', args: ['run', 'check:quality-harness'], timeoutMs: 2 * 60_000 },
31
32
  { label: 'core regression', command: 'bun', args: ['run', 'test:core'], timeoutMs: 20 * 60_000 },
32
33
  { label: 'runtime smoke', command: 'bun', args: ['run', 'check:smoke'], timeoutMs: 10 * 60_000 },
33
34
  ];
@@ -49,7 +49,6 @@ const handle = await startLocalBridgeServer({
49
49
  defaultRepoId,
50
50
  host,
51
51
  port,
52
- openBrowser: false,
53
52
  allowLanMobileIntents: true,
54
53
  mode: 'standalone',
55
54
  });
@@ -0,0 +1,94 @@
1
+ import { strict as assert } from 'node:assert';
2
+ import { mkdtempSync, rmSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import {
6
+ FORGE_RECOVERY_DAEMON_LABEL,
7
+ FORGE_RECOVERY_GATEWAY_LABEL,
8
+ forgeConnectorPersistentServiceLabel,
9
+ forgeRuntimePersistentServiceLabel,
10
+ } from '../src/runtime/platform/service-inventory';
11
+ import {
12
+ classifyRecoveryMcpRequest,
13
+ recoveryRuntimeRoleFromExecutable,
14
+ } from '../src/runtime/standalone-recovery/entry';
15
+ import { recentMcpTransportEvidence } from '../adapters/mcp/transports/http-observation';
16
+ import { recordMcpTransportEvent, readRecentMcpTransportEvents } from '../src/runtime/diagnostics/mcp-timing';
17
+
18
+ const controllerHome = mkdtempSync(join(tmpdir(), 'forge-control-plane-failure-domain-'));
19
+ try {
20
+ // Main Runtime/MCP and Recovery must have distinct service identities. A
21
+ // restart or crash fence for one must not name the other lifecycle owner.
22
+ const runtimeLabel = forgeRuntimePersistentServiceLabel(controllerHome);
23
+ const connectorLabel = forgeConnectorPersistentServiceLabel(controllerHome);
24
+ assert.notEqual(runtimeLabel, FORGE_RECOVERY_DAEMON_LABEL);
25
+ assert.notEqual(runtimeLabel, FORGE_RECOVERY_GATEWAY_LABEL);
26
+ assert.notEqual(connectorLabel, FORGE_RECOVERY_DAEMON_LABEL);
27
+ assert.notEqual(connectorLabel, FORGE_RECOVERY_GATEWAY_LABEL);
28
+ assert.notEqual(FORGE_RECOVERY_DAEMON_LABEL, FORGE_RECOVERY_GATEWAY_LABEL);
29
+ assert.equal(recoveryRuntimeRoleFromExecutable('/tmp/forge-recovery-gateway'), 'gateway');
30
+ assert.equal(recoveryRuntimeRoleFromExecutable('/tmp/forge-recovery-watchdog'), 'watchdog');
31
+
32
+ // Recovery owns its own MCP route. Main MCP being unavailable must not turn a
33
+ // valid Recovery request into a route-level 404; authorization is evaluated
34
+ // by the Recovery gateway itself.
35
+ assert.equal(classifyRecoveryMcpRequest({
36
+ method: 'POST',
37
+ url: '/recovery/mcp',
38
+ headers: { authorization: 'Bearer recovery-token' },
39
+ } as any, 'recovery-token'), 'mcp');
40
+ assert.equal(classifyRecoveryMcpRequest({
41
+ method: 'POST',
42
+ url: '/recovery/mcp',
43
+ headers: {},
44
+ } as any, 'recovery-token'), 'auth_required');
45
+ assert.equal(classifyRecoveryMcpRequest({
46
+ method: 'POST',
47
+ url: '/main/mcp',
48
+ headers: { authorization: 'Bearer recovery-token' },
49
+ } as any, 'recovery-token'), 'not_mcp');
50
+
51
+ // Current health and recent incident evidence are separate dimensions. A
52
+ // successful reconnect does not erase the interruption that immediately
53
+ // preceded it, and a later health probe may still truthfully be green.
54
+ const interruptedAt = '2026-09-22T12:00:00.000Z';
55
+ const recoveredAt = '2026-09-22T12:00:05.000Z';
56
+ recordMcpTransportEvent(controllerHome, {
57
+ kind: 'interruption',
58
+ sessionId: 'mcp-before-outage',
59
+ connectionId: 'connection-before-outage',
60
+ route: '/mcp',
61
+ principalId: 'chatgpt-controller',
62
+ reason: 'transport_close',
63
+ at: interruptedAt,
64
+ });
65
+ recordMcpTransportEvent(controllerHome, {
66
+ kind: 'session_initialized',
67
+ sessionId: 'mcp-after-outage',
68
+ connectionId: 'connection-after-outage',
69
+ route: '/mcp',
70
+ principalId: 'chatgpt-controller',
71
+ at: recoveredAt,
72
+ });
73
+ const evidence = recentMcpTransportEvidence(
74
+ readRecentMcpTransportEvents(controllerHome),
75
+ '2026-09-22T11:00:00.000Z',
76
+ Date.parse('2026-09-22T12:01:00.000Z'),
77
+ );
78
+ assert.equal(evidence.current, 'healthy');
79
+ assert.equal(evidence.recentStatus, 'recovered');
80
+ assert.equal(evidence.lastInterruption?.at, interruptedAt);
81
+ assert.equal(evidence.lastRecoveryAt, recoveredAt);
82
+
83
+ console.log(JSON.stringify({
84
+ status: 'ok',
85
+ mainRuntimeLabel: runtimeLabel,
86
+ mainConnectorLabel: connectorLabel,
87
+ recoveryDaemonLabel: FORGE_RECOVERY_DAEMON_LABEL,
88
+ recoveryGatewayLabel: FORGE_RECOVERY_GATEWAY_LABEL,
89
+ recoveryRouteIndependent: true,
90
+ health: evidence,
91
+ }, null, 2));
92
+ } finally {
93
+ rmSync(controllerHome, { recursive: true, force: true });
94
+ }
@@ -1,6 +1,7 @@
1
- import { existsSync } from 'fs';
1
+ import { existsSync, readFileSync } from 'fs';
2
+ import { createHash } from 'crypto';
2
3
  import { spawnSync } from 'child_process';
3
- import { executeIosPluginAction } from '../src/runtime/plugins/ios-adapter';
4
+ import { computerPluginAdapter } from '../src/runtime/plugins/computer-registration';
4
5
  import { resolveRepoPreferredControllerHome } from '../src/cli/repositories/controller-home';
5
6
 
6
7
  const repoRoot = process.cwd();
@@ -29,12 +30,12 @@ const common = {
29
30
  controllerHome,
30
31
  repoId,
31
32
  repoRoot,
32
- pluginId: 'ios',
33
+ pluginId: 'computer',
33
34
  origin: { surface: 'local-ui' as const, actor: 'physical-ios-live-smoke' },
34
35
  };
35
36
 
36
37
  async function invoke(actionId: string, args: Record<string, unknown>) {
37
- return executeIosPluginAction({
38
+ return computerPluginAdapter.executeAction({
38
39
  ...common,
39
40
  actionId,
40
41
  args,
@@ -43,6 +44,7 @@ async function invoke(actionId: string, args: Record<string, unknown>) {
43
44
  }
44
45
 
45
46
  let interactionId: string | undefined;
47
+ let reusedSession = false;
46
48
  try {
47
49
  const listed = await invoke('physical_device_list', {});
48
50
  const devices = Array.isArray(listed.devices) ? listed.devices as Array<Record<string, unknown>> : [];
@@ -50,6 +52,9 @@ try {
50
52
  entry.identifier === deviceSelector || entry.udid === deviceSelector || entry.name === deviceSelector);
51
53
  if (matches.length !== 1) throw new Error(`Expected exactly one physical iPhone for selector ${deviceSelector}; found ${matches.length}.`);
52
54
  const device = matches[0]!;
55
+ if (device.connected !== true || device.screenshotAvailable !== true) {
56
+ throw new Error(`The selected iPhone ${deviceSelector} has no connected CoreDevice screenshot transport. No app inspection or activation was attempted.`);
57
+ }
53
58
  const info = await invoke('physical_device_info', { device: device.identifier });
54
59
  const apps = await invoke('physical_device_apps', { device: device.identifier, bundle_id: bundleId });
55
60
  const installed = Array.isArray(apps.apps) ? apps.apps as Array<Record<string, unknown>> : [];
@@ -58,11 +63,15 @@ try {
58
63
  const opened = await invoke('physical_device_open', {
59
64
  device: device.identifier,
60
65
  bundle_id: bundleId,
61
- relaunch: true,
66
+ relaunch: false,
67
+ observe_after_open: true,
68
+ // This is a one-shot open/capture receipt; do not retain a HID worker.
69
+ prewarm_input: false,
62
70
  });
63
71
  const interaction = opened.interaction as Record<string, unknown> | undefined;
64
72
  interactionId = typeof interaction?.interactionId === 'string' ? interaction.interactionId : undefined;
65
73
  if (!interactionId) throw new Error('The physical provider did not return an interaction id.');
74
+ reusedSession = opened.reusedSession === true;
66
75
 
67
76
  const screenshot = await invoke('physical_device_screenshot', {
68
77
  interaction_id: interactionId,
@@ -71,17 +80,29 @@ try {
71
80
  const artifacts = Array.isArray(screenshot.artifactCandidates)
72
81
  ? screenshot.artifactCandidates as Array<Record<string, unknown>>
73
82
  : [];
74
- const path = typeof artifacts[0]?.path === 'string' ? artifacts[0].path : '';
83
+ const artifact = artifacts[0];
84
+ const path = typeof artifact?.path === 'string' ? artifact.path : '';
75
85
  if (!path || !existsSync(path)) throw new Error('The physical provider did not create a screenshot artifact.');
86
+ // Bind the local evidence to this exact CoreDevice observation without
87
+ // claiming what App, SKU or checkout price is actually visible.
88
+ const observation = screenshot.observation as Record<string, unknown> | undefined;
89
+ const image = readFileSync(path);
90
+ const screenshotSha256 = createHash('sha256').update(image).digest('hex');
91
+ const observationId = typeof observation?.observationId === 'string' ? observation.observationId : undefined;
92
+ if (!observationId || artifact?.sha256 !== screenshotSha256 || artifact?.bytes !== image.length
93
+ || observation?.screenshotSha256 !== screenshotSha256 || observation?.screenshotBytes !== image.length) {
94
+ throw new Error('The screenshot file and CoreDevice observation receipts do not match.');
95
+ }
76
96
  const metadata = spawnSync('sips', ['-g', 'pixelWidth', '-g', 'pixelHeight', '-g', 'format', path], { encoding: 'utf8' }).stdout;
77
97
  const width = metadata.match(/pixelWidth:\s*(\d+)/)?.[1];
78
98
  const height = metadata.match(/pixelHeight:\s*(\d+)/)?.[1];
79
99
  const format = metadata.match(/format:\s*(\S+)/)?.[1];
80
100
 
81
- const closed = await invoke('physical_device_close', { interaction_id: interactionId });
101
+ const closed = reusedSession ? undefined : await invoke('physical_device_close', { interaction_id: interactionId });
82
102
  interactionId = undefined;
83
103
  const app = installed[0]!;
84
104
  console.log(JSON.stringify({
105
+ verificationLevel: 'source_computer_adapter_open_and_capture_only',
85
106
  device: {
86
107
  name: device.name,
87
108
  model: device.model,
@@ -97,20 +118,27 @@ try {
97
118
  version: app.version,
98
119
  },
99
120
  launchStatus: interaction?.status,
121
+ reusedSession,
100
122
  controlPlane: opened.controlPlane,
101
123
  coreDeviceCapabilities: info.capabilities,
102
124
  screenViewingURLAvailable: typeof info.screenViewingURL === 'string',
103
125
  screenshot: {
104
126
  created: true,
127
+ path,
128
+ sha256: screenshotSha256,
129
+ bytes: image.length,
130
+ observationId,
131
+ observedAt: observation?.observedAt,
132
+ semanticPriceVerified: false,
105
133
  width: width ? Number(width) : undefined,
106
134
  height: height ? Number(height) : undefined,
107
135
  format,
108
136
  },
109
- closeStatus: (closed.interaction as Record<string, unknown> | undefined)?.status,
110
- deviceUnmodified: closed.deviceUnmodified === true,
137
+ closeStatus: (closed?.interaction as Record<string, unknown> | undefined)?.status,
138
+ deviceUnmodified: closed?.deviceUnmodified === true,
111
139
  }, null, 2));
112
140
  } finally {
113
- if (interactionId) {
141
+ if (interactionId && !reusedSession) {
114
142
  try { await invoke('physical_device_close', { interaction_id: interactionId }); } catch {}
115
143
  }
116
144
  }