@moretea-labs/forge 1.8.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/AGENTS.md +70 -7
  2. package/CHANGELOG.md +14 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/THIRD_PARTY_NOTICES.md +1 -1
  6. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  7. package/adapters/chatgpt/browser-delivery-runtime.ts +529 -56
  8. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  9. package/adapters/chatgpt/controller-round-host.ts +15 -25
  10. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  11. package/adapters/chatgpt/provider-delivery.ts +228 -1
  12. package/adapters/chatgpt/work-conversation-binding-store.ts +79 -53
  13. package/adapters/computer/chatgpt-extension-target.ts +463 -0
  14. package/adapters/computer/chatgpt-target-router.ts +103 -0
  15. package/adapters/computer/chrome-extension/background.js +385 -0
  16. package/adapters/computer/chrome-extension/content.js +378 -0
  17. package/adapters/computer/chrome-extension/core.js +24 -0
  18. package/adapters/computer/chrome-extension/manifest.json +30 -0
  19. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  20. package/adapters/computer/interaction-target-authority.ts +142 -18
  21. package/adapters/mcp/auth.ts +0 -1
  22. package/adapters/mcp/instructions.ts +5 -4
  23. package/adapters/mcp/multi-repository.ts +3 -19
  24. package/adapters/mcp/oauth.ts +73 -0
  25. package/adapters/mcp/paths.ts +4 -1
  26. package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +87 -0
  27. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  28. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  29. package/adapters/mcp/runtime-gateway/context-adapter.ts +411 -73
  30. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -0
  31. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  32. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  33. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  34. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  35. package/adapters/mcp/runtime-gateway/execution-tools.ts +8 -42
  36. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  37. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +117 -45
  38. package/adapters/mcp/runtime-gateway/process-tools.ts +190 -22
  39. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  40. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  41. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  42. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  43. package/adapters/mcp/runtime-gateway/router.ts +18 -504
  44. package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
  45. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +14 -65
  46. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  47. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +113 -173
  48. package/adapters/mcp/runtime-gateway/runtime-tools.ts +15 -5
  49. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +1 -0
  50. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  51. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +358 -266
  52. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
  53. package/adapters/mcp/runtime-gateway/work-adapter.ts +261 -3122
  54. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  55. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  56. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +246 -0
  57. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  58. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  59. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  60. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  61. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  62. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +263 -0
  63. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  64. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
  65. package/adapters/mcp/server.ts +67 -23
  66. package/adapters/mcp/setup.ts +1 -3
  67. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +44 -170
  68. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +4 -9
  69. package/adapters/mcp/tool-mapping/repository-tools.ts +133 -142
  70. package/adapters/mcp/toolset-names.ts +5 -0
  71. package/adapters/mcp/toolset.ts +6 -5
  72. package/adapters/mcp/transports/http-observation.ts +365 -0
  73. package/adapters/mcp/transports/http.ts +154 -677
  74. package/adapters/mcp/transports/oauth-http.ts +322 -0
  75. package/adapters/mcp/transports/session-registry.ts +6 -0
  76. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  77. package/assets/plugin-registry.v1.json +6 -4
  78. package/assets/reference-configs/agentic-development-flow.md +25 -0
  79. package/assets/reference-configs/global-working-rules.md +19 -0
  80. package/assets/skill-version.json +2 -2
  81. package/docs/architecture/CURRENT.md +111 -41
  82. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  83. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  84. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  85. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  86. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  87. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  88. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +221 -0
  89. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  90. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +72 -0
  91. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +237 -0
  92. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  93. package/docs/architecture/domains/verification.md +1 -0
  94. package/docs/architecture/domains/workflow-engine.md +6 -0
  95. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  96. package/docs/forge-plugin-management.md +2 -2
  97. package/docs/operations/controller-performance-and-502.md +17 -0
  98. package/docs/operations/controller-reliability-runbook.md +2 -2
  99. package/docs/operations/features.md +1 -1
  100. package/docs/operations/features.zh-CN.md +1 -1
  101. package/docs/operations/homebrew.md +2 -2
  102. package/docs/operations/mcp-tool-exposure.md +2 -0
  103. package/docs/operations/releasing.md +2 -0
  104. package/docs/operations/standalone-disaster-recovery.md +14 -6
  105. package/docs/wiki/Implementation.md +1 -1
  106. package/package.json +25 -14
  107. package/packages/kernel/cognition/api/index.ts +6 -0
  108. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  109. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  110. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  111. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  112. package/packages/kernel/cognition/domain/learning.ts +106 -0
  113. package/packages/kernel/cognition/domain/memory.ts +254 -0
  114. package/packages/kernel/controller/api/index.ts +1 -0
  115. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  116. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  117. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  118. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  119. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  120. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  121. package/packages/kernel/controller/infrastructure/controller-session-store.ts +297 -71
  122. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  123. package/packages/kernel/identity/api/index.ts +10 -0
  124. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  125. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  126. package/packages/kernel/identity/domain/grant.ts +72 -0
  127. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  128. package/packages/kernel/identity/domain/user-request.ts +93 -0
  129. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +77 -0
  130. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  131. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  132. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  133. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  134. package/packages/kernel/scheduler/api/index.ts +0 -2
  135. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  136. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  137. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  138. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +153 -133
  139. package/packages/kernel/work/api/index.ts +3 -2
  140. package/packages/kernel/work/application/work-service.ts +17 -42
  141. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  142. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  143. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  144. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  145. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  146. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  147. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  148. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  149. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  150. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  151. package/packages/kernel/work/domain/state-machine.ts +25 -63
  152. package/packages/kernel/work/domain/types.ts +57 -51
  153. package/packages/kernel/work/infrastructure/work-contract-store.ts +819 -728
  154. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  155. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  156. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  157. package/packages/plugin-runtime/computer/conversation-target.ts +143 -0
  158. package/packages/plugin-runtime/computer/index.ts +2 -0
  159. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  160. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  161. package/packages/protocols/computer/contract.ts +27 -1
  162. package/scripts/activate-source-baseline.ts +7 -9
  163. package/scripts/canary-controller-semantic-wait.ts +12 -24
  164. package/scripts/check-mcp-compatibility.ts +48 -136
  165. package/scripts/check-runtime-architecture.mjs +622 -217
  166. package/scripts/forge-local-recovery-helper.mjs +93 -15
  167. package/scripts/lib/project-init-lib.sh +3 -0
  168. package/scripts/open-source-audit-allowlist.txt +1 -2
  169. package/scripts/run-bounded-command.mjs +5 -0
  170. package/scripts/run-governed-gate.ts +0 -1
  171. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  172. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  173. package/scripts/smoke-mcp-http-runtime.ts +5 -0
  174. package/scripts/smoke-runtime-recovery.ts +12 -43
  175. package/scripts/smoke-schedule-engine.ts +23 -15
  176. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  177. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  178. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +92 -0
  179. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  180. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  181. package/scripts/smoke-workflow-supervisor.ts +103 -0
  182. package/scripts/verify-forge-runtime.sh +2 -1
  183. package/src/cli/agent-jobs/executor-health.ts +11 -34
  184. package/src/cli/agent-jobs/integration.ts +18 -49
  185. package/src/cli/agent-jobs/job-manager.ts +7 -3
  186. package/src/cli/commands/brain-assistant.ts +27 -13
  187. package/src/cli/commands/brain.ts +13 -15
  188. package/src/cli/commands/chatgpt.ts +1 -163
  189. package/src/cli/commands/recovery.ts +135 -121
  190. package/src/cli/commands/runtime.ts +3 -3
  191. package/src/cli/commands/setup-profile.ts +8 -0
  192. package/src/cli/controller/check-runner.ts +13 -2
  193. package/src/cli/controller/completion-backlog.ts +3 -3
  194. package/src/cli/controller/completion-orchestrator.ts +4 -43
  195. package/src/cli/controller/completion-target.ts +3 -72
  196. package/src/cli/controller/context/source-materializer.ts +81 -100
  197. package/src/cli/controller/context-pack.ts +10 -8
  198. package/src/cli/controller/execution-completion.ts +4 -7
  199. package/src/cli/controller/execution-policy.ts +36 -153
  200. package/src/cli/controller/governance.ts +2 -3
  201. package/src/cli/controller/issue-store.ts +4 -99
  202. package/src/cli/controller/launch-agents.ts +59 -18
  203. package/src/cli/controller/operational-plan.ts +24 -51
  204. package/src/cli/controller/runtime-config.ts +5 -1
  205. package/src/cli/controller/stuck-state-migration.ts +2 -3
  206. package/src/cli/controller/systemd-user.ts +39 -1
  207. package/src/cli/editing/edit-session.ts +1 -7
  208. package/src/cli/local-bridge/console-automations.ts +18 -13
  209. package/src/cli/local-bridge/console-view-models.ts +3 -12
  210. package/src/cli/local-bridge/facade-api.ts +64 -191
  211. package/src/cli/local-bridge/server.ts +24 -147
  212. package/src/cli/local-bridge/types.ts +0 -1
  213. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  214. package/src/cli/repositories/command-executor.ts +29 -23
  215. package/src/cli/repositories/command-scope.ts +35 -16
  216. package/src/cli/repositories/controller-home.ts +48 -0
  217. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  218. package/src/cli/repositories/git-command-executor.ts +2 -2
  219. package/src/cli/repositories/registry.ts +77 -11
  220. package/src/cli/repositories/structured-git.ts +62 -2
  221. package/src/cli/repository/session-cache.ts +92 -6
  222. package/src/runtime/context/assistant-context.ts +20 -7
  223. package/src/runtime/context/assistant-work-context.ts +89 -27
  224. package/src/runtime/context/automatic-learning.ts +565 -0
  225. package/src/runtime/context/cognitive-attention.ts +173 -0
  226. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  227. package/src/runtime/context/context-closure.ts +46 -9
  228. package/src/runtime/context/context-pack-process.ts +103 -0
  229. package/src/runtime/context/context-plane.ts +1 -9
  230. package/src/runtime/context/direct-controller-learning.ts +298 -0
  231. package/src/runtime/context/semantic-navigation-contract.ts +9 -0
  232. package/src/runtime/context/semantic-navigation.ts +6 -34
  233. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  234. package/src/runtime/context/typescript-navigation.ts +89 -3
  235. package/src/runtime/control-plane/cleanup-artifact-retention.ts +212 -9
  236. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  237. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  238. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  239. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  240. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  241. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  242. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  243. package/src/runtime/control-plane/execution/validation.ts +6 -8
  244. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  245. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  246. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  247. package/src/runtime/control-plane/execution/work-delivery-service.ts +497 -0
  248. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  249. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  250. package/src/runtime/control-plane/execution/work-handle-authority.ts +188 -109
  251. package/src/runtime/control-plane/execution/work-handle-store.ts +19 -43
  252. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  253. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  254. package/src/runtime/control-plane/execution/work-operation-service.ts +43 -27
  255. package/src/runtime/control-plane/execution/work-preparation-service.ts +126 -266
  256. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  257. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  258. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +173 -186
  259. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -84
  260. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  261. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +5 -1
  262. package/src/runtime/control-plane/facade/capability-registry.ts +362 -37
  263. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  264. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  265. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  266. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  267. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  268. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  269. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  270. package/src/runtime/control-plane/facade/index.ts +0 -1
  271. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  272. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  273. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  274. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  275. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  276. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  277. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  278. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  279. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  280. package/src/runtime/control-plane/facade/types.ts +49 -108
  281. package/src/runtime/control-plane/facade/work-continuation.ts +8 -8
  282. package/src/runtime/control-plane/generated-cache-retention.ts +97 -1
  283. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  284. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  285. package/src/runtime/control-plane/global-scheduler/maintenance.ts +239 -112
  286. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +2 -1
  287. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  288. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  289. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  290. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  291. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  292. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +28 -300
  293. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  294. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  295. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  296. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  297. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  298. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  299. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  300. package/src/runtime/control-plane/release-retention.ts +135 -47
  301. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  302. package/src/runtime/control-plane/runtime-cleanup.ts +290 -21
  303. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  304. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  305. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  306. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  307. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  308. package/src/runtime/evidence/artifact-store.ts +158 -40
  309. package/src/runtime/evidence/evidence-store.ts +112 -8
  310. package/src/runtime/evidence/output-handle-index.ts +225 -0
  311. package/src/runtime/evidence/result-store.ts +158 -44
  312. package/src/runtime/execution/jobs/store.ts +3 -4
  313. package/src/runtime/execution/managed-workspace.ts +57 -0
  314. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  315. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  316. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  317. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  318. package/src/runtime/execution/process-runtime/command-facade.ts +79 -27
  319. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  320. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  321. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  322. package/src/runtime/execution/process-runtime/index.ts +3 -0
  323. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  324. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  325. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  326. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  327. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  328. package/src/runtime/execution/process-runtime/runtime.ts +35 -2
  329. package/src/runtime/execution/process-runtime/store.ts +30 -2
  330. package/src/runtime/execution/process-runtime/types.ts +6 -1
  331. package/src/runtime/execution/workers/executor.ts +2 -6
  332. package/src/runtime/platform/service-inventory.ts +130 -0
  333. package/src/runtime/platform/service-manager.ts +8 -0
  334. package/src/runtime/plugins/action-application.ts +85 -28
  335. package/src/runtime/plugins/app-store-connect-adapter.ts +38 -14
  336. package/src/runtime/plugins/browser-adapter.ts +757 -34
  337. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  338. package/src/runtime/plugins/browser-macos-bridge.ts +321 -29
  339. package/src/runtime/plugins/browser-manifest-surface.ts +45 -11
  340. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  341. package/src/runtime/plugins/browser-registration.ts +16 -0
  342. package/src/runtime/plugins/browser-runtime.ts +14 -1
  343. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  344. package/src/runtime/plugins/browser-session-store.ts +46 -76
  345. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  346. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +219 -0
  347. package/src/runtime/plugins/computer-chatgpt-macos-target.ts +891 -0
  348. package/src/runtime/plugins/computer-registration.ts +222 -11
  349. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  350. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  351. package/src/runtime/plugins/external-adapter.ts +42 -6
  352. package/src/runtime/plugins/external-registration.ts +21 -1
  353. package/src/runtime/plugins/gmail-adapter.ts +23 -2
  354. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  355. package/src/runtime/plugins/google-shared.ts +14 -7
  356. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  357. package/src/runtime/plugins/ios-adapter.ts +1 -1
  358. package/src/runtime/plugins/lightweight-action.ts +208 -2
  359. package/src/runtime/plugins/local-system-adapter.ts +12 -2
  360. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  361. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  362. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  363. package/src/runtime/plugins/store.ts +602 -428
  364. package/src/runtime/plugins/types.ts +20 -0
  365. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  366. package/src/runtime/projections/invalidation.ts +7 -3
  367. package/src/runtime/projections/materialized-view.ts +80 -36
  368. package/src/runtime/recovery/actions.ts +3 -3
  369. package/src/runtime/recovery/capability-action-application.ts +46 -45
  370. package/src/runtime/recovery/lifecycle-inventory.ts +29 -29
  371. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  372. package/src/runtime/recovery/store.ts +29 -11
  373. package/src/runtime/release/release-coordinator.ts +296 -0
  374. package/src/runtime/release/release-session.ts +716 -0
  375. package/src/runtime/release/release-state-migration.ts +25 -0
  376. package/src/runtime/resources/leases/store.ts +56 -25
  377. package/src/runtime/root/computer-composition.ts +191 -6
  378. package/src/runtime/root/controller-progression-composition.ts +192 -0
  379. package/src/runtime/root/controller-round-composition.ts +20 -1
  380. package/src/runtime/root/deployment-topology.ts +106 -0
  381. package/src/runtime/root/entry.ts +4 -3
  382. package/src/runtime/root/known-good-recovery.ts +184 -0
  383. package/src/runtime/root/local-bridge.ts +0 -1
  384. package/src/runtime/root/mcp-transport.ts +111 -18
  385. package/src/runtime/root/ownership.ts +261 -9
  386. package/src/runtime/root/package-connector-service.ts +105 -19
  387. package/src/runtime/root/package-runtime-release.ts +117 -18
  388. package/src/runtime/root/package-runtime-service.ts +17 -11
  389. package/src/runtime/root/release-execution-canary.ts +44 -12
  390. package/src/runtime/root/release-loader.ts +90 -8
  391. package/src/runtime/root/release-manifest.ts +80 -6
  392. package/src/runtime/root/release-materialize.ts +372 -28
  393. package/src/runtime/root/release-store.ts +395 -36
  394. package/src/runtime/root/runtime-lane.ts +191 -0
  395. package/src/runtime/root/runtime.ts +159 -27
  396. package/src/runtime/root/scheduled-controller-composition.ts +28 -3
  397. package/src/runtime/root/service-runner.ts +2 -2
  398. package/src/runtime/root/service.ts +36 -33
  399. package/src/runtime/root/status.ts +48 -0
  400. package/src/runtime/root/types.ts +32 -3
  401. package/src/runtime/root/workflow-supervisor-composition.ts +493 -0
  402. package/src/runtime/root/workflow-supervisor-runtime.ts +209 -0
  403. package/src/runtime/root/write-fence.ts +50 -2
  404. package/src/runtime/safe-tooling/google-credential-store.ts +76 -21
  405. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  406. package/src/runtime/safe-tooling/workspace-auth.ts +1 -1
  407. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  408. package/src/runtime/shared/process-environment.ts +20 -9
  409. package/src/runtime/shared/response-budget.ts +1 -3
  410. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  411. package/src/runtime/standalone-recovery/core.ts +3702 -342
  412. package/src/runtime/standalone-recovery/entry.ts +469 -39
  413. package/src/runtime/standalone-recovery/installer.ts +262 -148
  414. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  415. package/src/runtime/standalone-recovery/operation-lock.ts +1 -1
  416. package/src/runtime/standalone-recovery/performance.ts +54 -16
  417. package/src/runtime/standalone-recovery/release.ts +53 -5
  418. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  419. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  420. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  421. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +10 -3
  422. package/src/runtime/workflow/schedules/engine.ts +138 -172
  423. package/src/runtime/workflow/schedules/work-continuation.ts +44 -5
  424. package/src/runtime/workflows/runtime.ts +15 -19
  425. package/src/testing/test-governance.ts +5 -1
  426. package/supervisor/chatgpt-conversation.ts +23 -0
  427. package/supervisor/client.ts +201 -0
  428. package/supervisor/control-plane.ts +868 -0
  429. package/supervisor/entry.ts +15 -0
  430. package/supervisor/forge-validators.ts +80 -0
  431. package/supervisor/index.ts +5 -0
  432. package/supervisor/native-browser-adapter.ts +786 -0
  433. package/supervisor/native-messaging/host.ts +39 -0
  434. package/supervisor/native-messaging/manifest.ts +26 -0
  435. package/supervisor/native-messaging/protocol.ts +27 -0
  436. package/supervisor/paths.ts +18 -0
  437. package/supervisor/protocol.ts +202 -0
  438. package/supervisor/server.ts +404 -0
  439. package/supervisor/store.ts +1451 -0
  440. package/supervisor/tsconfig.json +8 -0
  441. package/supervisor/types.ts +255 -0
  442. package/adapters/chatgpt/controller-host.ts +0 -119
  443. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  444. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  445. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  446. package/packages/kernel/progression/api/index.ts +0 -2
  447. package/packages/kernel/progression/application/projector.ts +0 -211
  448. package/packages/kernel/progression/domain/types.ts +0 -116
  449. package/packages/kernel/progression/index.ts +0 -1
  450. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  451. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  452. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  453. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  454. package/scripts/benchmark-background-check-overlap.ts +0 -228
  455. package/scripts/benchmark-computer-hotpath.ts +0 -255
  456. package/scripts/benchmark-controller-hotpath.ts +0 -212
  457. package/scripts/benchmark-controller-round2.ts +0 -191
  458. package/scripts/benchmark-ios-agent-device.ts +0 -511
  459. package/scripts/benchmark-mcp-host.sh +0 -117
  460. package/scripts/benchmark-mcp-transport.ts +0 -169
  461. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  462. package/scripts/benchmark-operational-shadow.ts +0 -28
  463. package/scripts/benchmark-quality-harness.ts +0 -146
  464. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  465. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  466. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  467. package/scripts/benchmark-thin-harness.ts +0 -251
  468. package/scripts/benchmark-typescript-navigation.ts +0 -186
  469. package/scripts/benchmark-work-efficiency.ts +0 -334
  470. package/scripts/build-controller-ui.ts +0 -28
  471. package/scripts/check-npm-release.sh +0 -32
  472. package/scripts/check-public-release-surface.sh +0 -19
  473. package/scripts/check-release-published.sh +0 -57
  474. package/scripts/check-release-readiness.sh +0 -37
  475. package/scripts/check-release-version.mjs +0 -74
  476. package/scripts/check-tarball-install-smoke.sh +0 -150
  477. package/scripts/package-source-archive.sh +0 -147
  478. package/scripts/public-release-files.txt +0 -39
  479. package/scripts/public-release.ts +0 -174
  480. package/scripts/publish-release-tarball.sh +0 -27
  481. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  482. package/scripts/stage-runtime-release.ts +0 -44
  483. package/src/cli/controller/progress.ts +0 -656
  484. package/src/cli/controller/work-mode.ts +0 -181
  485. package/src/cli/local-bridge/console-assets.ts +0 -17
  486. package/src/cli/local-bridge/dashboard.ts +0 -17
  487. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  488. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  489. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  490. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  491. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  492. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  493. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  494. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  495. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  496. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  497. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  498. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  499. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  500. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  501. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  502. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  503. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  504. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  505. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  506. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  507. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  508. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  509. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  510. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  511. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  512. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  513. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  514. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  515. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  516. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  517. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  518. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  519. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  520. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  521. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  522. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  523. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  524. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  525. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  526. package/src/runtime/control-plane/routing/index.ts +0 -1
  527. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  528. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
@@ -90,6 +90,24 @@ export interface AssistantPluginManifest {
90
90
  duplicateStateAllowed: false;
91
91
  sourceOfTruth: string[];
92
92
  };
93
+ /**
94
+ * A temporary transport projection. It is descriptive only: the replacement
95
+ * owner remains the sole execution and persistence authority.
96
+ */
97
+ compatibility?: {
98
+ replacementOwner: string;
99
+ boundedConsumers: Array<{
100
+ surface: 'plugin_action_execute';
101
+ pluginId: string;
102
+ actionIds: string[];
103
+ }>;
104
+ removalCondition: {
105
+ kind: 'no_supported_frozen_contract_actions';
106
+ surface: 'plugin_action_execute';
107
+ pluginId: string;
108
+ actionIds: string[];
109
+ };
110
+ };
93
111
  enabled: boolean;
94
112
  lifecycle: {
95
113
  state: AssistantPluginLifecycleState;
@@ -140,6 +158,8 @@ export interface AssistantPluginActionRequest {
140
158
 
141
159
  export interface AssistantPluginActionExecutionInput {
142
160
  controllerHome: string;
161
+ /** Explicit per-invocation authorization for protected plugin actions. */
162
+ confirmAuthorization?: boolean;
143
163
  repoId: string;
144
164
  repoRoot: string;
145
165
  pluginId: string;
@@ -158,6 +158,22 @@ export function buildXiaohongshuPluginManifest(previousRevision = 0, previousUpd
158
158
  'browser-profile:authentication-and-session',
159
159
  ],
160
160
  },
161
+ compatibility: {
162
+ replacementOwner: 'Workflow Runtime (rh_work workflow_execute) and the versioned xiaohongshu Workflow assets',
163
+ boundedConsumers: [
164
+ {
165
+ surface: 'plugin_action_execute',
166
+ pluginId: PLUGIN_ID,
167
+ actionIds: ['get_publish_recipe', 'publish_note'],
168
+ },
169
+ ],
170
+ removalCondition: {
171
+ kind: 'no_supported_frozen_contract_actions',
172
+ surface: 'plugin_action_execute',
173
+ pluginId: PLUGIN_ID,
174
+ actionIds: ['get_publish_recipe', 'publish_note'],
175
+ },
176
+ },
161
177
  enabled: true,
162
178
  lifecycle: { state: 'enabled', reason: 'Compatibility translation is available; all publishing effects are Workflow-owned.' },
163
179
  health: health(), permissions: permissions(), capabilities: capabilities(), actions: actions(), updatedAt: previousUpdatedAt ?? now(),
@@ -146,7 +146,7 @@ export function updateRepositoryProjectionRefreshRequest(
146
146
  sourceRevision?: string;
147
147
  nowMs?: number;
148
148
  },
149
- options: { lock?: boolean } = {},
149
+ options: { lock?: boolean; supersedeAttempt?: boolean } = {},
150
150
  ): ProjectionDirtyMarker | undefined {
151
151
  try {
152
152
  const fence = assertRuntimeMayWrite('update_active_projection', controllerHome);
@@ -170,7 +170,11 @@ export function updateRepositoryProjectionRefreshRequest(
170
170
  ),
171
171
  );
172
172
 
173
- if (current && sameSource) {
173
+ const supersedeAttempt = options.supersedeAttempt === true
174
+ && current?.refreshStatus !== undefined
175
+ && current.refreshStatus !== 'pending';
176
+
177
+ if (current && sameSource && !supersedeAttempt) {
174
178
  const normalized = normalizeMarker(current);
175
179
  const enriched: ProjectionDirtyMarker = {
176
180
  ...normalized,
@@ -214,7 +218,7 @@ export function markRepositoryProjectionDirty(
214
218
  reason,
215
219
  sourceRevision: options.sourceRevision,
216
220
  nowMs: options.nowMs,
217
- });
221
+ }, { supersedeAttempt: true });
218
222
  }
219
223
 
220
224
  export function readRepositoryProjectionDirty(controllerHome: string, repoId: string): ProjectionDirtyMarker | undefined {
@@ -27,7 +27,7 @@ import type { ProjectionObservation, ProjectionSourceReconciliation } from '../h
27
27
  import { RUNTIME_HEALTH_THRESHOLDS } from '../health/evaluator';
28
28
  import { isProcessAlive } from '../shared/process-tree';
29
29
  import type { TaskLedgerProjection } from '../../cli/controller/task-ledger';
30
- import { collectWorkLifecycleAttention } from '../control-plane/execution/work-lifecycle-audit';
30
+ import { collectWorkLifecycleAttention, workLifecycleAttentionBlocksReadiness } from '../control-plane/execution/work-lifecycle-audit';
31
31
 
32
32
  export interface ProjectionMetadata {
33
33
  contentRevision: number;
@@ -164,7 +164,9 @@ function projectionWithExecutionIndexOverlay(
164
164
  const activeJobIds = new Set(activeJobSummaries.map((job) => job.jobId));
165
165
  const attentionJobs = recentJobs?.filter((job) => ATTENTION_JOB_STATUSES.has(job.status));
166
166
  const materializedLifecycleAttention = base.attention.filter((entry) => entry.jobId.startsWith('lifecycle:'));
167
- const materializedCurrentLifecycleAttention = base.currentAttention.filter((entry) => entry.jobId.startsWith('lifecycle:'));
167
+ const materializedCurrentLifecycleAttention = base.currentAttention
168
+ .filter((entry) => entry.jobId.startsWith('lifecycle:'))
169
+ .filter(workLifecycleAttentionBlocksReadiness);
168
170
  const attention = attentionJobs
169
171
  ? attentionJobs.map(attentionSummary)
170
172
  : base.attention.filter((entry) => !entry.jobId.startsWith('lifecycle:'));
@@ -190,6 +192,8 @@ function projectionWithExecutionIndexOverlay(
190
192
  // Lifecycle attention is producer-owned materialized state. Hot reads overlay
191
193
  // only lightweight ExecutionJob/Lease indexes and must never synchronously
192
194
  // re-run Git/Work lifecycle reconciliation on the MCP request event loop.
195
+ // Re-apply the current readiness classifier to persisted lifecycle entries so
196
+ // a policy cutover cannot leave obsolete blockers stuck in currentAttention.
193
197
  currentAttention: [...currentAttention, ...materializedCurrentLifecycleAttention].slice(0, 100),
194
198
  attention: [...attention, ...materializedLifecycleAttention].slice(0, 100),
195
199
  };
@@ -247,7 +251,7 @@ function buildRepositoryProjection(
247
251
  activeLeases: leases.length,
248
252
  currentAttention: [
249
253
  ...currentAttentionJobs.map((job) => ({ jobId: job.jobId, status: job.status, message: job.error?.message })),
250
- ...lifecycleAttention,
254
+ ...lifecycleAttention.filter(workLifecycleAttentionBlocksReadiness),
251
255
  ].slice(0, 100),
252
256
  attention: [
253
257
  ...attentionJobs.map((job) => ({ jobId: job.jobId, status: job.status, message: job.error?.message })),
@@ -474,10 +478,15 @@ function refreshRepositoryProjection(
474
478
  const nowMs = options.nowMs ?? Date.now();
475
479
  const acquiredAt = nowIso(nowMs);
476
480
  const owner = refreshOwner(options, acquiredAt);
477
- return withRepositoryProjectionRefreshLock(
481
+ const lockOwner = `projection-refresh:${owner.pid}`;
482
+
483
+ // Claim one refresh generation under the repository projection lock, then release
484
+ // it before the expensive materialization. Real jobs/leases/finalizers must be
485
+ // able to invalidate the projection while a refresh is building.
486
+ const claim = withRepositoryProjectionRefreshLock(
478
487
  controllerHome,
479
488
  repoId,
480
- `projection-refresh:${owner.pid}`,
489
+ lockOwner,
481
490
  () => {
482
491
  dirtyProjectionReadCache.delete(dirtyProjectionReadCacheKey(controllerHome, repoId));
483
492
  const previous = readJsonFile<RepositoryRuntimeProjection | undefined>(projectionPath(controllerHome, repoId), undefined);
@@ -497,13 +506,26 @@ function refreshRepositoryProjection(
497
506
  sourceRevision,
498
507
  nowMs,
499
508
  }, { lock: false });
500
- if (!marker) return { refreshed: false, skippedReason: 'passive_runtime' };
509
+ if (!marker) {
510
+ return {
511
+ kind: 'skip' as const,
512
+ result: { refreshed: false, skippedReason: 'passive_runtime' as const },
513
+ };
514
+ }
515
+ }
516
+ if (!marker) {
517
+ return {
518
+ kind: 'skip' as const,
519
+ result: { refreshed: false, skippedReason: 'clean' as const, projection: previous },
520
+ };
501
521
  }
502
- if (!marker) return { refreshed: false, skippedReason: 'clean', projection: previous };
503
522
 
504
523
  const currentOwner = refreshOwner(options, acquiredAt);
505
524
  if (ownerStillOwnsRefresh(marker, nowMs, currentOwner)) {
506
- return { refreshed: false, skippedReason: 'running', marker, projection: previous };
525
+ return {
526
+ kind: 'skip' as const,
527
+ result: { refreshed: false, skippedReason: 'running' as const, marker, projection: previous },
528
+ };
507
529
  }
508
530
  if (marker.refreshStatus === 'running' && !ownerStillOwnsRefresh(marker, nowMs, currentOwner)) {
509
531
  marker = recoverStaleOwner(controllerHome, repoId, marker, acquiredAt, 'stale_owner_or_restart');
@@ -514,42 +536,64 @@ function refreshRepositoryProjection(
514
536
  && marker.nextAttemptAt
515
537
  && Date.parse(marker.nextAttemptAt) > nowMs
516
538
  ) {
517
- return { refreshed: false, skippedReason: 'retry_deferred', marker, projection: previous };
539
+ return {
540
+ kind: 'skip' as const,
541
+ result: { refreshed: false, skippedReason: 'retry_deferred' as const, marker, projection: previous },
542
+ };
518
543
  }
519
544
 
520
545
  const running = markRunning(controllerHome, repoId, {
521
546
  ...marker,
522
547
  sourceRevision: marker.sourceRevision ?? sourceRevision,
523
548
  }, owner, acquiredAt);
524
- try {
525
- const latestPrevious = readJsonFile<RepositoryRuntimeProjection | undefined>(projectionPath(controllerHome, repoId), undefined);
526
- const buildRevision = normalizeGitRevision(running.sourceRevision) ?? sourceRevision;
527
- const projection = buildRepositoryProjection(controllerHome, repoId, latestPrevious, buildRevision);
528
- const current = readRepositoryProjectionDirty(controllerHome, repoId);
529
- if (
530
- !current
531
- || current.nonce !== running.nonce
532
- || (
533
- running.sourceRevision
534
- && current.sourceRevision
535
- && !gitRevisionsEquivalent(running.sourceRevision, current.sourceRevision)
536
- )
537
- ) {
538
- return { refreshed: false, skippedReason: 'superseded', marker: current, projection: latestPrevious };
539
- }
540
- writeJsonAtomic(projectionPath(controllerHome, repoId), projection);
541
- clearRepositoryProjectionDirty(controllerHome, repoId, current, projection.metadata?.generatedFromRevision);
542
- dirtyProjectionReadCache.delete(dirtyProjectionReadCacheKey(controllerHome, repoId));
543
- return { refreshed: true, projection };
544
- } catch (error) {
545
- const current = readRepositoryProjectionDirty(controllerHome, repoId);
546
- if (current?.nonce === running.nonce) {
547
- markFailed(controllerHome, repoId, running, owner, error, options.nowMs ?? Date.now());
548
- }
549
- throw error;
550
- }
549
+ return {
550
+ kind: 'build' as const,
551
+ running,
552
+ previous: readJsonFile<RepositoryRuntimeProjection | undefined>(projectionPath(controllerHome, repoId), undefined),
553
+ buildRevision: normalizeGitRevision(running.sourceRevision) ?? sourceRevision,
554
+ };
551
555
  },
552
556
  );
557
+
558
+ if (claim.kind === 'skip') return claim.result;
559
+
560
+ let projection: RepositoryRuntimeProjection;
561
+ try {
562
+ projection = buildRepositoryProjection(controllerHome, repoId, claim.previous, claim.buildRevision);
563
+ } catch (error) {
564
+ // Failure bookkeeping is another short CAS section. If a real mutation already
565
+ // superseded this nonce, it owns the dirty marker and must not be overwritten.
566
+ withRepositoryProjectionRefreshLock(controllerHome, repoId, lockOwner, () => {
567
+ const current = readRepositoryProjectionDirty(controllerHome, repoId);
568
+ if (current?.nonce === claim.running.nonce) {
569
+ markFailed(controllerHome, repoId, claim.running, owner, error, options.nowMs ?? Date.now());
570
+ }
571
+ });
572
+ throw error;
573
+ }
574
+
575
+ // Publish only if the exact claimed nonce still owns the refresh. A concurrent
576
+ // mutation either superseded it while build ran or will mark dirty after this
577
+ // short publish section, so no invalidation can be lost.
578
+ return withRepositoryProjectionRefreshLock(controllerHome, repoId, lockOwner, () => {
579
+ const current = readRepositoryProjectionDirty(controllerHome, repoId);
580
+ const currentProjection = readJsonFile<RepositoryRuntimeProjection | undefined>(projectionPath(controllerHome, repoId), undefined);
581
+ if (
582
+ !current
583
+ || current.nonce !== claim.running.nonce
584
+ || (
585
+ claim.running.sourceRevision
586
+ && current.sourceRevision
587
+ && !gitRevisionsEquivalent(claim.running.sourceRevision, current.sourceRevision)
588
+ )
589
+ ) {
590
+ return { refreshed: false, skippedReason: 'superseded', marker: current, projection: currentProjection };
591
+ }
592
+ writeJsonAtomic(projectionPath(controllerHome, repoId), projection);
593
+ clearRepositoryProjectionDirty(controllerHome, repoId, current, projection.metadata?.generatedFromRevision);
594
+ dirtyProjectionReadCache.delete(dirtyProjectionReadCacheKey(controllerHome, repoId));
595
+ return { refreshed: true, projection };
596
+ });
553
597
  }
554
598
 
555
599
  export function refreshRepositoryProjectionForRepository(
@@ -93,13 +93,13 @@ export const RECOVERY_ACTIONS = {
93
93
  },
94
94
  stageAndActivateRuntimeRelease: {
95
95
  id: 'recovery.stage_and_activate_runtime_release',
96
- title: 'Stage and activate canonical Runtime release',
97
- description: 'Build one immutable Runtime release from the selected registered repository, then hand lifecycle activation to the standalone Recovery transaction.',
96
+ title: 'Prepare isolated Runtime ReleaseSession',
97
+ description: 'Compatibility action id: ask standalone Recovery to freeze its configured source and Stable A authority, create isolated Candidate B, and build a portable release. It no longer activates Stable A.',
98
98
  class: 'stale_runtime_state',
99
99
  risk: 'medium',
100
100
  confirmation: 'authorization',
101
101
  localOnly: true,
102
- boundedTo: ['registered_repository', 'runtime_release_storage', 'external_runtime_lifecycle'],
102
+ boundedTo: ['registered_repository', 'runtime_release_storage'],
103
103
  },
104
104
  restartPrimaryConnector: {
105
105
  id: 'recovery.restart_primary_connector',
@@ -3,15 +3,14 @@ import { ensureRepositoryRuntimeStorage } from '../../cli/repositories/runtime-s
3
3
  import { prepareTransferArtifacts } from '../../cli/repositories/selected-path-actions';
4
4
  import { applyRuntimeCleanup, previewRuntimeCleanup } from '../maintenance/cleanup';
5
5
  import { rebuildRepositoryProjection } from '../projections/materialized-view';
6
- import { assertRuntimeReleaseFiles, stageRuntimeReleaseFromCandidateSource } from '../root/release-materialize';
7
6
  import { recoveryActionById } from './actions';
8
7
  import { assertRecoveryAuthorized, buildRecoveryAuditRecord } from './audit';
9
8
  import { applyRuntimeMaintenance } from './maintenance-executor';
10
- import { writeRecoveryAuditRecord } from './store';
9
+ import { writeInstanceRecoveryAuditRecord, writeRecoveryAuditRecord } from './store';
11
10
 
12
11
  export interface CapabilityRecoveryApplicationInput {
13
12
  controllerHome: string;
14
- repository: RepositoryRecord;
13
+ repository?: RepositoryRecord;
15
14
  actionId: string;
16
15
  reason: string;
17
16
  confirmAuthorization: boolean;
@@ -23,17 +22,30 @@ export interface CapabilityRecoveryApplicationInput {
23
22
  }
24
23
 
25
24
  export interface CapabilityRecoveryApplicationResult {
26
- repoId: string;
25
+ repoId?: string;
26
+ scope: 'forge_instance' | 'repository';
27
27
  action: NonNullable<ReturnType<typeof recoveryActionById>>;
28
28
  audit: ReturnType<typeof writeRecoveryAuditRecord>;
29
29
  result: Record<string, unknown>;
30
30
  }
31
31
 
32
+ const INSTANCE_RECOVERY_ACTION_IDS = new Set([
33
+ 'recovery.stage_and_activate_runtime_release',
34
+ 'recovery.restart_primary_connector',
35
+ 'recovery.probe_again',
36
+ 'recovery.workspace_auth_login_prepare',
37
+ 'recovery.external_filesystem_grant_preview',
38
+ ]);
39
+
40
+ export function recoveryActionScope(actionId: string): 'forge_instance' | 'repository' {
41
+ return INSTANCE_RECOVERY_ACTION_IDS.has(actionId) ? 'forge_instance' : 'repository';
42
+ }
43
+
32
44
  export class RecoveryApplicationError extends Error {
33
- readonly code: 'RECOVERY_ACTION_UNKNOWN';
45
+ readonly code: 'RECOVERY_ACTION_UNKNOWN' | 'RECOVERY_REPOSITORY_CONTEXT_REQUIRED';
34
46
  readonly actionId: string;
35
47
 
36
- constructor(code: 'RECOVERY_ACTION_UNKNOWN', actionId: string) {
48
+ constructor(code: RecoveryApplicationError['code'], actionId: string) {
37
49
  super(`${code}: ${actionId}`);
38
50
  this.name = 'RecoveryApplicationError';
39
51
  this.code = code;
@@ -85,29 +97,19 @@ export async function executeCapabilityRecoveryAction(
85
97
  : undefined,
86
98
  );
87
99
 
100
+ const scope = recoveryActionScope(action.id);
101
+ const repository = scope === 'repository'
102
+ ? input.repository ?? (() => { throw new RecoveryApplicationError('RECOVERY_REPOSITORY_CONTEXT_REQUIRED', action.id); })()
103
+ : undefined;
104
+
88
105
  let payload: Record<string, unknown>;
89
106
  let affectedPaths: string[] = [];
90
107
  switch (action.id) {
91
108
  case 'recovery.stage_and_activate_runtime_release': {
92
- const staged = stageRuntimeReleaseFromCandidateSource({
93
- controllerHome: input.controllerHome,
94
- sourceRoot: input.repository.canonicalRoot,
95
- sourceRepositoryId: input.repository.repoId,
109
+ payload = await input.callStandaloneRecoveryTool('prepare_runtime_release_session', {
110
+ request_id: `runtime-release-session-${Date.now()}`,
96
111
  });
97
- assertRuntimeReleaseFiles(staged);
98
- payload = {
99
- staged: {
100
- releaseId: staged.releaseId,
101
- sourceCommit: staged.sourceCommit,
102
- artifactIdentity: staged.artifactIdentity,
103
- manifestSha256: staged.manifestSha256,
104
- },
105
- activation: await input.callStandaloneRecoveryTool('activate_runtime_release', {
106
- request_id: `runtime-cutover-${Date.now()}`,
107
- release_path: staged.manifestPath,
108
- }),
109
- };
110
- affectedPaths = ['controllerHome/runtime/releases', 'controllerHome/runtime/releases/authority.json'];
112
+ affectedPaths = ['controllerHome/recovery/state/release-sessions', 'candidate-runtime-lanes'];
111
113
  break;
112
114
  }
113
115
  case 'recovery.restart_primary_connector': {
@@ -121,20 +123,20 @@ export async function executeCapabilityRecoveryAction(
121
123
  payload = { recovery: await input.recoverySnapshot() };
122
124
  break;
123
125
  case 'recovery.rebuild_projection': {
124
- const projection = rebuildRepositoryProjection(input.controllerHome, input.repository.repoId);
126
+ const projection = rebuildRepositoryProjection(input.controllerHome, repository!.repoId);
125
127
  payload = { projection };
126
128
  affectedPaths = ['.ai/harness/controller/projections'];
127
129
  break;
128
130
  }
129
131
  case 'recovery.refresh_repository': {
130
- const runtimeStorage = ensureRepositoryRuntimeStorage(input.repository, input.controllerHome);
131
- const projection = rebuildRepositoryProjection(input.controllerHome, input.repository.repoId);
132
+ const runtimeStorage = ensureRepositoryRuntimeStorage(repository!, input.controllerHome);
133
+ const projection = rebuildRepositoryProjection(input.controllerHome, repository!.repoId);
132
134
  payload = { runtimeStorage, projection };
133
135
  affectedPaths = ['.ai/harness/controller', '.ai/harness/local-bridge'];
134
136
  break;
135
137
  }
136
138
  case 'recovery.cleanup_preview': {
137
- payload = previewRuntimeCleanup(input.repository.canonicalRoot, {
139
+ payload = previewRuntimeCleanup(repository!.canonicalRoot, {
138
140
  minAgeMinutes: input.minAgeMinutes,
139
141
  includeTempDirs: true,
140
142
  includeTerminalLocalJobs: true,
@@ -145,7 +147,7 @@ export async function executeCapabilityRecoveryAction(
145
147
  break;
146
148
  }
147
149
  case 'recovery.cleanup_apply': {
148
- payload = applyRuntimeCleanup(input.repository.canonicalRoot, {
150
+ payload = applyRuntimeCleanup(repository!.canonicalRoot, {
149
151
  minAgeMinutes: input.minAgeMinutes,
150
152
  includeTempDirs: true,
151
153
  includeTerminalLocalJobs: true,
@@ -159,7 +161,7 @@ export async function executeCapabilityRecoveryAction(
159
161
  }
160
162
  case 'recovery.reconcile_jobs':
161
163
  case 'recovery.local_jobs_reconcile': {
162
- const maintenance = applyRuntimeMaintenance(input.repository, input.controllerHome, {
164
+ const maintenance = applyRuntimeMaintenance(repository!, input.controllerHome, {
163
165
  actionId: 'local_jobs_reconcile',
164
166
  confirmMaintenance: true,
165
167
  minAgeMinutes: input.minAgeMinutes ?? 10,
@@ -170,7 +172,7 @@ export async function executeCapabilityRecoveryAction(
170
172
  break;
171
173
  }
172
174
  case 'recovery.local_jobs_quarantine_unreadable': {
173
- const maintenance = applyRuntimeMaintenance(input.repository, input.controllerHome, {
175
+ const maintenance = applyRuntimeMaintenance(repository!, input.controllerHome, {
174
176
  actionId: 'quarantine_unreadable_local_jobs',
175
177
  confirmMaintenance: true,
176
178
  minAgeMinutes: input.minAgeMinutes ?? 0,
@@ -181,7 +183,7 @@ export async function executeCapabilityRecoveryAction(
181
183
  break;
182
184
  }
183
185
  case 'recovery.runtime_storage_finalize_relocation': {
184
- const maintenance = applyRuntimeMaintenance(input.repository, input.controllerHome, {
186
+ const maintenance = applyRuntimeMaintenance(repository!, input.controllerHome, {
185
187
  actionId: 'runtime_storage_finalize_relocation',
186
188
  confirmMaintenance: true,
187
189
  minAgeMinutes: input.minAgeMinutes ?? 0,
@@ -192,7 +194,7 @@ export async function executeCapabilityRecoveryAction(
192
194
  break;
193
195
  }
194
196
  case 'recovery.create_patch_handoff':
195
- payload = prepareTransferArtifacts(input.repository, { reason: input.reason }) as unknown as Record<string, unknown>;
197
+ payload = prepareTransferArtifacts(repository!, { reason: input.reason }) as unknown as Record<string, unknown>;
196
198
  affectedPaths = ['.ai/harness/transfers', '.ai/harness/session'];
197
199
  break;
198
200
  case 'recovery.workspace_auth_login_prepare':
@@ -213,16 +215,15 @@ export async function executeCapabilityRecoveryAction(
213
215
  payload = { skipped: true, reason: `No executor is registered for ${action.id}.` };
214
216
  }
215
217
 
216
- const audit = writeRecoveryAuditRecord(
217
- input.controllerHome,
218
- input.repository.repoId,
219
- buildRecoveryAuditRecord({
220
- actor: 'capability_recovery_apply',
221
- action,
222
- result: payload.skipped === true ? 'skipped' : 'succeeded',
223
- reason: input.reason,
224
- affectedPaths,
225
- }),
226
- );
227
- return { repoId: input.repository.repoId, action, audit, result: payload };
218
+ const auditRecord = buildRecoveryAuditRecord({
219
+ actor: 'capability_recovery_apply',
220
+ action,
221
+ result: payload.skipped === true ? 'skipped' : 'succeeded',
222
+ reason: input.reason,
223
+ affectedPaths,
224
+ });
225
+ const audit = repository
226
+ ? writeRecoveryAuditRecord(input.controllerHome, repository.repoId, auditRecord)
227
+ : writeInstanceRecoveryAuditRecord(input.controllerHome, auditRecord);
228
+ return { ...(repository ? { repoId: repository.repoId } : {}), scope, action, audit, result: payload };
228
229
  }
@@ -44,31 +44,31 @@ export const RUNTIME_LIFECYCLE_INVENTORY: readonly RuntimeLifecycleClassDefiniti
44
44
  lifecycle({
45
45
  id: 'requirement', owner: 'Goal / Requirement authority', scope: 'controller', dataClass: 'semantic_authority',
46
46
  storage: 'Controller Home SQLite requirement namespace',
47
- terminalCondition: 'Requirement reaches done or cancelled through canonical semantic transition.',
48
- activeProtection: 'The canonical transition table never returns done/cancelled Requirements to active authority, and optimistic revision fencing serializes every mutation.',
47
+ terminalCondition: 'Requirement semantic state reaches completed or cancelled through revisioned Requirement CAS.',
48
+ activeProtection: 'Stable Requirement identity plus expected-revision CAS serializes authored semantic updates; execution evidence and Controller dispositions cannot mutate Requirement state.',
49
49
  retentionCapacity: 'Permanent semantic/audit retention is the explicit policy: SQLite stores exactly one current row per requirementId and revisions update that row in place. Cardinality grows only when a new Requirement identity is deliberately admitted, never from retry/recovery cycles.',
50
50
  cleanupAuthority: 'Requirement authority owns semantic retention. Runtime GC does not delete Requirement rows; replaceable execution evidence is reclaimed by its own lifecycle classes.',
51
- recoverySemantics: 'done may only remain done or become cancelled; cancelled may only remain cancelled. Recovery consumes the retained identity instead of reconstructing or reopening it.',
51
+ recoverySemantics: 'Recovery reads the retained Requirement identity/revision and never infers completion, continuation or reopening from Work, Plan, Controller or provider state.',
52
52
  closureStatus: 'existing_bounded', evidencePaths: ['src/runtime/control-plane/persistence/requirement-store.ts','packages/kernel/goal/api/index.ts','tests/runtime/requirement-portfolio-migration.test.ts'],
53
53
  }),
54
54
  lifecycle({
55
55
  id: 'plan', owner: 'Goal / Plan authority', scope: 'repository', dataClass: 'semantic_authority',
56
56
  storage: 'Controller Home SQLite plan namespace',
57
- terminalCondition: 'Plan is finalized, superseded, cancelled or invalidated by drift.',
58
- activeProtection: 'Current-plan queries exclude terminal/superseded authority, successor obligation continuity is fenced explicitly, and every same-plan mutation is revision-CAS protected.',
59
- retentionCapacity: 'Permanent semantic/audit retention is the explicit policy: SQLite stores one current row per planId and revisions update that row in place. Only an explicit successor creates another Plan identity, so retries do not multiply Plan rows.',
60
- cleanupAuthority: 'Plan authority owns semantic retention. Runtime GC does not delete Plan rows; predecessor/successor lineage remains queryable while disposable validation/process evidence is reclaimed elsewhere.',
61
- recoverySemantics: 'Recovery preserves predecessor/successor and obligation disposition facts and cannot make a terminal predecessor current.',
62
- closureStatus: 'existing_bounded', evidencePaths: ['src/runtime/control-plane/facade/plan-contract-store.ts','packages/kernel/goal/api/index.ts','tests/runtime/plan-contract-store.test.ts'],
57
+ terminalCondition: 'Plan has no Runtime-owned terminal lifecycle; it remains model-authored revisioned working memory until the model/user revises or stops referencing it.',
58
+ activeProtection: 'Stable Plan identity plus expected-revision CAS protects each authored revision. Approval, PlanStep acceptance, supersession and predecessor obligations are not execution authority.',
59
+ retentionCapacity: 'Permanent semantic/audit retention stores one current semantic row per planId plus bounded revision history; retries/recovery do not create replacement Plan identities.',
60
+ cleanupAuthority: 'Plan semantic retention is independent from disposable execution/process evidence; Runtime cleanup never rewrites Plan progress.',
61
+ recoverySemantics: 'Recovery re-reads the same Plan identity/revision and never derives Plan progress or execution admission from receipts, Work lifecycle, ControllerRound or compatibility fields.',
62
+ closureStatus: 'existing_bounded', evidencePaths: ['src/runtime/control-plane/facade/plan-contract-store.ts','tests/runtime/goal-authority-convergence.test.ts'],
63
63
  }),
64
64
  lifecycle({
65
- id: 'work', owner: 'Kernel Work authority', scope: 'work', dataClass: 'execution_authority',
66
- storage: 'Controller Home SQLite / Work authority records plus WorkHandle placement state',
67
- terminalCondition: 'Work reaches completed, failed or cancelled with delivery/cleanup evidence as required.',
68
- activeProtection: 'Work state machine, controller ownership, leases, delivery containment, active Plan bindings and revision-CAS updates protect live or explicitly resumable Work.',
69
- retentionCapacity: 'Permanent semantic/audit retention is the explicit policy: SQLite stores one current row per workId and lifecycle mutations update that row in place. New rows correspond only to deliberately admitted Work identities; Process/log/check-result/artifact growth is bounded by separate lifecycle classes.',
70
- cleanupAuthority: 'Work finalization/terminal cleanup releases owned execution resources, but Runtime GC does not delete the durable Work row or its completion identity.',
71
- recoverySemantics: 'A retained cancelled Work can resume only through the explicit canonical resume contract; completed delivery identity and successor lineage remain durable and are never synthesized from deleted detail.',
65
+ id: 'work', owner: 'Kernel Work semantic authority', scope: 'work', dataClass: 'semantic_authority',
66
+ storage: 'Controller Home SQLite Work semantic records; concrete checkout/process/resource placement is owned by its domain stores',
67
+ terminalCondition: 'Work semantic state is exactly open, completed or cancelled; only revisioned work_revise/work_complete CAS changes that semantic state.',
68
+ activeProtection: 'Stable Work identity plus expected-revision CAS protects model-authored objective/state/result refs. Controller claims, delivery receipts, verification/review evidence and Plan provenance cannot complete Work.',
69
+ retentionCapacity: 'SQLite stores one current semantic row per workId plus bounded revision history. Retry, delivery, provider recovery and resource cleanup do not manufacture successor Work identities.',
70
+ cleanupAuthority: 'OwnedResource/process/worktree domains clean up their own physical resources. Cleanup and delivery never rewrite semantic Work completion.',
71
+ recoverySemantics: 'Recovery resumes mechanical operations around the same retained Work when appropriate; it never infers semantic completion/cancellation/reopen from physical evidence.',
72
72
  closureStatus: 'existing_bounded', evidencePaths: ['packages/kernel/work/api/index.ts','src/runtime/control-plane/execution/work-terminal-cleanup.ts','tests/runtime/repository-work-admission.test.ts'],
73
73
  }),
74
74
  lifecycle({
@@ -95,20 +95,20 @@ export const RUNTIME_LIFECYCLE_INVENTORY: readonly RuntimeLifecycleClassDefiniti
95
95
  id: 'check_receipt', owner: 'Verification / Process evidence authority', scope: 'work', dataClass: 'evidence',
96
96
  storage: 'Controller Home Process/check receipt evidence',
97
97
  terminalCondition: 'Check Process reaches terminal outcome and receipt is bound to exact input/source identity.',
98
- activeProtection: 'Receipts required by active validation, completion, review or Operational Memory support evidence are protected.',
98
+ activeProtection: 'Receipts referenced by active Work evidence or Operational Memory are protected; they are evidence only and never completion/review authority.',
99
99
  retentionCapacity: 'A Process check receipt has no separate mutable authority: it is derived from one terminal Process record and copied into Work VerificationRecord when consumed. Process records are bounded by the 7-day/500 policy; persisted check-result sidecars use 30-day/500 retention, a 5000-entry scan bound and at most 50 removals per selected-repository cleanup pass.',
100
100
  cleanupAuthority: 'Process GC owns terminal Process/log source, Scheduler maintenance owns replaceable check-result sidecars, and Work lifecycle owns accepted VerificationRecord copies; none becomes a second receipt authority.',
101
101
  recoverySemantics: 'Active Work cache identities protect required sidecars; truncated/malformed scans fail closed, and missing or changed evidence becomes stale/replay-gap rather than synthetic success.',
102
102
  closureStatus: 'existing_bounded', evidencePaths: ['src/runtime/execution/process-runtime/check-receipt.ts','src/runtime/execution/process-runtime/gc.ts','src/runtime/execution/process-runtime/check-result-retention.ts','packages/kernel/work/api/index.ts','tests/runtime/check-result-retention.test.ts'],
103
103
  }),
104
104
  lifecycle({
105
- id: 'controller_round', owner: 'Kernel ControllerRound authority', scope: 'work', dataClass: 'semantic_authority',
105
+ id: 'controller_round', owner: 'Kernel autonomous-continuation mechanics', scope: 'work', dataClass: 'execution_authority',
106
106
  storage: 'Controller Home SQLite controller-round relay records',
107
- terminalCondition: 'Exactly one semantic disposition settles the round: continue_immediately, wait, wait_for_user or goal_complete; failed/blocked are explicit recovery states.',
108
- activeProtection: 'Relay scope, claim generation and opaque authority fence each live semantic round.',
109
- retentionCapacity: 'Permanent semantic/audit retention is the explicit policy: controller_round_relay uses workId as its stable key and each round/recovery transition revision-updates that row. Round history lives in durable audit, so retries and additional semantic rounds do not create parallel current relay authority.',
110
- cleanupAuthority: 'ControllerRound authority owns relay retention. Runtime GC does not delete relay rows; ControllerSession/lease and provider/browser artifacts are separate bounded lifecycle classes.',
111
- recoverySemantics: 'failed and blocked remain explicit recoverable states, so their relay identity is retained. Transport/session replacement and ambiguous provider effect reconcile against the same fenced relay instead of fabricating a new semantic round.',
107
+ terminalCondition: 'One explicit continuation attempt reaches a mechanical disposition/dispatch boundary; no disposition changes Requirement, Plan or Work semantic state.',
108
+ activeProtection: 'Relay scope, claim generation, stable provider-effect identity and opaque authority fence only continuation dispatch/recovery mechanics.',
109
+ retentionCapacity: 'controller_round_relay uses one current row per continuation scope/work and revision-updates it; audit/effect evidence records history without creating a parallel semantic authority.',
110
+ cleanupAuthority: 'Controller continuation mechanics own relay retention; session leases and provider/browser artifacts remain separate concrete-resource/effect domains.',
111
+ recoverySemantics: 'Transport/session replacement and ambiguous provider effect reconcile against the same fenced continuation/effect identity; outcome_unknown is never blind-replayed and recovery never fabricates semantic progress.',
112
112
  closureStatus: 'existing_bounded', evidencePaths: ['packages/kernel/controller/api/index.ts','tests/runtime/autonomous-continuation-lifecycle.test.ts'],
113
113
  }),
114
114
  lifecycle({
@@ -313,12 +313,12 @@ export const RUNTIME_LIFECYCLE_INVENTORY: readonly RuntimeLifecycleClassDefiniti
313
313
  }),
314
314
  lifecycle({
315
315
  id: 'runtime_temp', owner: 'Runtime diagnostics/process scratch lifecycle', scope: 'process', dataClass: 'temporary',
316
- storage: 'OS temporary roots / Controller-observed Runtime temp entries',
317
- terminalCondition: 'Owning live Process is gone and entry exceeds the runtime temp retention threshold.',
318
- activeProtection: 'collectRuntimeProcesses protects scratch still owned by a live Runtime process.',
319
- retentionCapacity: 'RUNTIME_TEMP_RETENTION_MINUTES age threshold and bounded maintenance candidate scan.',
320
- cleanupAuthority: 'Central Runtime maintenance removeRuntimeTempEntry.',
321
- recoverySemantics: 'Temp cleanup is disposable and never participates in semantic completion or effect replay.',
316
+ storage: 'OS temporary roots / Controller-observed Runtime temp entries, including forge-runtime-release-source-* detached release snapshot containers.',
317
+ terminalCondition: 'Normal release snapshot scope removes its worktree/container immediately; orphaned Runtime temp is terminal after the owning live Process is gone and the retention threshold is exceeded.',
318
+ activeProtection: 'Release snapshot callbacks own their temp container until finally cleanup; collectRuntimeProcesses protects longer-lived scratch still attributable to a live Runtime process.',
319
+ retentionCapacity: 'Immediate release-snapshot finally cleanup plus RUNTIME_TEMP_RETENTION_MINUTES age threshold and bounded maintenance candidate scan for crash leftovers.',
320
+ cleanupAuthority: 'Release materialization owns immediate snapshot cleanup; Central Runtime maintenance removeRuntimeTempEntry owns stale crash-leftover cleanup.',
321
+ recoverySemantics: 'Release snapshot/temp cleanup is disposable, lives outside repository workspace authority, prunes stale Git worktree metadata after failed materialization/removal, and never participates in semantic completion or effect replay.',
322
322
  closureStatus: 'existing_bounded', evidencePaths: ['src/runtime/diagnostics/performance.ts','src/runtime/recovery/maintenance-executor.ts'],
323
323
  }),
324
324
  ]);