@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
@@ -14,13 +14,6 @@ export type PolicySideEffect =
14
14
  | 'destructive_remote'
15
15
  | 'raw_secret_config';
16
16
 
17
- export interface DirectEditBoundary {
18
- scopeClear: boolean;
19
- maxChangedFiles?: number;
20
- maxChangedLines?: number;
21
- pathsExplicit?: boolean;
22
- }
23
-
24
17
  export interface PolicyGateInput {
25
18
  capability?: CapabilityDescriptor;
26
19
  capabilityId?: string;
@@ -29,7 +22,6 @@ export interface PolicyGateInput {
29
22
  accessMode?: AccessMode;
30
23
  approvalConfirmed?: boolean;
31
24
  dryRun?: boolean;
32
- directEditBoundary?: DirectEditBoundary;
33
25
  }
34
26
 
35
27
  function approvalAction(reason: string, capabilityId?: string): SuggestedNextAction {
@@ -62,11 +54,6 @@ function accessEffectFromSideEffect(sideEffect: PolicySideEffect): AccessEffect
62
54
  return 'secret_access';
63
55
  }
64
56
 
65
- function directEditWithinBoundary(boundary: DirectEditBoundary | undefined): boolean {
66
- if (!boundary) return false;
67
- return boundary.scopeClear && boundary.pathsExplicit === true && (boundary.maxChangedFiles ?? 99) <= 3 && (boundary.maxChangedLines ?? 9999) <= 200;
68
- }
69
-
70
57
  export function evaluatePolicyGate(input: PolicyGateInput): PolicyDecision {
71
58
  const capabilityId = input.capability?.capabilityId ?? input.capabilityId;
72
59
  const risk = input.risk ?? input.capability?.risk;
@@ -108,16 +95,6 @@ export function evaluatePolicyGate(input: PolicyGateInput): PolicyDecision {
108
95
  };
109
96
  }
110
97
 
111
- if (sideEffect === 'local_repo_write' && directEditWithinBoundary(input.directEditBoundary)) {
112
- return {
113
- decision: 'allowed',
114
- reason: 'Bounded direct edit is within the lightweight Direct Control policy boundary.',
115
- capabilityId,
116
- warnings,
117
- suggestedNextActions: [],
118
- };
119
- }
120
-
121
98
  if (input.approvalConfirmed) {
122
99
  return {
123
100
  decision: 'allowed',
@@ -1,5 +1,4 @@
1
1
  import type { AccessMode } from '../governance/access-policy';
2
- import type { RouteDecision } from '../routing/route-policy';
3
2
  import { createWorkContract, executionPlacementForWork, getWorkContract, updateWorkContract, type WorkContractStoreOptions } from '../../../../packages/kernel/work/api/index';
4
3
  import { executionPlacement, readForgeInstanceIdentity } from '../../../../packages/kernel/identity/api/index';
5
4
  import type { WorkContract } from './types';
@@ -18,12 +17,15 @@ export interface PreparedRepositoryWorkAdmissionInput {
18
17
  repoId: string;
19
18
  objective: string;
20
19
  acceptanceCriteria: string[];
21
- allowedPaths: string[];
22
20
  checks: string[];
23
21
  accessMode: AccessMode;
24
22
  isolated: boolean;
25
23
  requestedBy: WorkContract['requestedBy'];
26
24
  requestId: string;
25
+ /** Legacy ingress-only path hints; concrete mutation scope is EditSession-owned. */
26
+ allowedPaths?: string[];
27
+ /** Legacy ingress-only path hints; concrete mutation scope is EditSession-owned. */
28
+ forbiddenPaths?: string[];
27
29
  }
28
30
 
29
31
  /**
@@ -39,17 +41,12 @@ export function admitPreparedRepositoryWorkContract(
39
41
  workId: input.workId,
40
42
  repoId: input.repoId,
41
43
  executionPlacement: repositoryExecutionPlacement(store, input.repoId),
42
- mode: input.isolated ? 'goal_workloop' : 'direct_control',
43
44
  objective: input.objective,
44
45
  acceptanceCriteria: input.acceptanceCriteria,
45
- allowedPaths: input.allowedPaths,
46
- forbiddenPaths: [],
47
46
  checks: input.checks,
48
47
  constraints: {
49
48
  accessMode: input.accessMode,
50
49
  workspaceMode: input.isolated ? 'isolated' : 'current',
51
- requireWorktree: input.isolated,
52
- directMainProhibited: input.isolated,
53
50
  allowCommit: true,
54
51
  allowMerge: true,
55
52
  allowCleanup: true,
@@ -71,27 +68,26 @@ export interface DirectEditWorkAdmissionInput {
71
68
  controllerInstanceId?: string;
72
69
  baseRevision?: string;
73
70
  workspaceFingerprint: string;
74
- routeDecision: RouteDecision;
75
71
  objective: string;
76
72
  issueId?: string;
77
73
  taskId?: string;
78
- allowedPaths: string[];
79
74
  checks: string[];
80
75
  requestedBy: WorkContract['requestedBy'];
76
+ /** Legacy ingress-only path hints; concrete mutation scope is EditSession-owned. */
77
+ allowedPaths?: string[];
78
+ /** Legacy ingress-only path hints; concrete mutation scope is EditSession-owned. */
79
+ forbiddenPaths?: string[];
81
80
  }
82
81
 
83
82
  /**
84
83
  * Canonical compatibility admission for an Edit Session bound to Direct Work.
85
- * The caller supplies the canonical Route Policy decision as evidence; this
86
- * boundary rejects any decision that requires isolation or a non-direct lane.
84
+ * Direct-edit admission is selected explicitly by this capability boundary;
85
+ * no route/mode token authorizes or rejects the operation.
87
86
  */
88
87
  export function admitDirectEditWorkContract(
89
88
  store: WorkContractStoreOptions,
90
89
  input: DirectEditWorkAdmissionInput,
91
90
  ): WorkContract {
92
- if (input.routeDecision.executionMode !== 'direct_control' || input.routeDecision.requiresIsolation) {
93
- throw new Error('DIRECT_EDIT_WORK_ROUTE_CONFLICT: canonical Route Policy does not permit Direct Control');
94
- }
95
91
  return createWorkContract(store, {
96
92
  workId: input.workId,
97
93
  repoId: input.repoId,
@@ -101,20 +97,15 @@ export function admitDirectEditWorkContract(
101
97
  controllerInstanceId: input.controllerInstanceId,
102
98
  baseRevision: input.baseRevision,
103
99
  workspaceFingerprint: input.workspaceFingerprint,
104
- routeDecisionFingerprint: input.routeDecision.inputFingerprint,
105
- routeDecision: input.routeDecision,
106
- mode: 'direct_control',
107
100
  objective: input.objective,
108
101
  acceptanceCriteria: [],
109
- constraints: { workspaceMode: 'current', requireWorktree: false, requireHandoffOnAmbiguity: true },
102
+ constraints: { workspaceMode: 'current' },
110
103
  risk: 'low',
111
- status: 'running',
104
+ dispatchState: 'running',
112
105
  phase: 'implementation',
113
106
  issueId: input.issueId,
114
107
  taskId: input.taskId,
115
108
  scopeSummary: input.objective,
116
- allowedPaths: input.allowedPaths,
117
- forbiddenPaths: [],
118
109
  checks: input.checks,
119
110
  requestedBy: input.requestedBy,
120
111
  evidenceRefs: [],
@@ -160,6 +151,5 @@ export function materializeRepositoryWorkPlacement(
160
151
  }),
161
152
  baseRevision: workspace.baseRevision ?? contract.baseRevision,
162
153
  worktreeRef: workspace.root,
163
- driver: { ...contract.driver, preferred: 'isolated_worktree', allowDirectEdit: false },
164
154
  });
165
155
  }
@@ -1,20 +1,14 @@
1
1
  import {
2
+ bindRequirementCandidateAuditRef,
2
3
  createRequirement,
4
+ listRequirements,
3
5
  readRequirement,
4
- updateRequirement,
5
6
  type CreateRequirementInput,
6
7
  type Requirement,
7
8
  type RequirementStoreOptions,
8
9
  } from '../persistence/requirement-store';
9
- import { readPlanContractStore } from './plan-contract-store';
10
- import { withPlanAdmissionLock } from './semantic-admission';
11
- import {
12
- getControllerRoundRelay,
13
- submitControllerRoundDisposition,
14
- type ControllerRoundRelayRecord,
15
- type SubmitControllerRoundDispositionInput,
16
- } from '../../../../packages/kernel/controller/api/index';
17
- import { getWorkContract } from '../../../../packages/kernel/work/api/index';
10
+ import { cognitionMemoryStore } from '../persistence/cognition-store';
11
+ import { memoryAddressKey, type MemoryUnit } from '../../../../packages/kernel/cognition/api/index';
18
12
 
19
13
  export type RequirementAdmissionDecision = 'created' | 'reuse_existing' | 'existing_conflict';
20
14
 
@@ -47,6 +41,7 @@ export function normalizeRequirementAdmissionInput(input: CreateRequirementInput
47
41
  acceptanceCriteria: bounded(input.acceptanceCriteria, 50),
48
42
  requiredDeliveryReferences: bounded(input.requiredDeliveryReferences, 50),
49
43
  legacyAliases: bounded(input.legacyAliases, 20, 160),
44
+ auditRefs: bounded(input.auditRefs, 50),
50
45
  };
51
46
  if (!normalized.title || !normalized.outcomeStatement) throw new Error('REQUIREMENT_CONTENT_REQUIRED');
52
47
  return normalized;
@@ -92,210 +87,118 @@ export function admitRequirement(
92
87
  }
93
88
  }
94
89
 
90
+ export type RequirementCandidatePromotionDecision =
91
+ | RequirementAdmissionDecision
92
+ | 'candidate_already_promoted';
95
93
 
96
- export interface RequirementContinueResult {
97
- requirement: Requirement;
98
- resumed: boolean;
99
- }
100
-
101
- /**
102
- * Canonical explicit semantic continue for a Requirement that is waiting on
103
- * ChatGPT/user judgement. Persistence owns transition legality; this facade
104
- * owns the semantic meaning so adapters and launchers never mutate Requirement
105
- * state directly.
106
- */
107
- export function continueRequirement(
108
- options: RequirementStoreOptions,
109
- requirementId: string,
110
- ): RequirementContinueResult {
111
- const normalizedId = String(requirementId ?? '').trim();
112
- const current = readRequirement(options, normalizedId)?.value;
113
- if (!current) throw new Error(`REQUIREMENT_NOT_FOUND: ${normalizedId}`);
114
- if (current.state === 'active') return { requirement: current, resumed: false };
115
- if (current.state === 'done' || current.state === 'cancelled') {
116
- throw new Error(`REQUIREMENT_TERMINAL: ${current.requirementId}:${current.state}`);
117
- }
118
- if (current.state !== 'waiting_for_user') {
119
- throw new Error(`REQUIREMENT_CONTINUE_NOT_WAITING: ${current.requirementId}:${current.state}`);
120
- }
121
-
122
- const requirement = updateRequirement(options, {
123
- requirementId: current.requirementId,
124
- action: 'requirement_semantic_continue',
125
- mutate: (latest) => {
126
- if (latest.state === 'active') return latest;
127
- if (latest.state === 'done' || latest.state === 'cancelled') {
128
- throw new Error(`REQUIREMENT_TERMINAL: ${latest.requirementId}:${latest.state}`);
129
- }
130
- if (latest.state !== 'waiting_for_user') {
131
- throw new Error(`REQUIREMENT_CONTINUE_NOT_WAITING: ${latest.requirementId}:${latest.state}`);
132
- }
133
- return {
134
- ...latest,
135
- state: 'active',
136
- needsAttention: false,
137
- attentionSummary: undefined,
138
- };
139
- },
140
- });
141
- return { requirement, resumed: true };
142
- }
143
-
144
- export interface RequirementAcceptanceResult {
145
- requirement: Requirement;
146
- accepted: boolean;
147
- finalizedPlanIds: string[];
148
- }
149
-
150
- export interface RequirementAcceptanceReadiness {
94
+ export interface RequirementCandidatePromotionResult {
95
+ decision: RequirementCandidatePromotionDecision;
151
96
  requirement: Requirement;
152
- finalizedPlanIds: string[];
97
+ created: boolean;
98
+ candidateAuditRef: string;
99
+ candidateMemoryId: string;
100
+ workspaceId: string;
153
101
  }
154
102
 
155
- function requirementAcceptanceContext(
156
- options: RequirementStoreOptions & { repoId: string },
157
- input: { requirementId: string; workId: string; reviewer: string; rationale: string },
158
- ): RequirementAcceptanceReadiness {
159
- const requirementId = String(input.requirementId ?? '').trim();
160
- const workId = String(input.workId ?? '').trim();
161
- const reviewer = String(input.reviewer ?? '').trim();
162
- const rationale = String(input.rationale ?? '').trim();
163
- if (!requirementId) throw new Error('REQUIREMENT_ACCEPTANCE_ID_REQUIRED');
164
- if (!workId) throw new Error('REQUIREMENT_ACCEPTANCE_WORK_REQUIRED');
165
- if (!reviewer || !rationale) throw new Error('REQUIREMENT_ACCEPTANCE_METADATA_REQUIRED');
166
-
167
- const current = readRequirement(options, requirementId)?.value;
168
- if (!current) throw new Error(`REQUIREMENT_NOT_FOUND: ${requirementId}`);
169
- if (current.state === 'cancelled') throw new Error(`REQUIREMENT_TERMINAL: ${requirementId}:cancelled`);
170
- if (current.state === 'planned') throw new Error(`REQUIREMENT_ACCEPTANCE_NOT_ACTIVE: ${requirementId}:planned`);
171
- if (current.state === 'done') {
172
- return { requirement: current, finalizedPlanIds: current.semanticAcceptance?.planIds ?? [] };
173
- }
174
-
175
- const currentPlans = readPlanContractStore({ controllerHome: options.controllerHome, repoId: options.repoId, now: options.now })
176
- .contracts
177
- .filter((plan) => plan.requirementId === requirementId && !plan.supersededBy?.trim() && plan.status !== 'superseded');
178
- const incomplete = currentPlans.filter((plan) => plan.status !== 'finalized');
179
- if (incomplete.length > 0) {
180
- throw new Error(`REQUIREMENT_ACCEPTANCE_PLAN_INCOMPLETE: ${incomplete.map((plan) => `${plan.planId}:${plan.status}`).join(',')}`);
181
- }
182
- const work = getWorkContract({ controllerHome: options.controllerHome, repoId: options.repoId }, workId);
183
- if (!work) throw new Error(`REQUIREMENT_ACCEPTANCE_WORK_NOT_FOUND: ${workId}`);
184
- if (work.requirementId !== requirementId) throw new Error(`REQUIREMENT_ACCEPTANCE_WORK_MISMATCH: ${workId}:${work.requirementId ?? 'none'}:${requirementId}`);
185
- if (work.status !== 'completed') throw new Error(`REQUIREMENT_ACCEPTANCE_WORK_NOT_COMPLETED: ${workId}:${work.status}`);
186
- return { requirement: current, finalizedPlanIds: currentPlans.map((plan) => plan.planId).sort() };
103
+ function activeRequirementCandidate(memory: MemoryUnit, at: string): boolean {
104
+ return !memory.retractedAt
105
+ && memory.validFrom <= at
106
+ && (!memory.expiresAt || memory.expiresAt > at)
107
+ && memory.facets.includes('candidate-finding')
108
+ && memory.facets.includes('requirement-candidate')
109
+ && memory.facets.includes('advisory')
110
+ && memory.concepts.includes('forge.requirement-candidate')
111
+ && memory.provenance.sourceKind === 'system'
112
+ && Boolean(memory.provenance.sourceId?.startsWith('cognitive-requirement-candidate:promoted:'))
113
+ && memory.provenance.evidenceRefs.length > 0;
187
114
  }
188
115
 
189
- function acceptRequirementOutcomeUnlocked(
190
- options: RequirementStoreOptions & { repoId: string },
191
- input: { requirementId: string; workId: string; reviewer: string; rationale: string },
192
- ): RequirementAcceptanceResult {
193
- const context = requirementAcceptanceContext(options, input);
194
- const requirementId = context.requirement.requirementId;
195
- const reviewer = String(input.reviewer ?? '').trim();
196
- const rationale = String(input.rationale ?? '').trim();
197
- const relay = getControllerRoundRelay({ controllerHome: options.controllerHome, repoId: options.repoId }, input.workId);
198
- if (!relay) throw new Error(`REQUIREMENT_ACCEPTANCE_GOAL_COMPLETE_REQUIRED: ${input.workId}:missing_relay`);
199
- if (relay.originWorkId !== input.workId
200
- || relay.requirementId !== requirementId
201
- || relay.disposition !== 'goal_complete'
202
- || relay.status !== 'goal_complete') {
203
- throw new Error(`REQUIREMENT_ACCEPTANCE_GOAL_COMPLETE_REQUIRED: ${input.workId}:${relay.status}:${relay.disposition}`);
204
- }
205
- if (relay.principalId !== reviewer) {
206
- throw new Error(`REQUIREMENT_ACCEPTANCE_CONTROLLER_MISMATCH: ${input.workId}:${relay.principalId}:${reviewer}`);
116
+ function validatedRequirementCandidate(
117
+ options: RequirementStoreOptions,
118
+ workspaceId: string,
119
+ candidateMemoryId: string,
120
+ ): MemoryUnit {
121
+ const workspace = String(workspaceId ?? '').trim();
122
+ const memoryId = String(candidateMemoryId ?? '').trim();
123
+ if (!workspace || !memoryId) throw new Error('REQUIREMENT_CANDIDATE_SCOPE_REQUIRED');
124
+ const scope = { schemaVersion: 1 as const, kind: 'workspace' as const, id: workspace };
125
+ const store = cognitionMemoryStore(options.controllerHome);
126
+ const candidate = store.read(scope, memoryId);
127
+ if (!candidate || !activeRequirementCandidate(candidate, options.now?.() ?? new Date().toISOString())) {
128
+ throw new Error(`REQUIREMENT_CANDIDATE_INVALID: ${memoryId}`);
207
129
  }
208
- if (context.requirement.state === 'done') {
209
- return { requirement: context.requirement, accepted: false, finalizedPlanIds: context.finalizedPlanIds };
130
+ const sourceId = candidate.provenance.sourceId!.slice('cognitive-requirement-candidate:'.length);
131
+ const source = store.read(scope, sourceId);
132
+ if (!source
133
+ || !source.id.startsWith('promoted:')
134
+ || source.retractedAt
135
+ || !source.facets.includes('cross-project')
136
+ || !source.facets.includes('engineering-principle')
137
+ || candidate.provenance.evidenceRefs.some(ref => !source.provenance.evidenceRefs.includes(ref))) {
138
+ throw new Error(`REQUIREMENT_CANDIDATE_SOURCE_INVALID: ${memoryId}`);
210
139
  }
211
-
212
- const acceptedAt = options.now?.() ?? new Date().toISOString();
213
- let accepted = false;
214
- const requirement = updateRequirement(options, {
215
- requirementId,
216
- action: 'requirement_semantic_acceptance',
217
- mutate: (latest) => {
218
- if (latest.state === 'done') return latest;
219
- if (latest.state === 'cancelled') throw new Error(`REQUIREMENT_TERMINAL: ${requirementId}:cancelled`);
220
- if (latest.state === 'planned') throw new Error(`REQUIREMENT_ACCEPTANCE_NOT_ACTIVE: ${requirementId}:planned`);
221
- accepted = true;
222
- return {
223
- ...latest,
224
- state: 'done',
225
- needsAttention: false,
226
- attentionSummary: undefined,
227
- semanticAcceptance: {
228
- reviewer: reviewer.slice(0, 256),
229
- rationale: rationale.slice(0, 2_000),
230
- planIds: context.finalizedPlanIds,
231
- acceptedAt,
232
- },
233
- };
234
- },
235
- });
236
- return { requirement, accepted, finalizedPlanIds: context.finalizedPlanIds };
140
+ return candidate;
237
141
  }
238
142
 
239
- /**
240
- * Canonical explicit semantic acceptance for a Requirement. Direct callers are
241
- * serialized with Plan admission so Requirement completion cannot race a new
242
- * current Plan slice into existence.
243
- */
244
- export function acceptRequirementOutcome(
245
- options: RequirementStoreOptions & { repoId: string },
246
- input: { requirementId: string; workId: string; reviewer: string; rationale: string },
247
- ): RequirementAcceptanceResult {
248
- return withPlanAdmissionLock(options, () => acceptRequirementOutcomeUnlocked(options, input));
143
+ export function requirementCandidateAuditRef(workspaceId: string, candidate: Pick<MemoryUnit, 'id' | 'revision'>): string {
144
+ const scope = { schemaVersion: 1 as const, kind: 'workspace' as const, id: String(workspaceId).trim() };
145
+ return `cognitive-requirement-candidate:${memoryAddressKey({ scope, id: candidate.id })}:r${candidate.revision}`;
249
146
  }
250
147
 
251
- export interface RequirementGoalCompletionResult {
252
- relay: ControllerRoundRelayRecord;
253
- requirementAcceptance: RequirementAcceptanceResult;
148
+ function requirementByCandidateAuditRef(options: RequirementStoreOptions, candidateAuditRef: string): Requirement | undefined {
149
+ return listRequirements(options, 1000)
150
+ .map(record => record.value)
151
+ .find(requirement => requirement.auditRefs.includes(candidateAuditRef));
254
152
  }
255
153
 
256
- /**
257
- * One Goal application boundary for Requirement-bound goal_complete. The same
258
- * short semantic lock used by Plan admission covers readiness, ControllerRound
259
- * disposition persistence, and Requirement acceptance. A retry reuses an
260
- * already-recorded goal_complete relay and repairs only the missing Requirement
261
- * projection; no second ControllerRound or Plan authority is created.
262
- */
263
- export function completeRequirementGoal(
264
- options: RequirementStoreOptions & { repoId: string },
265
- input: Omit<SubmitControllerRoundDispositionInput, 'disposition' | 'requirementId' | 'reason'> & {
266
- requirementId: string;
267
- rationale: string;
154
+ export function promoteRequirementCandidate(
155
+ options: RequirementStoreOptions,
156
+ input: Omit<CreateRequirementInput, 'auditRefs'> & {
157
+ workspaceId: string;
158
+ candidateMemoryId: string;
268
159
  },
269
- ): RequirementGoalCompletionResult {
270
- return withPlanAdmissionLock(options, () => {
271
- const reviewer = input.identity.principalId.trim();
272
- const readinessInput = {
273
- requirementId: input.requirementId,
274
- workId: input.workId,
275
- reviewer,
276
- rationale: input.rationale,
160
+ ): RequirementCandidatePromotionResult {
161
+ const candidate = validatedRequirementCandidate(options, input.workspaceId, input.candidateMemoryId);
162
+ const candidateAuditRef = requirementCandidateAuditRef(input.workspaceId, candidate);
163
+ const prior = requirementByCandidateAuditRef(options, candidateAuditRef);
164
+ if (prior && prior.requirementId !== String(input.requirementId ?? '').trim()) {
165
+ return {
166
+ decision: 'candidate_already_promoted',
167
+ requirement: prior,
168
+ created: false,
169
+ candidateAuditRef,
170
+ candidateMemoryId: candidate.id,
171
+ workspaceId: input.workspaceId,
277
172
  };
278
- requirementAcceptanceContext(options, readinessInput);
173
+ }
279
174
 
280
- const existing = getControllerRoundRelay(options, input.workId);
281
- let relay: ControllerRoundRelayRecord;
282
- if (existing?.status === 'goal_complete' && existing.disposition === 'goal_complete') {
283
- relay = existing;
284
- } else {
285
- try {
286
- relay = submitControllerRoundDisposition(options, {
287
- ...input,
288
- disposition: 'goal_complete',
289
- requirementId: input.requirementId,
290
- reason: input.rationale,
291
- });
292
- } catch (error) {
293
- const raced = getControllerRoundRelay(options, input.workId);
294
- if (!raced || raced.status !== 'goal_complete' || raced.disposition !== 'goal_complete') throw error;
295
- relay = raced;
296
- }
297
- }
298
- const requirementAcceptance = acceptRequirementOutcomeUnlocked(options, readinessInput);
299
- return { relay, requirementAcceptance };
300
- });
175
+ try {
176
+ const admission = admitRequirement(options, {
177
+ ...input,
178
+ auditRefs: [candidateAuditRef],
179
+ });
180
+ const requirement = admission.decision === 'reuse_existing'
181
+ && !admission.requirement.auditRefs.includes(candidateAuditRef)
182
+ ? bindRequirementCandidateAuditRef(options, admission.requirement.requirementId, candidateAuditRef)
183
+ : admission.requirement;
184
+ return {
185
+ ...admission,
186
+ requirement,
187
+ candidateAuditRef,
188
+ candidateMemoryId: candidate.id,
189
+ workspaceId: input.workspaceId,
190
+ };
191
+ } catch (error) {
192
+ if (!(error instanceof Error) || error.message !== 'REQUIREMENT_CANDIDATE_ALREADY_PROMOTED') throw error;
193
+ const raced = requirementByCandidateAuditRef(options, candidateAuditRef);
194
+ if (!raced) throw error;
195
+ return {
196
+ decision: 'candidate_already_promoted',
197
+ requirement: raced,
198
+ created: false,
199
+ candidateAuditRef,
200
+ candidateMemoryId: candidate.id,
201
+ workspaceId: input.workspaceId,
202
+ };
203
+ }
301
204
  }
@@ -77,7 +77,7 @@ function loadScopedWork(options: RequirementBoardOptions): WorkContract[] {
77
77
  return listWorkContracts({
78
78
  controllerHome: options.controllerHome,
79
79
  repoId: options.repoId,
80
- status: 'all',
80
+ state: 'all',
81
81
  limit: 100,
82
82
  });
83
83
  }
@@ -224,7 +224,7 @@ function summarizeDiagnosticWork(work: WorkContract): Record<string, unknown> {
224
224
  worktreeRef: work.worktreeRef,
225
225
  handoffRefs: work.handoffRefs.slice(-3),
226
226
  },
227
- detailPointer: { tool: 'work_get', arguments: { work_id: work.workId, include_events: true } },
227
+ detailPointer: { tool: 'rh_work', arguments: { operation: 'get', work_id: work.workId, detail_level: 'detail' } },
228
228
  };
229
229
  }
230
230
 
@@ -292,7 +292,7 @@ export function buildExecutionDiagnostics(
292
292
  maintenanceFindingTruncatedCount: Math.max(0, requirements.filter((requirement) => requirement.needsAttention).length - maintenanceFindings.length),
293
293
  projectionWarnings,
294
294
  technicalDetailPointers: [
295
- { tool: 'work_list', arguments: { limit: 50 } },
295
+ { tool: 'rh_context', arguments: { operation: 'list', detail_level: 'detail' } },
296
296
  { tool: 'controller_ready', arguments: {} },
297
297
  { tool: 'workflow_watchdog_report', arguments: { include_processes: true } },
298
298
  { tool: 'get_project_governance', arguments: {} },
@@ -8,26 +8,20 @@
8
8
  */
9
9
  export const RH_WORK_OPERATIONS = [
10
10
  'start',
11
- 'continue',
12
- 'verify',
13
- 'review',
14
11
  'repair',
15
- 'finalize',
16
- 'stop',
17
- 'delegate',
18
- 'controller_claim',
19
- 'controller_release',
20
- 'controller_disposition',
21
- 'controller_get_owner',
12
+ 'list',
13
+ 'get',
14
+ 'revise',
15
+ 'complete',
22
16
  'launcher_start',
23
17
  'requirement_create',
24
- 'requirement_continue',
18
+ 'requirement_get',
19
+ 'requirement_revise',
20
+ 'requirement_promote_candidate',
25
21
  'plan_create',
26
22
  'plan_get',
23
+ 'plan_revise',
27
24
  'plan_list',
28
- 'plan_approve',
29
- 'plan_accept_step',
30
- 'plan_supersede',
31
25
  'schedule_create',
32
26
  'schedule_list',
33
27
  'schedule_get',
@@ -37,6 +31,45 @@ export const RH_WORK_OPERATIONS = [
37
31
  'schedule_trigger',
38
32
  'workflow_execute',
39
33
  'workflow_reconcile',
34
+ 'learning_record',
35
+ 'learning_feedback',
36
+ 'outcome_record',
37
+ 'experience_record',
38
+ ] as const;
39
+
40
+ /**
41
+ * There is intentionally no legacy lifecycle operation set. A Runtime that
42
+ * has rolled over to Thin Forge rejects the former verify/review/finalize and
43
+ * controller-claim vocabulary instead of silently translating it.
44
+ */
45
+
46
+ export const RH_WORK_MODEL_OPERATIONS = [
47
+ 'start',
48
+ 'repair',
49
+ 'list',
50
+ 'get',
51
+ 'revise',
52
+ 'complete',
53
+ 'launcher_start',
54
+ 'requirement_create',
55
+ 'requirement_get',
56
+ 'requirement_revise',
57
+ 'requirement_promote_candidate',
58
+ 'plan_create',
59
+ 'plan_get',
60
+ 'plan_revise',
61
+ 'plan_list',
62
+ 'schedule_create',
63
+ 'schedule_list',
64
+ 'schedule_get',
65
+ 'schedule_pause',
66
+ 'schedule_resume',
67
+ 'schedule_delete',
68
+ 'schedule_trigger',
69
+ 'workflow_execute',
70
+ 'workflow_reconcile',
71
+ 'learning_record',
72
+ 'learning_feedback',
40
73
  'outcome_record',
41
74
  'experience_record',
42
75
  ] as const;
@@ -46,3 +79,7 @@ export type RhWorkOperation = (typeof RH_WORK_OPERATIONS)[number];
46
79
  export function isRhWorkOperation(operation: string): operation is RhWorkOperation {
47
80
  return (RH_WORK_OPERATIONS as readonly string[]).includes(operation);
48
81
  }
82
+
83
+ export function isRhWorkAcceptedOperation(operation: string): boolean {
84
+ return isRhWorkOperation(operation);
85
+ }