@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
@@ -0,0 +1,221 @@
1
+ # ADR: Stable A / Candidate B and ReleaseSession authority
2
+
3
+ - **Status:** Accepted source architecture; authority boundary refined 2026-09-20; live cutover remains a separate release operation
4
+ - **Date:** 2026-09-18
5
+ - **Authority:** [`../CURRENT.md`](../CURRENT.md) and executable Runtime/Recovery contracts
6
+
7
+ ## Decision
8
+
9
+ Forge self-hosting has two lanes during a release session:
10
+
11
+ ```text
12
+ Stable A (fixed known-good package Runtime)
13
+ source read/edit/build/static verification + Recovery control
14
+ remains running and is never upgraded by the session
15
+
16
+ Candidate B (one isolated Controller Home)
17
+ copied SQLite snapshot + independent token/config/port/service label
18
+ portable immutable release materialized once and tree-hashed
19
+ all candidate canaries on the exact artifact later promoted to A
20
+
21
+ ReleaseSession (release domain)
22
+ sole durable normal-release lifecycle authority
23
+ durable receipt/fence journal
24
+ final semantic routing decision: B or still-healthy A
25
+
26
+ Standalone Recovery provider
27
+ physical Candidate B preparation and verification
28
+ fenced Runtime activation / rollback
29
+ Watchdog health recovery only
30
+ ```
31
+
32
+ Candidate B never shares A's Controller Home, `control-plane.sqlite`, release
33
+ authority, token file, TCP port, service label, Runtime incarnation, Supervisor
34
+ socket or writer claim. B is not a second production authority: its Home is a
35
+ bounded test clone. New compiled release manifests are deployment-portable and
36
+ omit Controller Home; deployment binding belongs to release authority/service
37
+ contract instead. The exact verified B artifact is promoted byte-for-byte into
38
+ A's immutable release store. A remains the execution plane until an approved
39
+ ReleaseSession reaches one final cutover.
40
+
41
+ No source build, static gate, architecture review or ordinary test may stop or
42
+ activate Stable A. After the source batch is accepted, ReleaseSession may boot
43
+ and restart only isolated Candidate B while A remains continuously available.
44
+ The sole production cutover happens only after B passes Recovery, MCP,
45
+ Scheduler, Supervisor and controller canaries. Final certification then covers
46
+ A→B→C continuation, failed startup, Recovery interruption, Runtime restart,
47
+ MCP reconnection, stale Supervisor writer and return-to-A rollback.
48
+
49
+ ## Incarnation and writer fence
50
+
51
+ `runtime-incarnation.json` is the Controller-Home durable writer epoch. Runtime
52
+ ownership acquires it monotonically with `runtimeInstanceId`, PID and
53
+ `fencingGeneration`; a child claim contains the same generation. A write is
54
+ valid only when owner, incarnation and whole-release authority all match.
55
+ Crash/hard-stop replacement advances the generation, making every old Runtime,
56
+ Scheduler worker, Gateway request and process writer stale without relying on
57
+ their `close()` handlers.
58
+
59
+ Supervisor's Unix socket has only ephemeral owner evidence containing the same
60
+ incarnation. A live socket is a hard writer conflict. A non-connectable socket
61
+ can be reconciled only as stale evidence for a different incarnation; the
62
+ historical `WORKFLOW_SUPERVISOR_WRITER_ALREADY_PRESENT` condition is therefore
63
+ an acceptance case, not a fallback branch.
64
+
65
+ Every service/Recovery/child boundary starts from the shared private-authority
66
+ environment sanitizer. It strips `FORGE_CONTROLLER_*`, `FORGE_RUNTIME_*`,
67
+ `FORGE_RELEASE_*`, `FORGE_SUPERVISOR_*`, `FORGE_WRITER_*` (including
68
+ `FORGE_WRITER_SLOT`) and related process identity. The exact selected release
69
+ contract may then add its own values. No ambient host claim is inherited.
70
+
71
+ ## Recovery bundle and known-good
72
+
73
+ Known-good schema v2 means all of the following validate together:
74
+
75
+ 1. immutable release manifest identity;
76
+ 2. Recovery-owned SQLite `VACUUM INTO` snapshot with SHA-256 and inspection
77
+ counts/schema;
78
+ 3. a hashed declarative Runtime service-contract snapshot.
79
+
80
+ The bundle lives below `Recovery/bundles/known-good/<attestationId>`. Recovery
81
+ creates its data before atomically publishing the known-good record, then
82
+ prunes unreferenced bundles only after publication. A crash leaves at most an
83
+ orphan for the same Recovery owner to clean; it never publishes a metadata-only
84
+ known-good record. Release retention uses this exact validator. Legacy schema-1
85
+ records remain audit history only and have no retention or rollback authority.
86
+
87
+ ## ReleaseSession state
88
+
89
+ `Recovery/state/release-sessions/<id>.json` is the durable storage path for the
90
+ ReleaseSession transaction journal; that path is not a second authority. The
91
+ ReleaseSession domain owns semantic phase progression and a per-record revision
92
+ CAS, while the executing Recovery provider holds the existing mutation lock for
93
+ physical operations. Authority decisions read the complete journal through a
94
+ process-local cache that is invalidated by atomic session writes and directory
95
+ changes; bounded inventories are diagnostic/projection surfaces only and may
96
+ never decide whether an active or prior-attempt session exists. Terminal session
97
+ records remain durable evidence, while their Candidate B homes are physically
98
+ retired once; an already-absent home is an idempotent no-op and is not emitted as
99
+ a fresh cleanup event. A stateless ReleaseCoordinator derives the next action
100
+ from the persisted phase and has no second daemon, scheduler, Work, or durable
101
+ coordinator state. Only one non-terminal ReleaseSession may exist per Forge
102
+ instance. An interrupted `source_frozen` preparation resumes that same session
103
+ when the frozen source and Stable A identity still match.
104
+
105
+ Recovery's own bundle handoff acquires that same exclusive operation lock before
106
+ changing the immutable release pointer and holds it through activation verification
107
+ or exact rollback. New Gateway requests are fenced during this interval and the
108
+ admission marker is cleared on every exit. Open read-only MCP streams are transport
109
+ connections, not in-flight mutation evidence; HTTP request counts cannot add a
110
+ second quiescence gate. The existing service handoff still proves the previous
111
+ process has stopped and the exact replacement is serving before acceptance.
112
+
113
+ ReleaseSession separates wire compatibility from semantic authority. One-way migration also reconciles historical legacy `soaking` records without guesswork: Candidate B is terminalized as `known_good` only when exact durable lineage proves it became a later Stable A, or current RuntimeReleaseAuthority `previous` references that exact release identity; missing proof fails closed. Multiple later ReleaseSession attempts that all name the same exact Candidate B as Stable A are corroborating acceptance evidence, not branches. Successor proof is derived from one pre-migration inventory snapshot, so rewrite order cannot manufacture or erase acceptance evidence. Its
114
+ storage `schemaVersion` remains 1 so the immediately previous Recovery release
115
+ can still inventory the record after an exact rollback; current code requires
116
+ `semanticEpoch=2`. The migration boundary rewrites legacy epoch-1/epoch-less
117
+ records once and thereafter steady-state code consumes only epoch 2. The
118
+ `transaction` field is additive on the wire and ignored by the prior reader.
119
+ RuntimeReleaseAuthority schema 2 is the physical active/previous pointer plus
120
+ rollback SQLite artifact only; it carries no ReleaseSession transaction state.
121
+
122
+ ```text
123
+ source_frozen → built → static_verified → candidate_booted
124
+ → candidate_verified → cutover_eligible → cutover_attempting
125
+ → cutover_committed → soaking → known_good
126
+ ↘ rolled_back / failed
127
+ ```
128
+
129
+ `static_verified` requires type, runtime-architecture, architecture-sync and
130
+ bootstrap receipts from the frozen source revision. `candidate_verified`
131
+ requires Recovery restart, MCP, Scheduler, Supervisor and controller receipts
132
+ from isolated B. `cutover_eligible` is impossible while A and B collide on Home
133
+ or port. Before the first production activation, a transient failure to obtain a
134
+ fresh Stable A verification leaves the same ReleaseSession `cutover_eligible` so
135
+ the exact candidate can be retried after observation recovers; proven Stable A
136
+ identity drift is a real precondition failure. `cutover_attempting` permits
137
+ exactly one fenced production cutover; verified return to exact A terminalizes
138
+ `rolled_back` and is never retried. If observation is interrupted after the
139
+ rollback authority commit but before the ReleaseSession phase write,
140
+ reconciliation requires the exact `release-session-rollback:<sessionId>:`
141
+ authority operation plus matching Stable A, candidate and transaction identities;
142
+ it then records `rolled_back` without replaying the rollback effect.
143
+ Physical service handoff follows the same effect rule: a launchd/systemd helper
144
+ error or timeout is not itself authority that the requested stop/start failed.
145
+ Recovery performs bounded observation of the exact service identity and may
146
+ continue the same fenced transaction only when the physical effect is proven;
147
+ otherwise that transaction fails. Before stopping Stable A, Recovery may build
148
+ the rollback SQLite snapshot while A is still serving, but only under a
149
+ long-lived SQLite `data_version` observer. Any commit by another SQLite
150
+ connection during or after that speculative snapshot invalidates it; after
151
+ quiescence the release store discards it and falls back to the stopped-state
152
+ snapshot. Recovery also computes the bounded SHA-256 of that snapshot while A
153
+ is still serving. RuntimeReleaseAuthority persists this whole-database identity;
154
+ on rollback, a fresh live `VACUUM INTO` snapshot is compared against it. Only an
155
+ identical whole-database snapshot may be restored from the cutover backup. Any
156
+ SQLite change, including domain tables outside `control_plane_audit`, preserves
157
+ the newer live database while the Runtime release rolls back. Legacy backups
158
+ without whole-database identity also preserve live state. This optimization
159
+ therefore removes normal-path database copy/hash cost from the outage window
160
+ without weakening rollback or losing post-cutover durable state.
161
+
162
+ During the stop/start critical section, readiness convergence is intentionally
163
+ narrow: canonical Runtime owner/status, exact release/artifact authority and the
164
+ local `/ready` endpoint. Recovery Gateway/watchdog/tunnel probes, Connector
165
+ transport probes, execution canaries, known-good inspection and MCP protocol
166
+ verification are not activation-readiness inputs. After Runtime readiness,
167
+ Recovery rebinds the persistent Connector and then runs strict whole-Runtime
168
+ verification exactly once. There is no second readiness polling phase after
169
+ Connector rebinding. Once the physical candidate authority is published, the
170
+ ReleaseSession rollback transaction is durably captured before Candidate B is
171
+ started, so every later start/Connector/acceptance failure already has exact
172
+ Stable A rollback identity. Recovery never replays a cutover merely because a
173
+ helper response was lost.
174
+ Automatic source reconciliation is also revision-bounded: once an immutable
175
+ source revision has any terminal ReleaseSession, the daemon will not create a
176
+ second automatic ReleaseSession for that same revision. Explicit human release
177
+ operations remain available, and a changed source revision becomes eligible for
178
+ a new automatic attempt. This rule is derived from ReleaseSession history; it
179
+ introduces no retry ledger or second release authority.
180
+
181
+ Successful cutover enters `soaking` as soon as the canonical live Runtime observation proves the expected release/artifact identity is running, ready and non-stale. Cutover reconciliation does not rerun the expensive full verification suite after activation. Only the existing full verification + performance observation + recoverable release/SQLite/service bundle attestation may terminalize `known_good`. A definitive runaway-CPU rejection is an acceptance
182
+ failure, so Recovery executes the existing exact Stable A rollback transaction
183
+ instead of leaving Candidate B in `soaking` for repeated performance sampling.
184
+ Transient/unknown observations remain non-terminal and may be reconciled against
185
+ the same ReleaseSession. The state machine records redacted receipt ids and
186
+ summaries, never tokens, raw database payloads or browser messages.
187
+
188
+ ## Persistent-state contract
189
+
190
+ | State | Semantic owner / writer | Terminal & retention | Recovery |
191
+ | --- | --- | --- | --- |
192
+ | `runtime-incarnation.json` | Canonical Runtime ownership acquisition | latest epoch; superseded generations remain stale | next owner CAS-reconciles |
193
+ | Supervisor socket owner evidence | Canonical Runtime/Supervisor composition | deleted with socket; ephemeral | probe then remove only stale non-connectable socket |
194
+ | known-good bundle | Standalone Recovery | bounded live attestations; prune only after state commit | validate release + DB + service contract offline |
195
+ | RuntimeReleaseAuthority | Runtime Root physical release store | schema 2; active/previous release identity and previous SQLite backup only | physical publish/rollback; no release-phase or transaction intent |
196
+ | ReleaseSession | Release domain / stateless ReleaseCoordinator | wire schema 1 + current semantic epoch 2; `known_good`, `rolled_back`, `failed`; bounded session retention is physical cleanup | revision CAS resumes the same session; Recovery provider executes physical effects |
197
+ | Candidate B Home | ReleaseSession semantic authority / Recovery physical provider | explicit terminal cleanup only after evidence retention | no deletion/rebuild of A; B can be inspected independently |
198
+ | Process Runtime terminal lease | Process Runtime lease authority | terminal evidence and lease release are separate idempotent phases | terminal observation/wait/cancel and full maintenance retry exact lease release until settled |
199
+
200
+ All bundle and session data is local Controller state. It contains no secrets:
201
+ the service contract records a token *path*, while each B token is an independently generated private credential and is never copied from A. SQLite data follows the Controller Home's existing privacy/backup policy.
202
+
203
+ ## Verification
204
+
205
+ - Ordinary repository Work terminalizes at accepted source delivery and cannot depend on Runtime staging, activation, soak or known-good;
206
+ - release-level gates execute once for the frozen ReleaseSession candidate rather than once per contributing Work;
207
+ - Candidate lane derivation/build cannot mutate A; Candidate boot/restart touches only B's isolated service/Home;
208
+ - byte-identical release-tree identity is required for B→A promotion; no production rebuild is allowed;
209
+ - stale Runtime generation and release claims cannot write;
210
+ - every Recovery restart/release transition proves service, Runtime owner, TCP listener and Supervisor writer quiescence before authority may change;
211
+ - Recovery restart/cutover readiness polling is bounded to fenced Runtime identity plus local readiness; strict whole-Runtime verification remains a single post-Connector acceptance gate;
212
+ - the normal cutover prebuilds and hashes its rollback SQLite snapshot while Stable A is live and reuses it only when one SQLite-wide `data_version` observer proves no intervening commit; otherwise stopped-state backup remains the fail-closed fallback;
213
+ - rollback restores the cutover SQLite snapshot only when whole-snapshot SHA-256 matches a fresh live snapshot; any database-wide change preserves live SQLite, while `auditEventCount` remains compatibility/diagnostic evidence only;
214
+ - ReleaseSession captures exact rollback transaction identity immediately after the physical authority publish and before Candidate B starts;
215
+ - private writer environment cannot cross service or child boundaries;
216
+ - stale or missing known-good bundle material cannot protect a release;
217
+ - ReleaseSession cannot advance past static/candidate gates or a stale CAS;
218
+ - no-op automatic reconciliation does not fork a Recovery worker, and terminal source revisions are not autonomously replayed;
219
+ - definitive runaway-CPU rejection restores Stable A through the existing ReleaseSession rollback authority rather than repeating soak measurement;
220
+ - terminal Process observation and full maintenance both reconcile any exact leftover workspace lease; `completed_unknown` cannot permanently fence a checkout;
221
+ - final live release testing remains a separate, one-shot governed operation.
@@ -0,0 +1,62 @@
1
+ # Autonomous Work liveness invariant
2
+
3
+ Date: 2026-09-19
4
+ Status: accepted
5
+
6
+ ## Problem
7
+
8
+ Forge could retain a non-terminal Work indefinitely after its execution carrier and
9
+ Controller ownership disappeared. A current Plan protected that Work from stale
10
+ authority retirement, but nothing materialized the already-existing semantic
11
+ decision that the Work was ready to continue. The visible result was an unfinished
12
+ conversation/task with no process, no live Controller owner and no next round.
13
+
14
+ ## Decision
15
+
16
+ Global Scheduler's normal reconciliation cadence owns materialization, not semantic
17
+ planning.
18
+
19
+ For every active runnable Work with no active execution and no live Controller
20
+ owner:
21
+
22
+ 1. If the Work is Plan-bound, projectAutonomousGoalProgression() is the sole
23
+ authority deciding whether the current Work is WORK_READY_TO_CONTINUE.
24
+ 2. If the Work is not Plan-bound, reconciliation may perform only the lower-level
25
+ mechanical liveness wake when Work/Requirement/ControllerRound state contains
26
+ no terminal or explicit wait authority. It never invents Plan authority.
27
+ 3. Existing retained ControllerSession identity and ControllerBinding are reused.
28
+ A retained session is identity evidence, not a live ownership lease.
29
+ 4. ControllerRound remains the sole provider-effect fence. The progression
30
+ idempotency key, or a deterministic planless Work occurrence key, becomes the
31
+ occurrence identity, so repeated scheduler ticks converge rather than replay.
32
+ 5. If Workflow Supervisor owns the outer ChatGPT turn, Scheduler only ensures the
33
+ idempotent Supervisor enrollment effect. It must not dispatch a competing
34
+ provider prompt.
35
+ 6. Existing semantic wait, wait_for_user, blocked/failed round state, live
36
+ execution, live Controller ownership and terminal Work/Requirement state all
37
+ suppress automatic continuation.
38
+
39
+ No new lifecycle state, watchdog table, polling daemon, retry authority or
40
+ Process-specific continuation path is introduced.
41
+
42
+ ## Baseline boundary
43
+
44
+ Liveness reconciliation does not re-check the repository integration baseline in
45
+ the middle of an already-running isolated Work. For Plan-bound Work it evaluates
46
+ Goal Progression against the Plan's frozen source revision. Baseline drift remains
47
+ an admission/replan boundary after the independent Work reaches its semantic
48
+ boundary; it is not a reason to repeatedly interrupt execution.
49
+
50
+ ## Recovery boundary
51
+
52
+ The existing periodic stalled-ControllerRound recovery remains responsible for
53
+ already-open rounds whose provider dispatch or closure was abandoned. The new
54
+ normal reconciliation path handles the previously invisible case where no round
55
+ exists at all.
56
+
57
+ ## Acceptance
58
+
59
+ A runnable ownerless Work converges to exactly one existing Controller continuation
60
+ authority within the normal Scheduler reconciliation cadence. Repeated ticks and
61
+ runtime re-entry cannot duplicate provider dispatch, and explicit waits remain
62
+ stable.
@@ -0,0 +1,72 @@
1
+ # Thin semantic working context and revision authority
2
+
3
+ Status: accepted architecture; canonical cutover is implemented in current source with final verification pending. Frozen-client compatibility projections remain where required.
4
+
5
+ ## Decision
6
+
7
+ Forge exposes only three cross-domain model-authored semantic records: Requirement, Plan, and optional Work. Requirement is stable intent, Plan is model-authored strategy/decisions/progress, and Work is an independently resumable semantic unit. Workflow, Schedule, Connection/Grant, Process, ControllerRound, repository state, and domain handles remain operational, security, execution, or domain facts rather than additional working-memory authorities.
8
+
9
+ Each semantic record has one stable identity, one portable semantic scope and one monotonic semantic revision. ForgeInstance is the root authority; repository/checkout identity is execution placement or optional domain context, never synthetic semantic ownership. Model-facing writes use expected-revision compare-and-swap. A stale write fails with the current semantic record/revision and never silently merges. The append-only requirement_revision, plan_semantic_revision, and work_semantic_revision records are immutable history evidence, not independently mutable authorities; Controller storage revisions remain internal persistence concurrency metadata.
10
+
11
+ Plan semanticContext is the model-facing semantic authority once present. Legacy PlanContract goal/step/lifecycle fields remain migration/execution compatibility data and cannot implicitly rewrite semanticContext. Requirement/source basis revisions are provenance and staleness hints only. Source movement is observed at concrete mutation boundaries and does not make Plan working memory an execution gate. Thin Plan `scopeKey` is descriptive discovery/lineage metadata only, never an ownership mutex; current model-facing replanning revises the same stable Plan id rather than superseding it.
12
+
13
+ New Work records materialize semanticState from creation. Mechanical Work status, phase, verification, review, delivery, cleanup, provider, recovery, and completion receipts do not rewrite semanticState. Pre-semantic legacy Work may infer an initial semantic state from its historical terminal status until its first semantic revision; that revision materializes the state and ends the fallback. Work resultRefs are model/user-selected references only. Mechanical completion and check receipts are exposed separately.
14
+
15
+ ResumeContext is a derived read bundle assembled on demand from the latest relevant semantic records plus current source/resource facts, unresolved human requests, active durable handles, and pertinent receipts. It is never persisted as a fourth aggregate, and conversation text or projection caches are never authority.
16
+
17
+ ## Concurrency and migration boundary
18
+
19
+ Semantic CAS protects authored context. Git/worktree, Process/resource leases, authorization grants, effect identities, and other concrete fences protect the resources they actually own. Verification is Work-bound evidence and is never gated by a Work-wide ControllerSession claim; durable checks are admitted by the Work's declared check set and then fenced by immutable execution identity plus Process Runtime resource claims. A semantic revision must be applied to the latest persisted aggregate inside the same storage transaction so a concurrent mechanical update cannot be overwritten merely because the semantic revision did not change.
20
+
21
+ The source still contains legacy Requirement waiting/continue, Plan approval/PlanStep/supersession data, Work finalization, and ControllerRound machinery for frozen-client compatibility and historical delivery continuity. These mechanisms are not current model-facing semantic authorities and cannot be consulted as semantic-write gates. `plan_approve` and `plan_accept_step` are compatibility no-ops; Work completion, verification, review, and terminal state never claim, complete, release, or reopen Plan item state. ControllerRound identity may fence the frozen transport/resume envelope but cannot authorize Requirement/Plan/Work semantic writes, and a frozen client may carry that exact authority through the bounded `session_id` compatibility carrier as long as the canonical principal/Work/round comparison still decides the claim.
22
+
23
+ Plan items are now authored working memory with no execution authority at all. No active path records a Plan item Work link, promotes item status, requires Plan approval/acceptance, or selects a successor from Plan dependencies: Work start/continue/completion read Plan and Plan item references as provenance only, and `plan.step.retry:<workId>` is a read-only compatibility report. Predecessor obligation continuity, Plan-source drift and Plan-finalization no longer gate Plan admission, Revision, Work execution or Requirement completion. Legacy `PlanContract.steps`/status/obligation fields remain migration-readable data; the retired PlanStep execution plane, obligation-continuity enforcement, Plan-bound Work refresh/retirement helpers and the PlanStep progression projector are deleted, and the architecture check forbids reintroducing them.
24
+
25
+ No Runtime/Recovery release transition is part of this decision.
26
+
27
+ ## Thin capability substrate consolidation (2026-09-24)
28
+
29
+ ### 0. Execution target and host-local command lane (2026-09-26, Slice 2 partial)
30
+
31
+ - `ProcessScope` is the canonical Process/Operation storage scope. Repository placement is optional context; the ForgeInstance scope is a sibling partition (`<controllerHome>/instance`) so a non-repository process never needs a synthetic repository identity.
32
+ - The Process Runtime owns an instance-level handle index (`process_handle_index`) recording processId -> target (`forge_instance` | `repository`) -> principal. Attachment resolves its target from the handle, never by scanning repositories or replaying placement inputs.
33
+ - `process_get`/`process_wait`/`process_logs`/`process_cancel` are addressed by `process_id`. An explicit `repo_id` is still accepted and validated against the recorded target.
34
+ - Instance-level handles are principal-bound and ForgeInstance-bound: an opaque handle id locates a record and never authorizes attachment on its own.
35
+ - `process_exec` is the canonical host-local command lane: the target is the serving ForgeInstance, `cwd` is an execution argument, and neither a repository nor a Work is required. It never parses command text to prove path safety; narrow path/repository guarantees remain with typed filesystem/source/git capabilities.
36
+ - Host process execution requires one explicit canonical Grant for `process:exec` whose typed target is the exact ForgeInstance. Missing instance identity, principal, or grant fails closed with no fallback host, container, or checkout.
37
+ - Distinct-by-design from the narrow typed `local_system` plugin lane: `execute_command` is a bounded, target-grant-scoped, typed-argv action whose path operands must stay inside a registered workspace target, while `process_exec` is the deliberately broad raw host capability with no path sandbox and a process handle. Consolidating the two into one owner (or retiring the narrow lane's command action) is an explicit open obligation of this slice, not a settled decision.
38
+ - Already satisfied (reconciled 2026-09-26, source evidence only): a Work-bound repository command defaults cwd to the resolved Work/checkout identity and an authorized explicit cwd outside it is served by the host lane; `git worktree remove` already resolves the owning repository/checkout (`selectTerminalCleanupTarget`) and never selects the removed target checkout as current; `process_get`/`process_wait`/`process_logs`/`process_cancel` resolve by handle with `repo_id` optional.
39
+ - Done — semantic storage identity (Slice 1 remainder): Requirement was already ForgeInstance-scoped (`scope: 'controller'`). Plan is repository-optional: `PlanContract.repoId` (and its revision/summary/input carriers) is optional provenance, `PlanContractStoreLocation` accepts a portable `scopeKey` (`semantic` is the reserved ForgeInstance scope, mirroring the workspace/instance partitions), and `plan_create` with zero enabled repositories creates the Plan in that scope — one repository stays authoritative, several keep the explicit ambiguity error. Plan and Work were already resolvable by stable id across scopes without a repository (`findControlPlaneRecordsByKey`). Work remains repository-bound on purpose: its execution semantics (WorkHandle, leases, checkout/delivery) have no meaning without a target, so its `repoId` is not a fake identity. `rh_status` is now instance-scoped: with zero or several repositories the summary resolves no repository target, reports `repositoryContext: null`, keeps runtime/tool-surface/source-coherence readiness, lists active Plans from the semantic scope, reports Work/handoff sections as unavailable rather than inventing a repository, downgrades `detail_level: detail` to the instance summary (reporting `requestedDetailLevel`), and fails closed with `REPOSITORY_CONTEXT_REQUIRED_FOR_REPAIR`/`..._FOR_DETAIL` only where repository context is genuinely required. `rh_inbox` (legacy Handoff) stays repository-scoped until Slice 7 replaces it with UserRequest.
40
+ - Done — ephemeral workspace scope and typed command target: `workspace_*` is a reserved workspace scope key (`controller-home.ts` `WORKSPACE_SCOPE_PREFIX`/`scopedOperationRoot`). An arbitrary workspace is now a `RepositoryCommandScopeTarget` (`workspaceScopeKey` + root + workspace checkout coordinate) instead of a fabricated `RepositoryRecord`; `resolveEphemeralWorkspaceTarget` no longer builds a repository record. Process/Operation records, lightweight receipts, logs, GC, handle-index targets, command audit, git-command audit, access policy, approval requests, work-handle mirrors and execution leases for a workspace target live in `<controllerHome>/workspaces/<workspaceId>`, and attachment resolves by handle or by the workspace id. Repository and `__controller__` scopes keep their established roots and payload fields byte-for-byte; repository-semantic checks (bound-session mutation, default-branch delivery, work-handle authority, `repositoryGitStatus`) now run only when a repository target exists. Workspace preview/execute payloads report `scopeId` + `workspace` and never a `repoId`. Bounded read-only fallbacks still resolve facts written to the old repository location (process records, lightweight receipts, access policy, approval requests). Residual: `ResolvedExecutionIdentity.repositoryId` still carries the workspace scope key as its required field name, and the controller lock scope key for a workspace is still spelled `{ scope: 'repository', repoId }`; both are naming/typing debt rather than repository identity or repository storage. Repository-semantic behavior for a workspace target (mutation authority, delivery guards) is now explicitly "not applicable" rather than evaluated against a fabricated repository.
41
+ - Open obligation — Grant target matching: exact matching with explicit wildcard only is blocked by `PluginCapabilityAuthorizationGrant.repoId` and `target.identityFingerprint` being optional while plugin queries always normalize `repoId`. Making matching exact requires migrating the stored plugin grants and the query normalization together; tightening only `grant-store.ts` would deny live plugin capabilities.
42
+ - Still open in this slice: generalizing the durable Process/result/artifact/evidence stores to domain-handle scope, making `repository_command_execute` a translation-only facade over the host lane, and the instance-scoped recovery *apply* split (its audit record and several repository-repair actions still require RepositoryContext).
43
+
44
+ ### 1. Mode-free capability surface
45
+ - Capabilities (`read`, `search`, `edit`, `command`, `process`, `git`, `workspace`, `browser`, `computer`, `plugin`, `API`, `agent`, `schedule`, `release`, `recovery`) remain domain-shaped public capabilities and compose without mandatory Requirement, Plan, Work, task-size thresholds, or mode tokens.
46
+ - Shared invocation conventions are deliberately small: principal/target, typed arguments, optional expected revision, timeout/cancellation, idempotency token, and result or typed handle.
47
+ - A direct task may acquire Work durability later by attaching existing semantic refs/handles/receipts without replaying prior effects.
48
+
49
+ ### 2. Mechanical authority consolidation
50
+ - Canonical `Grant` is the single authorization fact for principal + capability/action set + target/resource scope + constraints + expiry/revocation. Plugin authorization reads/revokes/reconciles canonical Grant first; the old plugin grant JSON is migration seed/compatibility projection only. Repository ID is optional locator metadata, not mandatory scope.
51
+ - `OwnedResource` records Forge-created worktrees/branches and cleanup provenance. Creating/recovering a managed workspace records ownership; cleanup receipts settle that ownership idempotently.
52
+ - Optimistic CAS and native Git/OS conflict semantics are default; short exclusive claims exist only for concrete shared mutable resources (Git refs/index, release promotion, physical input, mutable provider target).
53
+ - Work is not a mutex. ControllerSession/ControllerRound remains only where transport, external-effect, or destructive resource fencing needs an exact mechanical identity; it is not a semantic mutation lock.
54
+
55
+ ### 3. Continuity, schedule, and user requests
56
+ - Open Work is durable context, not an autonomous execution loop instruction.
57
+ - `ScheduleDefinition` (authored trigger, target, policy, action, stop conditions, enabled) is split from `ScheduleRuntimeState` (lastTriggeredAt, consecutiveFailures, nextEligibleAt, occurrences, observation data). Scheduler records triggers, timing, bounded backoff and dispatch facts; internal watcher/provider failures do not manufacture human Handoffs.
58
+ - `UserActionRequest` / `UserDecisionRequest` is the canonical person-only blocker/decision authority and coalesces repeated occurrences by rootCauseKey. Legacy Handoff is written only as a compatibility/UI projection after the UserRequest exists.
59
+ - A Schedule occurrence is continuation input, not a human blocker: semantic/model-owned schedules record trigger, decision and occurrence identity without manufacturing Handoff/UserRequest state.
60
+ - Workflow Supervisor observes outstanding external-turn effects and may reserve one exactly-once provider resume for an applied-but-uncompleted effect. It does not own recursive provider retry depth or Scheduler retry policy.
61
+
62
+ ### 4. Completion vs release/recovery
63
+ - `work_complete` records only the model/user semantic decision and result references. Source integration, git merge, publication, release activation, and resource cleanup are separate capabilities/effects.
64
+ - `finalize`, `verify`, `review`, `controller_claim`, controller disposition/release, and plan approval/step-acceptance are not Work operations. After Runtime/Connector rollover they are rejected rather than translated.
65
+ - Pre-cutover `work_finalize` Worker payloads and review-candidate preparation are hard-rejected as well; a restart cannot replay them. Typed repository execution owns Git effects directly.
66
+ - Periodic cleanup does not treat semantic `completed`/`cancelled` as deletion authorization. A dirty managed worktree is retained in place; cleanup never auto-commits, archives, discards, or force-removes uncommitted bytes merely because Work became terminal.
67
+ - Cleanup debt is derived from owned-resource facts, acts only on resources proven Forge-owned, and is retryable/idempotent independently of Work completion.
68
+
69
+ ### 5. Compatibility surface and projections
70
+ - There is no frozen lifecycle envelope after the cutover. Clients reconnect to the current MCP schema and use explicit semantic CAS operations.
71
+ - Deprecated route/work-mode/operational-plan surfaces are compatibility projections only. They may report concrete continuity/placement needs and available capabilities, but must not prescribe task-size modes, worker choice, validation policy, review lifecycle, or next engineering method.
72
+ - Activity/status/Handoff/legacy PlanStep data are derived or compatibility views. A stale projection is repairable cache debt, never a reason to reject a canonical semantic CAS or concrete resource/effect operation.
@@ -0,0 +1,237 @@
1
+ # Supervisor owns the enrolled prompt chain
2
+
3
+ Status: accepted implementation contract for the autonomous-continuation candidate.
4
+
5
+ ## Decision
6
+
7
+ An explicitly enrolled logical conversation is a durable task. Workflow Supervisor
8
+ monitors its exact provider effect, commits the model's structured receipt, and
9
+ reserves the next fixed prompt for CONTINUE. DONE and NEEDS_USER retain their
10
+ configured semantic validators; STOPPED remains explicit operator authority.
11
+
12
+ The first Work-bound enrollment still requires authenticated launcher admission,
13
+ canonical Work lookup and a prepared ControllerRound. Before consulting that lower
14
+ admission gate, the Runtime checks whether the exact conversation already has a
15
+ Supervisor task. Once enrolled, that existing task/effect/completion journal is the
16
+ only cross-turn authority and is reused even if its original ControllerRound is now
17
+ closed, exhausted or absent. Neither Work absence/turnover nor ControllerRound
18
+ status/budget is a second gate on a committed CONTINUE. Supervisor must not manufacture Controller claims,
19
+ release another owner's lease, rotate round authority, or rearm lower budgets to
20
+ make an outer prompt runnable. Normal MCP execution still enforces principal,
21
+ Controller ownership, Work scope, resource and write fences independently.
22
+ The enrollment compatibility receipt may settle only its exact origin Work and
23
+ provider effect. A newer Requirement relay is never a substitute receipt target.
24
+
25
+ Explicit Requirement cancellation revokes new sends for that Goal; Work carrier
26
+ cancellation alone does not. An explicit Work conversation rebind fences new sends to the predecessor
27
+ conversation at dispatch admission. Already-started effects remain observable
28
+ on their original exact conversation: unknown never authorizes resend. New task
29
+ registration retains the initial Work id as provenance even for Requirement
30
+ contracts. Existing Work-named tasks provide the same provenance from their
31
+ registered identity. Legacy Requirement-only tasks retain their registered
32
+ conversation; no newest Requirement relay is selected as their transport owner.
33
+
34
+ Scheduler liveness discovers existing relay references as well as repo Work
35
+ projections and resolves them through canonical getWorkContract. A missing list
36
+ entry is not deletion. A genuinely missing Work never implies completion or
37
+ authorizes retiring an unresolved provider effect. This candidate does not add
38
+ orphan deletion, a new relay index, or a second cleanup lifecycle.
39
+
40
+ ## Cross-cutting closure
41
+
42
+ | Area | Existing owner and candidate behavior |
43
+ | --- | --- |
44
+ | Identity / scope | Exact enrolled task + conversation + causal effect; Work is execution context. |
45
+ | Authority / authorization | Supervisor owns prompts; authenticated MCP and Controller own repository mutations. No lease or capability is synthesized by receipt processing. |
46
+ | Concurrency / fencing | Existing effect dispatch transaction, unique causal successor, Runtime write claim and provider lane remain. Rebind is checked again at dispatch admission. |
47
+ | Persistence / replay | Existing Supervisor SQLite schema and append-only event journal; every nonterminal task must mechanically derive one causal obligation (unapplied effect, applied effect awaiting completion, or committed completion awaiting successor/terminal settlement). Restart reconciliation repairs the same obligation without a new table, enum or writer. |
48
+ | Unknown / recovery | Existing bounded provider attempts and independently spaced unknown observations. Retired Work does not suppress read-only effect reconciliation. |
49
+ | Lifecycle / retention | Supervisor terminal receipts/operator stop own task termination; existing retention/backup policies remain. Missing Work is not semantic terminality. |
50
+ | Evidence / privacy | Existing causal completion hashes, allowlisted provider evidence and redaction; no page-body persistence added. |
51
+ | Capacity / time / performance | Existing send lane, bounded scanner and observation budgets. Provider-wide inventory/backpressure may delay the consumer globally; exact-conversation target failures are task-local and cannot back off unrelated Supervisor tasks. |
52
+ | Topology / portability | Same in-process Runtime/Supervisor owner and native Browser adapter; no process, credential flow or platform dependency added. |
53
+ | Release / rollback | ReleaseSession verifies isolated Candidate B, then cutover retains rollback authority during soak. The new Stable release cannot become known-good until the Supervisor ledger proves exact-active-release CONTINUE → CONTINUE → DONE across a Runtime reconnect. No component activation or manual live database repair. |
54
+
55
+ ## Predecessor obligations
56
+
57
+ | Previous obligation | Disposition | Successor location |
58
+ | --- | --- | --- |
59
+ | 20260916 Supervisor authority: exact conversation, model receipt, fixed prompts, semantic validators | KEEP | Supervisor control-plane/protocol/store and forge-validators. |
60
+ | Restart-safe effects, no unknown resend, bounded recovery | KEEP | Existing Supervisor effect journal and Browser adapter. |
61
+ | 20261001 ambiguous-send reconciliation: observer snapshots never authorize provider mutation | KEEP | 19147d69 remains the candidate baseline; native reconciliation stays read-only. |
62
+ | Lower ControllerRound continuation/provider authority | CHANGE | Initial admission/direct non-ChatGPT effects remain Controller-owned; enrolled ChatGPT continuation belongs exclusively to Supervisor. |
63
+ | 20260919 autonomous Work liveness and same-occurrence recovery | CHANGE | Scheduler canonical lookup of relay-referenced semantic Work; subsequent prompt-chain repair stays in Supervisor. |
64
+ | Explicit successor lineage/conversation inheritance | KEEP | Existing typed Work lineage and explicit binding API; outer task/effect identity does not change with a Work carrier. |
65
+ | Real unattended restart, multiple CONTINUE, DONE/NEEDS_USER canary | KEEP | Existing focused scenarios, process-restart smoke and release-bound live continuation proof; candidate is not complete before that evidence. |
66
+
67
+ ## Verification
68
+
69
+ Retained scenarios must prove causal CONTINUE successor idempotency through
70
+ lower budget exhaustion without mutating the lower round, exact-conversation
71
+ rebind fences, observation of old started effects, semantic Work discovery,
72
+ the automation receipt successor baseline, bounded retry/unknown behavior and
73
+ process restart. Compiler and canonical architecture gates precede deployment.
74
+ Live acceptance requires a real enrolled conversation advancing multiple turns
75
+ without human continuation and a validated terminal receipt.
76
+
77
+ The native consumer must accept a causally completed tool-only turn even when
78
+ ChatGPT renders no assistant prose and its last visible message role is user.
79
+ Provider generation and cooldown still delay a new send, and dispatch admission
80
+ still verifies the exact source effect. Browser resources have the disposable
81
+ lifecycle defined below; task/effect history survives resource retirement.
82
+ A real b388b27c canary exposed
83
+ these consumer gaps after its first persisted CONTINUE, so source gates alone
84
+ did not establish unattended continuation acceptance.
85
+
86
+ ## Timely consumption under observation backlog
87
+
88
+ The native consumer refreshes the canonical pending-send projection between
89
+ individual read-only tab inspections, including within bootstrap unknown-effect
90
+ inventory walks. At most one send is serviced at each checkpoint; least-recently
91
+ checked eligible effects receive the next opportunity. Busy/cooldown checks are
92
+ spaced by the existing active tick. Observation resumes after that opportunity,
93
+ so fresh sends cannot starve it and a full historical scan cannot hold a new
94
+ CONTINUE until the next pass. This is serial cooperative scheduling within the
95
+ same Runtime owner; its timestamps are ephemeral fairness hints, never dispatch
96
+ authority. Existing bounded native calls and admitted provider dispatches finish
97
+ before the next checkpoint; no operation is abandoned or allowed to race a
98
+ second writer. Unknown observation spacing/budgets, durable dispatch CAS,
99
+ source-completion validation and the shared provider lane remain authoritative.
100
+
101
+ Live acceptance also records completion-to-successor dispatch latency under
102
+ existing Browser backlog. An eventual CONTINUE/CONTINUE/DONE chain alone does
103
+ not establish timely continuation. The previous 5a6fc9cb canary's 688,144 ms
104
+ second-successor delay is failed timing evidence and remains in the incident
105
+ record; it must not be erased or relabeled as successful timing acceptance.
106
+
107
+ ## Disposable browser resources
108
+
109
+ The existing native Supervisor consumer owns tab retention and restoration.
110
+ When browser work is suspended by durable cooldown or unknown-observation
111
+ spacing, it may close its created canonical tab only after a readable snapshot
112
+ proves that no provider generation is running. An unbound bootstrap's sole
113
+ observation resource remains until binding or explicit task termination.
114
+ An applied effect awaiting its model receipt remains eligible for observation.
115
+ DONE, NEEDS_USER and explicit STOPPED retire owned resources; after restart the
116
+ same owner reconstructs ownership from exact task identity and window.name.
117
+ An adopted user tab loses only the Supervisor marker and stays open.
118
+
119
+ When delivery or read-only observation is due, complete supported-browser
120
+ inventory must prove the exact enrolled conversation absent before the owner
121
+ opens its persisted conversation URL. An unreadable inventory, foreign owner,
122
+ ambiguous exact candidate or unresolved resource close fails closed. At most one
123
+ restoration per conversation is attempted in a consumer pass, with existing
124
+ transport backoff after failure. Reopening a tab neither creates a ChatGPT
125
+ conversation nor changes provider effect admission, generation or outcome.
126
+ Outcome unknown is still read-only and never authorizes resend. No persistent
127
+ state, extra lifecycle owner, schema or provider retry policy is added.
128
+
129
+ The operator's three-goal consolidation explicitly stops historical duplicate
130
+ tasks through the Supervisor API. It does not infer completion, clear effects,
131
+ cancel another execution owner's claim or delete ControllerRound authority.
132
+
133
+ Project discovery attributes a conversation to a project page only when its
134
+ canonical route carries the same project id. Sidebar presence is not project
135
+ membership. The existing discovery store validates both incoming and retained
136
+ metadata against that route, including projects whose URLs omit a title slug;
137
+ a conflicting observation cannot displace a proven title from another source.
138
+ Discovery remains observation, never task enrollment or dispatch authority.
139
+
140
+ ## Provider observation and explicit recovery (20261002)
141
+
142
+ The same native consumer reads the visible hydrated conversation surface.
143
+ Hidden server-rendered copies, profile loading and unrelated page busy markers
144
+ are not provider activity. Current-turn reasoning/tool text contributes only to
145
+ the existing activity digest, even before an assistant role message exists.
146
+ Current provider status regions include localized disconnect/delivery-timeout
147
+ messages. A status region is evidence; arbitrary chat prose is not.
148
+
149
+ A reserved recovery remains authorized across consumer passes and provider
150
+ cooldown, but never authorizes stopping a live turn. Unchanged reasoning/tool
151
+ activity and local wait expiry do not prove provider termination. A latest user
152
+ role without a settled assistant remains unresolved even if the Stop button is
153
+ absent. Only a settled idle assistant or explicit provider failure admits the
154
+ existing bounded recovery; a resumed live provider delays its dispatch. The
155
+ original applied prompt is never replayed. A dispatch function returning
156
+ without clicking Send supplies a dispatch-owner negative proof. Browser observers
157
+ still cannot turn absence or a transport exception into that proof.
158
+
159
+ After bounded automatic recovery stops, an explicit user recovery may reserve
160
+ one causally keyed recovery of the current applied leaf. The local operator RPC
161
+ requires exact task/source effect, a request id and reason; Native Messaging has
162
+ no access to it. Duplicate calls reuse the same recovery. Existing exhausted
163
+ events, provider generations and task/conversation identity are retained; the
164
+ new recovery itself cannot recursively auto-recover. No schema, enum, process,
165
+ readiness authority or recovery owner is added. Existing terminal states remain
166
+ terminal and an unresolved unknown effect blocks this operation.
167
+
168
+ Bounded migration exception: the pre-20261002 native adapter recorded its own
169
+ returned pre-click failures as unknown. Explicit recovery may reconstruct a
170
+ negative proof only from the current dispatch's persisted native pre-send reason,
171
+ never a browser snapshot or generic exception. Remove this reader after those
172
+ historical effects reconcile; new producers write the negative proof directly.
173
+ The same whole-Runtime release/rollback and existing Supervisor retention apply.
174
+
175
+ ## Productive turns and frozen tool context (20261002)
176
+
177
+ Every newly rendered Supervisor prompt includes the existing `@forge` tool
178
+ invocation used by the ordinary ChatGPT delivery adapter. Normal continuations
179
+ retain conversation context instead of repeating the full historical objective,
180
+ and ask for the next unfinished product change or acceptance check. Unchanged
181
+ infrastructure summaries do not satisfy a work checkpoint.
182
+ Normal turns carry the existing registered repository identity and name the
183
+ direct read/edit/command/check tools. An explicitly registered checkout is carried
184
+ with that identity, so concurrent platform tasks do not follow one mutable
185
+ repository default. This is execution context, not checkout allocation or an
186
+ authorization bypass; domain tools still validate the selected checkout and fences.
187
+ Existing registration may fill this hint only once when it was initially absent
188
+ and every task/conversation/repository/objective/policy/semantic obligation is
189
+ unchanged. The existing Store transaction is the sole writer; conflicting
190
+ checkout selections fail. One diagnostic event in the existing journal records
191
+ the selected ids; retries of the original registration retain the selected hint.
192
+ No schema, lifecycle enum, RPC, process or alternate routing
193
+ authority is added. Effect prompts, unknowns, budgets and completion history are
194
+ untouched; existing retention, backup and whole-Runtime rollback still apply.
195
+ Semantic Work records are not execution.
196
+ Retrieval readiness describes bounded evidence gaps; the model resolves relevant
197
+ gaps and owns semantic sufficiency. It is not a second authorization/approval gate.
198
+ Missing implementation requires a scoped architecture decision and implementation,
199
+ rather than repeated substrate discovery. This adds prompt context only, with no
200
+ dispatch authority, schema, lifecycle or heuristic productivity gate.
201
+ Model judgment owns
202
+ which coherent wave advances the authorized objective; no keyword/count/score
203
+ gate, claim bypass, forced code mutation or automatic goal completion is added.
204
+ Context materialization owns bounded, redacted source bytes and their line/hash/
205
+ truncation metadata; the MCP facade must preserve them together. Explicit code
206
+ needles retain lexical coverage even when fuzzy structural candidates fill the
207
+ discovery budget. Existing current-turn provider status also recognizes analysis
208
+ paused as unavailable response delivery, retaining outcome-unknown classification
209
+ and the same single bounded resume. A live generating surface still blocks Send.
210
+ The read-only Work continuation projection directs open Work toward its next
211
+ authorized scoped step rather than prescribing a retired model-facing claim
212
+ operation. Existing execution admission and writer/resource fences still apply.
213
+
214
+ Newly rendered Supervisor prompts use the typed outer automation metadata already
215
+ present on Forge tools: exact `automation_task_id`,
216
+ `automation_type=autonomous_continuation`, and `automation_status`. Intermediate
217
+ calls use `working`; the final Forge call for the turn uses `continue`, `done` or
218
+ `needs_user`. Receipt processing still derives the exact source effect from the
219
+ canonical Supervisor task and reserves the successor transactionally; tool payloads
220
+ do not choose another task/effect/conversation. The historical
221
+ `rh_work repair` / `automation.receipt:*` parser remains a bounded migration reader
222
+ only for prompts already issued before cutover and must not be used by new prompt
223
+ producers or become a second replay authority.
224
+
225
+ An explicitly launched child ChatGPT Work already goes through
226
+ `ensureWorkflowSupervisorEnrollmentForWork`: a distinct canonical conversation
227
+ gets its own existing task/effect journal, while a reused conversation returns
228
+ its original owner. Subsequent turns and accepted termination use the same
229
+ Supervisor and disposable tab cleanup. Prompt guidance requires enrollment
230
+ before a handoff; it does not create child conversations or a second parent
231
+ lifecycle. Existing typed Work relations carry decomposition when needed.
232
+
233
+ Verification extends retained compatibility, provider-wait and continuation
234
+ scenarios. Whole-Runtime activation follows canonical gates; actual productive
235
+ successive turns remain separate live acceptance evidence. Original exhausted
236
+ records are preserved and may only receive the existing explicit operator
237
+ recovery after the exact provider turn is proven settled or failed.