@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
@@ -10,7 +10,7 @@ import {
10
10
  previewAutomaticRuntimeMaintenance,
11
11
  type RuntimeMaintenanceActionId,
12
12
  } from '../../recovery/maintenance-executor';
13
- import { appendWorkEvidence, getWorkContract, isTerminalWorkContractStatus } from '../../../../packages/kernel/work/api/index';
13
+ import { appendWorkEvidence, getWorkContract, semanticWorkState } from '../../../../packages/kernel/work/api/index';
14
14
  import {
15
15
  controllerSessionBlocksRecovery,
16
16
  getControllerSession,
@@ -27,16 +27,16 @@ import {
27
27
  getSchedule,
28
28
  listActiveOccurrences,
29
29
  listOccurrences,
30
- recordScheduleOccurrenceHandoff,
31
- resumeScheduledControllerContinuation,
30
+ reclaimStaleCreatedOccurrences,
32
31
  listSchedules,
33
32
  saveOccurrence,
34
33
  saveScheduleDecision,
35
34
  updateSchedule,
36
35
  } from '../../../../packages/kernel/scheduler/api/index';
37
36
  export { cronDue };
38
- import { ensureScheduledControllerBinding, controllerHostForScheduledBinding } from '../../root/scheduled-controller-composition';
39
- import { listHandoffItems } from '../../control-plane/facade/handoff-inbox-store';
37
+ import { ensureScheduledControllerBinding } from '../../root/scheduled-controller-composition';
38
+ import { reconcileControllerProgression } from '../../root/controller-progression-composition';
39
+ import { listUserRequests } from '../../../../packages/kernel/identity/api/index';
40
40
  import { runStandaloneChatgptPrompt } from '../../control-plane/launcher/chatgpt-work-continuation';
41
41
 
42
42
  import { classifyScheduledBrowserObservation, executeScheduledBrowserProbe } from './browser-probe';
@@ -51,6 +51,7 @@ import type {
51
51
  const execFileAsync = promisify(execFile);
52
52
  const LIVE_MAINTENANCE_OPERATION = 'runtime_maintenance_apply';
53
53
  const EXTERNAL_CONTROLLER_WAKE_OPERATION = 'external_controller_wake';
54
+ const CONTROLLER_PROGRESSION_OPERATION = 'controller_progression';
54
55
  const BROWSER_PROBE_OPERATION = 'browser_probe';
55
56
  const GITHUB_ISSUE_WATCH_OPERATION = 'github_issue_watch';
56
57
  const DEFAULT_EXTERNAL_CONTROLLER_WAKE_TIMEOUT_MS = 60_000;
@@ -60,6 +61,7 @@ function isDeterministicSchedule(schedule: RepositorySchedule): boolean {
60
61
  // Kernel executes only typed, bounded dispatch operations.
61
62
  return schedule.action.operation === LIVE_MAINTENANCE_OPERATION
62
63
  || schedule.action.operation === EXTERNAL_CONTROLLER_WAKE_OPERATION
64
+ || schedule.action.operation === CONTROLLER_PROGRESSION_OPERATION
63
65
  || schedule.action.operation === BROWSER_PROBE_OPERATION
64
66
  || schedule.action.operation === GITHUB_ISSUE_WATCH_OPERATION;
65
67
  }
@@ -87,35 +89,24 @@ async function workspaceDirty(controllerHome: string, repoId: string): Promise<b
87
89
 
88
90
  function workBoundScheduleWorkId(schedule: RepositorySchedule): string | undefined {
89
91
  if (schedule.action.operation !== EXTERNAL_CONTROLLER_WAKE_OPERATION
92
+ && schedule.action.operation !== CONTROLLER_PROGRESSION_OPERATION
90
93
  && schedule.action.operation !== BROWSER_PROBE_OPERATION) return undefined;
91
94
  const value = schedule.action.arguments?.work_id;
92
95
  return typeof value === 'string' && value.trim() ? value.trim() : undefined;
93
96
  }
94
97
 
95
- const HUMAN_ONLY_HANDOFF_REASONS = new Set([
96
- 'policy_approval_required',
97
- 'missing_authorization',
98
- 'invalid_objective',
99
- 'destructive_action_requires_confirmation',
100
- ]);
101
-
102
- function handoffRequiresHumanReview(item: ReturnType<typeof listHandoffItems>[number]): boolean {
103
- if (item.approvalAction) return true;
104
- if (!item.creationReason) return true;
105
- return HUMAN_ONLY_HANDOFF_REASONS.has(item.creationReason);
106
- }
107
-
108
98
  async function stopReason(controllerHome: string, schedule: RepositorySchedule): Promise<string | undefined> {
109
99
  const projection = readRepositoryProjection(controllerHome, schedule.repoId);
110
100
  const workId = workBoundScheduleWorkId(schedule);
111
101
  const work = workId ? getWorkContract({ controllerHome, repoId: schedule.repoId }, workId) : undefined;
112
102
  if (schedule.stopConditions.includes('human_review_required')) {
103
+ const pendingUserRequests = listUserRequests(controllerHome, 'pending');
113
104
  if (workId) {
114
- const activeHandoff = listHandoffItems({ controllerHome, repoId: schedule.repoId, status: 'active', limit: 100 })
115
- .find((item) => item.workId === workId && handoffRequiresHumanReview(item));
116
- if (activeHandoff) return `Work ${workId} has active Handoff ${activeHandoff.id} requiring human review.`;
117
- } else if (projection.currentAttention.length > 0) {
118
- return 'Repository has jobs requiring human attention.';
105
+ const request = pendingUserRequests.find((item) => item.targetScope?.workId === workId);
106
+ if (request) return `Work ${workId} has pending UserRequest ${request.requestId} requiring human action.`;
107
+ } else {
108
+ const request = pendingUserRequests.find((item) => item.targetScope?.repoId === schedule.repoId);
109
+ if (request) return `Repository ${schedule.repoId} has pending UserRequest ${request.requestId}.`;
119
110
  }
120
111
  }
121
112
  if (schedule.stopConditions.includes('release_ready') && projection.releaseFrozen) return 'Repository is in release freeze.';
@@ -258,7 +249,7 @@ export function classifyChatgptWakeFailure(reason: string): ChatgptWakeFailureCl
258
249
  return 'ordinary_failure';
259
250
  }
260
251
 
261
- async function executeExternalControllerWake(
252
+ async function executeControllerProgression(
262
253
  controllerHome: string,
263
254
  schedule: RepositorySchedule,
264
255
  occurrence: ScheduleOccurrence,
@@ -277,9 +268,9 @@ async function executeExternalControllerWake(
277
268
  updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ enabled: false, pausedReason: `Work ${workId} no longer exists.`, lastTriggeredAt: timestamp, lastOccurrenceId: occurrence.occurrenceId }));
278
269
  return decideOccurrence(controllerHome, schedule, occurrence, 'operation_blocked', 'skipped', `EXTERNAL_CONTROLLER_WAKE_WORK_NOT_FOUND:${workId}`);
279
270
  }
280
- if (isTerminalWorkContractStatus(work.status)) {
281
- updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ enabled: false, pausedReason: `Work ${workId} is terminal (${work.status}).`, lastTriggeredAt: timestamp, lastOccurrenceId: occurrence.occurrenceId }));
282
- return decideOccurrence(controllerHome, schedule, occurrence, 'nothing_to_do', 'skipped', `Work ${workId} is terminal (${work.status}); automatic continuation stopped.`);
271
+ if (semanticWorkState(work) !== 'open') {
272
+ updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ enabled: false, pausedReason: `Work ${workId} is terminal (${work.semanticState}).`, lastTriggeredAt: timestamp, lastOccurrenceId: occurrence.occurrenceId }));
273
+ return decideOccurrence(controllerHome, schedule, occurrence, 'nothing_to_do', 'skipped', `Work ${workId} is terminal (${work.semanticState}); automatic continuation stopped.`);
283
274
  }
284
275
 
285
276
  const retainedSession = getRetainedControllerSession(workStore, workId);
@@ -323,12 +314,20 @@ async function executeExternalControllerWake(
323
314
  );
324
315
  }
325
316
 
317
+ if (schedule.action.operation === CONTROLLER_PROGRESSION_OPERATION
318
+ && (typeof args.controller_binding_id !== 'string' || !args.controller_binding_id.trim())) {
319
+ throw new Error(`SCHEDULE_CONTROLLER_PROGRESSION_BINDING_REQUIRED:${workId}`);
320
+ }
321
+
326
322
  const hadLegacySessionIdentity = typeof args.controller_session_id === 'string' && args.controller_session_id.trim().length > 0;
327
323
 
328
324
  // Explicit compatibility migration for schedules written before Kernel V2 B4.
329
325
  // Provider metadata is copied once into the adapter-owned binding and the
330
326
  // Schedule is rewritten to exact Work/ControllerSession/ControllerBinding ids.
331
327
  if (!bindingRecord) {
328
+ if (schedule.action.operation === CONTROLLER_PROGRESSION_OPERATION) {
329
+ throw new Error(`SCHEDULE_CONTROLLER_PROGRESSION_BINDING_NOT_FOUND:${workId}`);
330
+ }
332
331
  const binding = ensureScheduledControllerBinding(
333
332
  { controllerHome, repoId: schedule.repoId },
334
333
  { workId, session: retainedSession, scheduleName: schedule.name, args },
@@ -369,6 +368,10 @@ async function executeExternalControllerWake(
369
368
  const relayScopeId = typeof schedule.action.arguments?.relay_scope_id === 'string'
370
369
  ? schedule.action.arguments.relay_scope_id
371
370
  : undefined;
371
+ const controllerRoundOccurrenceId = typeof occurrence.triggerContext?.data?.controllerRoundOccurrenceId === 'string'
372
+ && occurrence.triggerContext.data.controllerRoundOccurrenceId.trim()
373
+ ? occurrence.triggerContext.data.controllerRoundOccurrenceId.trim()
374
+ : occurrence.occurrenceId;
372
375
  const wakeDecision = decideOccurrence(
373
376
  controllerHome,
374
377
  schedule,
@@ -387,23 +390,40 @@ async function executeExternalControllerWake(
387
390
  );
388
391
 
389
392
  try {
390
- const host = controllerHostForScheduledBinding(
393
+ const progression = await reconcileControllerProgression(
391
394
  { controllerHome, repoId: schedule.repoId, repoRoot: repository.canonicalRoot },
392
- bindingRecord.binding,
393
- );
394
- const resumed = await resumeScheduledControllerContinuation(
395
- workStore,
396
395
  {
397
- scheduleId: schedule.scheduleId,
398
- occurrenceId: occurrence.occurrenceId,
396
+ occurrenceId: controllerRoundOccurrenceId,
399
397
  workId,
400
- controllerBindingId: bindingRecord.binding.bindingId,
401
398
  relayScopeId,
402
399
  continuationHint,
400
+ allowSemanticWaitRecovery: controllerType === 'chatgpt',
401
+ scheduleName: schedule.name,
402
+ scheduleId: schedule.scheduleId,
403
+ scheduleOccurrenceId: occurrence.occurrenceId,
404
+ bindingArgs: args,
403
405
  },
404
- host,
405
406
  );
406
- if (resumed.dispatch.status === 'semantic_wait') {
407
+
408
+ if (progression.status === 'terminal_or_missing') {
409
+ updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({
410
+ enabled: false,
411
+ pausedReason: progression.reason,
412
+ lastTriggeredAt: timestamp,
413
+ lastOccurrenceId: occurrence.occurrenceId,
414
+ }));
415
+ return saveOccurrence(controllerHome, {
416
+ ...wakeDecision,
417
+ status: 'skipped',
418
+ decision: 'nothing_to_do',
419
+ reason: progression.reason,
420
+ });
421
+ }
422
+
423
+ if (progression.status === 'semantic_wait'
424
+ || progression.status === 'wait_for_user'
425
+ || progression.status === 'retained_session_missing'
426
+ || progression.status === 'human_controller') {
407
427
  updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({
408
428
  lastTriggeredAt: timestamp,
409
429
  lastOccurrenceId: occurrence.occurrenceId,
@@ -412,37 +432,70 @@ async function executeExternalControllerWake(
412
432
  ...wakeDecision,
413
433
  status: 'skipped',
414
434
  decision: 'nothing_to_do',
415
- reason: resumed.dispatch.reason ?? `Work ${workId} remains in unchanged semantic wait; provider dispatch suppressed.`,
435
+ reason: progression.reason ?? `Work ${workId} is not currently eligible for provider progression.`,
416
436
  });
417
437
  }
418
- if (resumed.dispatch.status === 'rejected') {
419
- throw new Error(resumed.dispatch.reason ?? 'CONTROLLER_HOST_RESUME_REJECTED');
420
438
 
439
+ if (progression.status === 'rejected') {
440
+ throw new Error(progression.reason ?? 'CONTROLLER_HOST_RESUME_REJECTED');
441
+ }
442
+
443
+ if (progression.status === 'chatgpt_not_enrolled') {
444
+ updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({
445
+ lastTriggeredAt: timestamp,
446
+ lastOccurrenceId: occurrence.occurrenceId,
447
+ }));
448
+ return saveOccurrence(controllerHome, {
449
+ ...wakeDecision,
450
+ status: 'skipped',
451
+ decision: 'nothing_to_do',
452
+ reason: `Workflow Supervisor enrollment is not yet ready (${progression.supervisorEnrollment.status}); no ChatGPT provider attempt was consumed.`,
453
+ });
421
454
  }
455
+
456
+ const supervisorEnrollment = progression.status === 'chatgpt_enrolled'
457
+ ? progression.supervisorEnrollment
458
+ : progression.status === 'scheduled_supervisor_woken'
459
+ ? { status: 'enrolled' as const, taskId: progression.taskId, effectId: progression.effectId }
460
+ : { status: 'not_eligible' as const };
461
+ const supervisorOwnsTurn = progression.status === 'chatgpt_enrolled' || progression.status === 'scheduled_supervisor_woken';
422
462
  updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, (current) => ({
423
463
  lastTriggeredAt: timestamp,
424
464
  lastOccurrenceId: occurrence.occurrenceId,
425
465
  consecutiveFailures: 0,
426
466
  nextEligibleAt: undefined,
427
- ...(current.enabled ? { pausedReason: undefined } : {}),
467
+ ...(supervisorEnrollment.status === 'enrolled'
468
+ && schedule.action.operation !== CONTROLLER_PROGRESSION_OPERATION
469
+ ? { enabled: false, pausedReason: 'workflow_supervisor_owns_outer_turn' }
470
+ : current.enabled ? { pausedReason: undefined } : {}),
428
471
  }));
429
472
  const dispatchedOccurrence = saveOccurrence(controllerHome, {
430
473
  ...wakeDecision,
431
474
  status: 'dispatched',
432
- reason: resumed.reused
433
- ? `Controller continuation occurrence ${occurrence.occurrenceId} was already durably dispatched; external replay suppressed and semantic round closure is still pending.`
434
- : `ControllerHost accepted durable binding ${bindingRecord.binding.bindingId} for Work ${workId}; dispatch ${resumed.dispatch.hostDispatchId ?? resumed.dispatch.relayScopeId}; semantic round closure is still pending.`,
475
+ reason: progression.status === 'chatgpt_enrolled'
476
+ ? `Workflow Supervisor reserved the exact ChatGPT effect ${progression.supervisorEnrollment.effectId ?? progression.relayScopeId}; Scheduler issued no provider send.`
477
+ : progression.status === 'scheduled_supervisor_woken'
478
+ ? `Scheduler occurrence ${occurrence.occurrenceId} woke the same Workflow Supervisor task and reserved effect ${progression.effectId}; Scheduler issued no provider send.`
479
+ : progression.reused
480
+ ? `Controller continuation occurrence ${occurrence.occurrenceId} was already durably dispatched; external replay suppressed and semantic round closure is still pending.`
481
+ : `ControllerHost accepted durable binding ${bindingRecord.binding.bindingId} for Work ${workId}; dispatch ${progression.providerDispatchReceiptId ?? progression.relayScopeId}; semantic round closure is still pending.`,
435
482
  });
436
483
  appendWorkEvidence(workStore, workId, {
437
484
  evidenceId: dispatchedOccurrence.occurrenceId,
438
- title: 'scheduled Controller continuation dispatched',
439
- summary: `Schedule ${schedule.scheduleId} occurrence ${dispatchedOccurrence.occurrenceId} resumed the exact Work-bound ControllerSession through ControllerHost.`,
485
+ title: supervisorOwnsTurn
486
+ ? 'scheduled Workflow Supervisor effect reserved'
487
+ : 'scheduled Controller continuation dispatched',
488
+ summary: progression.status === 'scheduled_supervisor_woken'
489
+ ? `Schedule ${schedule.scheduleId} occurrence ${dispatchedOccurrence.occurrenceId} woke the same Work-bound Supervisor task; Supervisor owns ChatGPT delivery.`
490
+ : progression.status === 'chatgpt_enrolled'
491
+ ? `Schedule ${schedule.scheduleId} materialized the exact ControllerRound occurrence and Supervisor effect; Supervisor owns ChatGPT delivery.`
492
+ : `Schedule ${schedule.scheduleId} occurrence ${dispatchedOccurrence.occurrenceId} resumed the exact Work-bound ControllerSession through ControllerHost.`,
440
493
  detailLevel: 'summary',
441
494
  });
442
495
  return dispatchedOccurrence;
443
496
  } catch (error) {
444
497
  const reason = error instanceof Error ? error.message : String(error);
445
- if (reason.startsWith('SCHEDULE_CONTINUATION_ROUND_ALREADY_OPEN:')) {
498
+ if (reason.startsWith('CONTROLLER_CONTINUATION_ROUND_ALREADY_OPEN:') || reason.startsWith('CONTROLLER_CONTINUATION_ALREADY_DISPATCHING:')) {
446
499
  updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ lastTriggeredAt: timestamp, lastOccurrenceId: occurrence.occurrenceId }));
447
500
  return decideOccurrence(controllerHome, schedule, wakeDecision, 'nothing_to_do', 'skipped', `Work ${workId} already has an open Controller round awaiting claim or disposition.`);
448
501
  }
@@ -473,20 +526,20 @@ async function executeExternalControllerWake(
473
526
  decision: 'execute',
474
527
  reason,
475
528
  ...(failureClass === 'user_action_required' ? { pauseReason: reason } : {}),
476
- handoff: {
477
- title: `External Controller wake ${occurrence.occurrenceId} failed`,
478
- summary: 'Forge recorded the schedule trigger but could not resume the exact configured ControllerSession through ControllerHost.',
479
- reason,
480
- creationReason: 'repeated_infrastructure_failure',
481
- blockingDecision: reason.startsWith('SCHEDULE_CONTINUATION_OUTCOME_UNKNOWN:')
482
- ? 'Inspect the durable ControllerHost dispatch outcome before any retry; automatic replay is fenced.'
483
- : 'Repair the ControllerHost adapter/binding or update the retained ControllerSession.',
484
- recommendedDecision: 'Inspect the exact Scheduler continuation dispatch, ControllerSession, and adapter binding, then retrigger only when the outcome is known.',
485
- recommendedPrompt: `Resume Work ${workId} manually, inspect failed wake occurrence ${occurrence.occurrenceId}, and repair the exact ControllerHost continuation path before unattended continuation resumes.`,
486
- statusSummary: 'Scheduled ControllerHost continuation failed.',
487
- blockedBy: ['external_controller_wake_failed'],
488
- attemptedActions: [`schedule:${schedule.scheduleId}`, `work:${workId}`, `controller:${controllerType}`, `session:${retainedSession.sessionId}`, `binding:${bindingRecord.binding.bindingId}`],
489
- },
529
+ ...(failureClass === 'user_action_required' ? {
530
+ handoff: {
531
+ title: `External Controller wake ${occurrence.occurrenceId} requires user authorization`,
532
+ summary: 'Forge cannot resume the configured ControllerSession until the required user authorization is restored.',
533
+ reason,
534
+ creationReason: 'missing_authorization' as const,
535
+ blockingDecision: 'Restore the required authenticated/authorized controller capability, then retry the same scheduled Work.',
536
+ recommendedDecision: 'Restore authorization only; do not create replacement Work or replay an unknown external effect.',
537
+ recommendedPrompt: `Restore authorization for Work ${workId} and retry scheduled continuation ${occurrence.occurrenceId}.`,
538
+ statusSummary: 'Scheduled Controller continuation is waiting on user authorization.',
539
+ blockedBy: ['controller_authorization_required'],
540
+ attemptedActions: [`schedule:${schedule.scheduleId}`, `work:${workId}`, `controller:${controllerType}`, `session:${retainedSession.sessionId}`, `binding:${bindingRecord.binding.bindingId}`],
541
+ },
542
+ } : {}),
490
543
  });
491
544
  updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ lastTriggeredAt: timestamp, lastOccurrenceId: occurrence.occurrenceId }));
492
545
  return failed.occurrence ?? saveOccurrence(controllerHome, { ...wakeDecision, status: 'failed', reason });
@@ -541,39 +594,25 @@ export async function evaluateSchedule(
541
594
  updatedAt: timestamp,
542
595
  });
543
596
 
544
- // Semantic / model-backed schedules only record a trigger + Handoff.
545
- // Deterministic allowlisted operations continue into the local engine path.
597
+ // Semantic/model-owned schedule actions record the trigger only. A trigger is
598
+ // continuation input for the external Controller/Supervisor, not a human
599
+ // blocker and therefore must not manufacture Handoff/UserRequest state.
546
600
  if (!isDeterministicSchedule(schedule)) {
547
- const externalControllerHandoff = recordScheduleOccurrenceHandoff(
601
+ const recorded = decideOccurrence(
548
602
  controllerHome,
549
603
  schedule,
550
- decideOccurrence(
551
- controllerHome,
552
- schedule,
553
- occurrence,
554
- 'operation_blocked',
555
- 'skipped',
556
- 'Schedule execution is external-controller-owned; no ExecutionJob was created.',
557
- occurrenceDecisionEvidence({ operation: schedule.action.operation, trigger: occurrence.triggerContext?.source }),
558
- ),
559
- {
560
- title: `Schedule ${schedule.name} requires an external Controller`,
561
- summary: 'The scheduled trigger was recorded without dispatching a Kernel Job.',
562
- reason: 'Schedule execution is external-controller-owned.',
563
- creationReason: 'ambiguous_outcome',
564
- blockingDecision: 'Claim or create the related Work before executing the scheduled operation.',
565
- recommendedDecision: 'Review the trigger evidence and continue it through an explicitly claimed external Controller session.',
566
- recommendedPrompt: `Review schedule ${schedule.scheduleId} occurrence ${occurrence.occurrenceId}; create or claim Work for ${schedule.action.operation} and continue through Process Runtime or Thin Launcher.`,
567
- statusSummary: 'Schedule trigger is waiting for external Controller ownership.',
568
- blockedBy: ['external_controller_required'],
569
- attemptedActions: [`operation:${schedule.action.operation}`],
570
- },
604
+ occurrence,
605
+ 'operation_blocked',
606
+ 'skipped',
607
+ 'Schedule trigger recorded for external Controller continuation; no Kernel ExecutionJob or human Handoff was created.',
608
+ occurrenceDecisionEvidence({ operation: schedule.action.operation, trigger: occurrence.triggerContext?.source }),
571
609
  );
572
610
  updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ lastTriggeredAt: timestamp, lastOccurrenceId: occurrenceId }));
573
- return externalControllerHandoff;
611
+ return recorded;
574
612
  }
575
613
 
576
614
  const recent = listOccurrences(controllerHome, schedule.repoId, schedule.scheduleId, 1000);
615
+ reclaimStaleCreatedOccurrences(controllerHome, schedule.repoId, schedule.scheduleId);
577
616
  const active = listActiveOccurrences(controllerHome, schedule.repoId, schedule.scheduleId)
578
617
  .filter((entry) => entry.occurrenceId !== occurrence.occurrenceId);
579
618
  const admission = evaluateScheduleOccurrenceAdmission(schedule, {
@@ -593,18 +632,7 @@ export async function evaluateSchedule(
593
632
  reason: stop,
594
633
  countFailure: false,
595
634
  pauseReason: stop,
596
- handoff: {
597
- title: `Scheduled maintenance occurrence ${occurrence.occurrenceId} stopped`,
598
- summary: 'A live maintenance occurrence was blocked by an explicit schedule stop condition and requires review before automation resumes.',
599
- reason: stop,
600
- creationReason: 'ambiguous_outcome',
601
- blockingDecision: 'Review the stop condition and decide whether automatic maintenance should stay paused.',
602
- recommendedDecision: 'Resolve the stop condition, then explicitly re-enable or retrigger the maintenance schedule.',
603
- recommendedPrompt: `Review maintenance schedule ${schedule.scheduleId} for repo ${schedule.repoId}, inspect stop condition ${stop}, and decide whether to resume the schedule.`,
604
- statusSummary: 'Scheduled maintenance occurrence stopped before dispatch.',
605
- blockedBy: ['schedule_stop_condition'],
606
- attemptedActions: [`schedule:${schedule.scheduleId}`, `operation:${schedule.action.operation}`],
607
- },
635
+
608
636
  });
609
637
  return failed.occurrence ?? stopped;
610
638
  }
@@ -641,22 +669,20 @@ export async function evaluateSchedule(
641
669
  reason: preview.blockedReason ?? 'Automatic maintenance preview blocked the occurrence.',
642
670
  countFailure: !preview.blockedPermanently,
643
671
  pauseReason: preview.blockedPermanently ? preview.blockedReason : undefined,
644
- handoff: {
645
- title: `Scheduled maintenance occurrence ${occurrence.occurrenceId} blocked`,
646
- summary: 'A bounded live maintenance occurrence was blocked before dispatch and requires a human decision.',
647
- reason: preview.blockedReason ?? 'Automatic maintenance preview blocked the occurrence.',
648
- creationReason: preview.blockedPermanently ? 'missing_authorization' : 'ambiguous_outcome',
649
- blockingDecision: preview.blockedPermanently
650
- ? 'Fix the schedule operation or authorization before automatic maintenance can resume.'
651
- : 'Inspect runtime maintenance readiness before allowing another unattended attempt.',
652
- recommendedDecision: preview.blockedPermanently
653
- ? 'Correct the automatic maintenance configuration and re-enable the schedule deliberately.'
654
- : 'Review the maintenance preview, resolve the blocker, and then retrigger the schedule intentionally.',
655
- recommendedPrompt: `Review blocked maintenance occurrence ${occurrence.occurrenceId} for schedule ${schedule.scheduleId}. Determine whether the schedule configuration or runtime maintenance readiness should be corrected before retrying.`,
656
- statusSummary: 'Scheduled maintenance occurrence blocked before dispatch.',
657
- blockedBy: [decision],
658
- attemptedActions: [`schedule:${schedule.scheduleId}`, `operation:${schedule.action.operation}`],
659
- },
672
+ ...(preview.blockedPermanently ? {
673
+ handoff: {
674
+ title: `Scheduled maintenance occurrence ${occurrence.occurrenceId} needs a user decision`,
675
+ summary: 'Automatic maintenance is permanently blocked and requires an explicit user decision before the schedule can resume.',
676
+ reason: preview.blockedReason ?? 'Automatic maintenance preview blocked the occurrence.',
677
+ creationReason: 'ambiguous_outcome' as const,
678
+ blockingDecision: 'Correct the configuration/authorization or intentionally keep this schedule paused.',
679
+ recommendedDecision: 'Review the permanent blocker and explicitly decide whether to repair configuration and resume.',
680
+ recommendedPrompt: `Review permanently blocked maintenance occurrence ${occurrence.occurrenceId} for schedule ${schedule.scheduleId} and decide whether to repair and resume it.`,
681
+ statusSummary: 'Scheduled maintenance is permanently blocked pending a user decision.',
682
+ blockedBy: [decision],
683
+ attemptedActions: [`schedule:${schedule.scheduleId}`, `operation:${schedule.action.operation}`],
684
+ },
685
+ } : {}),
660
686
  });
661
687
  return failed.occurrence ?? blocked;
662
688
  }
@@ -693,22 +719,20 @@ export async function evaluateSchedule(
693
719
  reason: preview.blockedReason ?? 'Automatic maintenance preview blocked the occurrence.',
694
720
  countFailure: !preview.blockedPermanently,
695
721
  pauseReason: preview.blockedPermanently ? preview.blockedReason : undefined,
696
- handoff: {
697
- title: `Scheduled maintenance occurrence ${occurrence.occurrenceId} blocked`,
698
- summary: 'A bounded live maintenance occurrence was blocked before dispatch and requires a human decision.',
699
- reason: preview.blockedReason ?? 'Automatic maintenance preview blocked the occurrence.',
700
- creationReason: preview.blockedPermanently ? 'missing_authorization' : 'ambiguous_outcome',
701
- blockingDecision: preview.blockedPermanently
702
- ? 'Fix the schedule operation or authorization before automatic maintenance can resume.'
703
- : 'Inspect runtime maintenance readiness before allowing another unattended attempt.',
704
- recommendedDecision: preview.blockedPermanently
705
- ? 'Correct the automatic maintenance configuration and re-enable the schedule deliberately.'
706
- : 'Review the maintenance preview, resolve the blocker, and then retrigger the schedule intentionally.',
707
- recommendedPrompt: `Review blocked maintenance occurrence ${occurrence.occurrenceId} for schedule ${schedule.scheduleId}. Determine whether the schedule configuration or runtime maintenance readiness should be corrected before retrying.`,
708
- statusSummary: 'Scheduled maintenance occurrence blocked before dispatch.',
709
- blockedBy: [decision],
710
- attemptedActions: [`schedule:${schedule.scheduleId}`, `operation:${schedule.action.operation}`],
711
- },
722
+ ...(preview.blockedPermanently ? {
723
+ handoff: {
724
+ title: `Scheduled maintenance occurrence ${occurrence.occurrenceId} needs a user decision`,
725
+ summary: 'Automatic maintenance is permanently blocked and requires an explicit user decision before the schedule can resume.',
726
+ reason: preview.blockedReason ?? 'Automatic maintenance preview blocked the occurrence.',
727
+ creationReason: 'ambiguous_outcome' as const,
728
+ blockingDecision: 'Correct the configuration/authorization or intentionally keep this schedule paused.',
729
+ recommendedDecision: 'Review the permanent blocker and explicitly decide whether to repair configuration and resume.',
730
+ recommendedPrompt: `Review permanently blocked maintenance occurrence ${occurrence.occurrenceId} for schedule ${schedule.scheduleId} and decide whether to repair and resume it.`,
731
+ statusSummary: 'Scheduled maintenance is permanently blocked pending a user decision.',
732
+ blockedBy: [decision],
733
+ attemptedActions: [`schedule:${schedule.scheduleId}`, `operation:${schedule.action.operation}`],
734
+ },
735
+ } : {}),
712
736
  });
713
737
  return failed.occurrence ?? blocked;
714
738
  }
@@ -721,8 +745,9 @@ export async function evaluateSchedule(
721
745
  }
722
746
 
723
747
  const args = schedule.action.arguments ?? {};
724
- if (schedule.action.operation === EXTERNAL_CONTROLLER_WAKE_OPERATION) {
725
- return executeExternalControllerWake(controllerHome, schedule, occurrence, timestamp, args);
748
+ if (schedule.action.operation === EXTERNAL_CONTROLLER_WAKE_OPERATION
749
+ || schedule.action.operation === CONTROLLER_PROGRESSION_OPERATION) {
750
+ return executeControllerProgression(controllerHome, schedule, occurrence, timestamp, args);
726
751
  }
727
752
 
728
753
  if (schedule.action.operation === GITHUB_ISSUE_WATCH_OPERATION) {
@@ -769,7 +794,7 @@ export async function evaluateSchedule(
769
794
  ? `${args.continuation_prompt}\n\nGitHub issue watcher detected: ${issueSummary}`
770
795
  : `GitHub issue watcher detected actionable issue changes: ${issueSummary}. Read current Work/Plan/evidence and process these issues through the bounded repair workflow.`,
771
796
  };
772
- const wake = await executeExternalControllerWake(controllerHome, schedule, occurrence, timestamp, wakeArgs, evidence, { transientWakeFailure: true });
797
+ const wake = await executeControllerProgression(controllerHome, schedule, occurrence, timestamp, wakeArgs, evidence, { transientWakeFailure: true });
773
798
  if (wake.status !== 'failed') persistObservation();
774
799
  return wake;
775
800
  } catch (error) {
@@ -778,18 +803,7 @@ export async function evaluateSchedule(
778
803
  outcome: 'failed',
779
804
  decision: 'execute',
780
805
  reason,
781
- handoff: {
782
- title: `GitHub issue watcher occurrence ${occurrence.occurrenceId} failed`,
783
- summary: 'The local GitHub issue poll failed before Forge could compare issue state.',
784
- reason,
785
- creationReason: 'repeated_infrastructure_failure',
786
- blockingDecision: 'Repair GitHub CLI authentication/connectivity before unattended issue monitoring resumes.',
787
- recommendedDecision: 'Restore gh read access, then retrigger the watcher.',
788
- recommendedPrompt: `Inspect GitHub issue watcher occurrence ${occurrence.occurrenceId} and restore the local read-only gh issue polling path.`,
789
- statusSummary: 'GitHub issue watcher poll failed.',
790
- blockedBy: ['github_issue_watch_failed'],
791
- attemptedActions: [`schedule:${schedule.scheduleId}`, 'gh:api:issues'],
792
- },
806
+
793
807
  });
794
808
  return failed.occurrence ?? occurrence;
795
809
  }
@@ -808,9 +822,9 @@ export async function evaluateSchedule(
808
822
  updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ enabled: false, pausedReason: `Work ${workId} no longer exists.`, lastTriggeredAt: timestamp, lastOccurrenceId: occurrenceId }));
809
823
  return decideOccurrence(controllerHome, schedule, occurrence, 'operation_blocked', 'skipped', `SCHEDULE_BROWSER_PROBE_WORK_NOT_FOUND:${workId}`);
810
824
  }
811
- if (isTerminalWorkContractStatus(work.status)) {
812
- updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ enabled: false, pausedReason: `Work ${workId} is terminal (${work.status}).`, lastTriggeredAt: timestamp, lastOccurrenceId: occurrenceId }));
813
- return decideOccurrence(controllerHome, schedule, occurrence, 'nothing_to_do', 'skipped', `Work ${workId} is terminal (${work.status}); browser watcher stopped before probing.`);
825
+ if (semanticWorkState(work) !== 'open') {
826
+ updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ enabled: false, pausedReason: `Work ${workId} is terminal (${work.semanticState}).`, lastTriggeredAt: timestamp, lastOccurrenceId: occurrenceId }));
827
+ return decideOccurrence(controllerHome, schedule, occurrence, 'nothing_to_do', 'skipped', `Work ${workId} is terminal (${work.semanticState}); browser watcher stopped before probing.`);
814
828
  }
815
829
  }
816
830
 
@@ -844,7 +858,7 @@ export async function evaluateSchedule(
844
858
  : `Scheduled browser watcher ${schedule.scheduleId} detected that authentication is required (${probe.authReason ?? 'login marker'}). Inspect the external dependency and request user login only if it cannot be restored safely.`;
845
859
  if (workId) {
846
860
  const wakeArgs = { ...args, continuation_prompt: authPrompt };
847
- return executeExternalControllerWake(controllerHome, observedSchedule, occurrence, timestamp, wakeArgs, { ...observationEvidence, authReason: probe.authReason });
861
+ return executeControllerProgression(controllerHome, observedSchedule, occurrence, timestamp, wakeArgs, { ...observationEvidence, authReason: probe.authReason });
848
862
  }
849
863
  const controllerType = typeof args.controller_type === 'string' ? args.controller_type.trim() : 'chatgpt';
850
864
  if (controllerType !== 'chatgpt') {
@@ -925,25 +939,14 @@ export async function evaluateSchedule(
925
939
  ? args.continuation_prompt
926
940
  : `Scheduled browser watcher ${schedule.scheduleId} detected a changed external observation. Read the current external state, correlate it with Work ${workId}, and continue only the bounded Work objective.`,
927
941
  };
928
- return executeExternalControllerWake(controllerHome, observedSchedule, occurrence, timestamp, wakeArgs, { ...observationEvidence, observationStatus });
942
+ return executeControllerProgression(controllerHome, observedSchedule, occurrence, timestamp, wakeArgs, { ...observationEvidence, observationStatus });
929
943
  } catch (error) {
930
944
  const reason = error instanceof Error ? error.message : String(error);
931
945
  const failed = applyScheduleFailure(controllerHome, schedule.scheduleId, schedule.repoId, occurrence.occurrenceId, {
932
946
  outcome: 'failed',
933
947
  decision: 'execute',
934
948
  reason,
935
- handoff: {
936
- title: `Browser watcher occurrence ${occurrence.occurrenceId} failed`,
937
- summary: 'A bounded browser probe failed before Forge could compare the external observation.',
938
- reason,
939
- creationReason: 'repeated_infrastructure_failure',
940
- blockingDecision: 'Repair browser/session readiness or update the watcher target before unattended probing resumes.',
941
- recommendedDecision: 'Inspect the browser plugin/session and retrigger the watcher after the target is readable.',
942
- recommendedPrompt: `Inspect browser watcher schedule ${schedule.scheduleId} for Work ${workId}, repair the failed browser probe, then retrigger one bounded occurrence.`,
943
- statusSummary: 'Scheduled browser watcher failed.',
944
- blockedBy: ['browser_probe_failed'],
945
- attemptedActions: [`schedule:${schedule.scheduleId}`, `work:${workId}`, 'operation:browser_probe'],
946
- },
949
+
947
950
  });
948
951
  updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ lastTriggeredAt: timestamp, lastOccurrenceId: occurrenceId }));
949
952
  return failed.occurrence ?? saveOccurrence(controllerHome, { ...occurrence, status: 'failed', decision: 'execute', reason });
@@ -1008,22 +1011,7 @@ export async function evaluateSchedule(
1008
1011
  outcome: 'failed',
1009
1012
  decision: 'execute',
1010
1013
  reason,
1011
- handoff: {
1012
- title: `Scheduled maintenance occurrence ${occurrence.occurrenceId} failed`,
1013
- summary: 'A bounded live maintenance occurrence failed during deterministic apply and requires review before the schedule continues unattended.',
1014
- reason,
1015
- creationReason: 'repeated_infrastructure_failure',
1016
- blockingDecision: 'Review the failed maintenance occurrence and decide whether the schedule should continue automatically.',
1017
- recommendedDecision: 'Inspect the failed occurrence, fix the runtime blocker, then re-enable or retrigger the schedule intentionally.',
1018
- recommendedPrompt: `Review schedule occurrence ${occurrence.occurrenceId} for ${schedule.scheduleId}, inspect the failed runtime maintenance action, and decide whether to resume automatic maintenance.`,
1019
- statusSummary: 'Scheduled maintenance execution failed.',
1020
- blockedBy: ['scheduled_execution_failed'],
1021
- attemptedActions: [
1022
- `schedule:${schedule.scheduleId}`,
1023
- `operation:${schedule.action.operation}`,
1024
- actionIdRaw ? `action:${actionIdRaw}` : 'action:unknown',
1025
- ],
1026
- },
1014
+
1027
1015
  });
1028
1016
  updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({
1029
1017
  lastTriggeredAt: timestamp,
@@ -5,6 +5,7 @@ import { resolveControllerHome } from '../../../cli/repositories/controller-home
5
5
  import { getSchedule, saveSchedule } from '../../../../packages/kernel/scheduler/api/index';
6
6
 
7
7
  const EXTERNAL_CONTROLLER_WAKE_OPERATION = 'external_controller_wake';
8
+ const CONTROLLER_PROGRESSION_OPERATION = 'controller_progression';
8
9
 
9
10
  export interface PendingContinuationActivationMarker {
10
11
  schemaVersion: 1;
@@ -53,8 +54,9 @@ export function queuePendingContinuationActivation(
53
54
  scheduleId: string,
54
55
  ): PendingContinuationActivationMarker {
55
56
  const schedule = getSchedule(controllerHome, repoId, scheduleId);
56
- if (schedule.action.operation !== EXTERNAL_CONTROLLER_WAKE_OPERATION) {
57
- throw new Error('PENDING_CONTINUATION_ACTIVATION_REQUIRES_EXTERNAL_CONTROLLER_WAKE');
57
+ if (schedule.action.operation !== EXTERNAL_CONTROLLER_WAKE_OPERATION
58
+ && schedule.action.operation !== CONTROLLER_PROGRESSION_OPERATION) {
59
+ throw new Error('PENDING_CONTINUATION_ACTIVATION_REQUIRES_WORK_CONTINUATION');
58
60
  }
59
61
  const workId = schedule.action.arguments?.work_id;
60
62
  if (typeof workId !== 'string' || !workId.trim()) {
@@ -108,7 +110,8 @@ export function applyPendingContinuationActivations(controllerHome: string): Pen
108
110
  const marker = readMarker(path);
109
111
  const schedule = getSchedule(controllerHome, marker.repoId, marker.scheduleId);
110
112
  const workId = schedule.action.arguments?.work_id;
111
- if (schedule.action.operation !== EXTERNAL_CONTROLLER_WAKE_OPERATION || workId !== marker.workId) {
113
+ if ((schedule.action.operation !== EXTERNAL_CONTROLLER_WAKE_OPERATION
114
+ && schedule.action.operation !== CONTROLLER_PROGRESSION_OPERATION) || workId !== marker.workId) {
112
115
  results.push({ ...marker, status: 'failed', reason: 'Schedule no longer targets the queued Work continuation.' });
113
116
  continue;
114
117
  }
@@ -122,7 +125,11 @@ export function applyPendingContinuationActivations(controllerHome: string): Pen
122
125
  results.push({ ...marker, status: 'already_active' });
123
126
  continue;
124
127
  }
125
- saveSchedule(controllerHome, { ...schedule, policy: { ...schedule.policy, shadowMode: false } });
128
+ saveSchedule(controllerHome, {
129
+ ...schedule,
130
+ action: { ...schedule.action, operation: CONTROLLER_PROGRESSION_OPERATION },
131
+ policy: { ...schedule.policy, shadowMode: false },
132
+ });
126
133
  rmSync(path, { force: true });
127
134
  results.push({ ...marker, status: 'activated' });
128
135
  } catch (error) {