@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
@@ -1,4 +1,5 @@
1
1
  import { createHash } from 'crypto';
2
+ import { resolve } from 'path';
2
3
  import { controllerCheckExecutionIdentity, listControllerChecks, readLatestControllerCheckEvidence } from '../../../cli/controller/check-runner';
3
4
  import { repositoryGitStatus } from '../../../cli/repositories/structured-git';
4
5
  import type { RepositoryRecord } from '../../../cli/repositories/types';
@@ -6,20 +7,26 @@ import {
6
7
  DEFAULT_WORK_CHECK_LEASE_WAIT_MS,
7
8
  checkRequiresDurableWorkflow,
8
9
  getProcessRecord,
10
+ isManagedProcessActive,
11
+ listProcessRecords,
9
12
  processCheckCompletionReceipt,
10
13
  readPersistedCheckResultReceipt,
11
14
  runPersistedCheckViaProcessRuntime,
12
15
  } from '../../execution/process-runtime';
13
- import { classifyPersistedCheckTerminalEvidence } from '../../execution/process-runtime/check-result';
16
+ import { projectTerminalCheckVerification } from '../../execution/process-runtime/check-result';
14
17
  import { buildCheckExecutionSchedule } from '../../execution/process-runtime/check-scheduling';
15
18
  import { ingestCheckCompletionGraceProcess } from '../persistence/operational-prior-store';
16
19
  import { buildFacadeResult } from '../facade/facade-result';
17
20
  import { classifyVerificationOutcome, normalizeCheckIds } from '../facade/check-normalization';
18
- import { verifyGoalWorkloop } from '../facade/goal-workloop';
21
+ import { recordWorkCheckEvidence } from './work-check-evidence';
19
22
  import type { FacadeResult, VerificationRecord, WorkContract } from '../facade/types';
23
+
20
24
  import { executionIdentityForRepository } from './execution-identity';
21
25
  import { commandFingerprint, effectiveVerificationEvidence, verificationInputFingerprint, workspaceValidationFingerprint } from './verification-evidence';
22
26
  import { resolveWorkVerificationContext } from './work-verification-context';
27
+ import { listWorkBoundRepositoryProcessEvidence } from './work-process-evidence';
28
+ import { changedPaths as workChangedPaths, changedPathsFromUnbornBase } from './work-revision-diff';
29
+ import { readWorkHandle, workDeliveryBaseRevision } from './work-handle-store';
23
30
 
24
31
  export interface ExecuteWorkVerificationInput {
25
32
  controllerHome: string;
@@ -30,13 +37,13 @@ export interface ExecuteWorkVerificationInput {
30
37
  timeoutMs?: number;
31
38
  interactiveWaitMs?: number;
32
39
  leaseWaitMs?: number;
40
+ /** Exact terminal generic Check Processes to reconcile into this Work. */
41
+ reconcileProcessIds?: readonly string[];
33
42
  simulate?: {
34
43
  infrastructureFailed?: boolean;
35
44
  checkFailed?: boolean;
36
45
  skipped?: boolean;
37
46
  };
38
- /** Caller-supplied exact ownership proof for durable-class checks. */
39
- allowDurableCheckExecution?: (input: { work: WorkContract; checkId: string }) => boolean;
40
47
  }
41
48
 
42
49
  export interface ExecuteWorkVerificationResult {
@@ -48,6 +55,94 @@ function result(facade: FacadeResult, isError = false): ExecuteWorkVerificationR
48
55
  return { facade, isError };
49
56
  }
50
57
 
58
+ /**
59
+ * Derive the exact current implementation paths for the canonical Work
60
+ * verifier. Review admission cannot rely on Work scope evidence alone: a
61
+ * committed candidate in a managed checkout has no dirty-path signal, while
62
+ * a target-only advance must not become part of the Work candidate.
63
+ */
64
+ function trustedWorkspaceChangedPaths(input: {
65
+ controllerHome: string;
66
+ repository: RepositoryRecord;
67
+ work: WorkContract;
68
+ verificationStatus: ReturnType<typeof repositoryGitStatus>;
69
+ }): string[] {
70
+ const sourceRevision = input.verificationStatus.head;
71
+ const handle = readWorkHandle(input.controllerHome, input.repository.repoId, input.work.workId);
72
+ const deliveryBaseRevision = workDeliveryBaseRevision(handle ?? {}) ?? input.work.baseRevision;
73
+ const committedPaths = deliveryBaseRevision && sourceRevision
74
+ ? input.work.repositoryBaseState === 'unborn'
75
+ ? changedPathsFromUnbornBase(input.repository.canonicalRoot, sourceRevision)
76
+ : workChangedPaths(input.repository.canonicalRoot, deliveryBaseRevision, sourceRevision)
77
+ : input.work.scopeEvidence?.actualChangedPaths ?? [];
78
+ return [...new Set([
79
+ ...committedPaths,
80
+ ...input.verificationStatus.staged,
81
+ ...input.verificationStatus.unstaged,
82
+ ...input.verificationStatus.untracked,
83
+ ])].map((path) => path.trim()).filter(Boolean).sort();
84
+ }
85
+
86
+ function currentReusableVerificationRecord(input: {
87
+ workContract?: WorkContract;
88
+ checkId: string;
89
+ sourceRevision?: string;
90
+ workspaceFingerprint: string;
91
+ requestedChecks: string[];
92
+ }): VerificationRecord | undefined {
93
+ if (!input.workContract || !input.sourceRevision) return undefined;
94
+ return effectiveVerificationEvidence(input.workContract.checkRefs, {
95
+ sourceRevision: input.sourceRevision,
96
+ workspaceFingerprint: input.workspaceFingerprint,
97
+ checkId: input.checkId,
98
+ requestedChecks: input.requestedChecks,
99
+ }).find((entry) =>
100
+ entry.current
101
+ && (entry.record.outcome === 'valid_pass' || entry.record.outcome === 'valid_fail')
102
+ && Boolean(entry.record.receipt)
103
+ )?.record;
104
+ }
105
+
106
+ function reusedVerificationResult(
107
+ record: VerificationRecord,
108
+ input: {
109
+ workContract?: WorkContract;
110
+ sourceRevision?: string;
111
+ workspaceFingerprint: string;
112
+ workspaceChangedPaths?: readonly string[];
113
+ } = { workspaceFingerprint: '' },
114
+ reconciledProcessIds: string[] = [],
115
+ ): ExecuteWorkVerificationResult {
116
+ const receipt = record.receipt!;
117
+ const passed = record.outcome === 'valid_pass';
118
+ // Reused verification is durable evidence only. It never derives a Work next step.
119
+ void input.workContract;
120
+ void input.sourceRevision;
121
+ void input.workspaceFingerprint;
122
+ void input.workspaceChangedPaths;
123
+ return result(buildFacadeResult({
124
+ status: passed ? 'ok' : 'failed',
125
+ summary: `Reused exact current verification receipt for ${record.checkId}; no Process was re-executed.`,
126
+ data: {
127
+ verification: {
128
+ checkId: record.checkId,
129
+ outcome: record.outcome,
130
+ isAcceptanceFailure: !passed,
131
+ isInfrastructureIssue: false,
132
+ executed: false,
133
+ completed: true,
134
+ reused: true,
135
+ processId: receipt.processId,
136
+ processStatus: receipt.runtimeStatus,
137
+ ok: passed,
138
+ evidenceReceiptId: receipt.receiptId,
139
+ reconciledProcessIds,
140
+ },
141
+ },
142
+ rawAvailable: false,
143
+ }), !passed);
144
+ }
145
+
51
146
  export interface ContentEquivalentWorkVerificationTransferPlan {
52
147
  transferredRecords: VerificationRecord[];
53
148
  reusableCheckIds: string[];
@@ -164,6 +259,204 @@ function boundedCheckSchedulingPayload(schedule: ReturnType<typeof buildCheckExe
164
259
  * Every member still executes through executeWorkVerification so Work snapshot,
165
260
  * Failure Contract, VerificationRecord, and lifecycle semantics stay singular.
166
261
  */
262
+ export interface ReconcileTerminalWorkVerificationsResult {
263
+ repository?: RepositoryRecord;
264
+ verificationStatus?: ReturnType<typeof repositoryGitStatus>;
265
+ sourceRevision?: string;
266
+ workspaceFingerprint?: string;
267
+ reconciledProcessIds: string[];
268
+ workBoundProcessEvidenceIds: string[];
269
+ }
270
+
271
+ /**
272
+ * Reconcile terminal Work-bound verification Processes into canonical Work
273
+ * verification authority. MCP/other adapters may consume the resulting exact
274
+ * repository/content identity, but Process scanning, semantic fingerprint
275
+ * matching, receipt construction, terminal projection, and Work verification
276
+ * mutation remain owned here.
277
+ */
278
+ export function reconcileTerminalWorkVerifications(input: {
279
+ controllerHome: string;
280
+ repository: RepositoryRecord;
281
+ workId: string;
282
+ /** Explicit Process ids are required for generic run_check evidence. */
283
+ reconcileProcessIds?: readonly string[];
284
+ }): ReconcileTerminalWorkVerificationsResult {
285
+ const resolved = resolveWorkVerificationContext({
286
+ controllerHome: input.controllerHome,
287
+ repository: input.repository,
288
+ workId: input.workId,
289
+ });
290
+ if (!resolved.ok) return { reconciledProcessIds: [], workBoundProcessEvidenceIds: [] };
291
+ const { store, workContract, repository, checks: availableChecks } = resolved.context;
292
+ if (!workContract || workContract.completionReceipt) return { reconciledProcessIds: [], workBoundProcessEvidenceIds: [] };
293
+
294
+ const verificationStatus = repositoryGitStatus(repository);
295
+ const sourceRevision = verificationStatus.head ?? undefined;
296
+ if (!sourceRevision) return { repository, verificationStatus, reconciledProcessIds: [], workBoundProcessEvidenceIds: [] };
297
+ const workspaceFingerprint = workspaceValidationFingerprint(repository.canonicalRoot, verificationStatus);
298
+ const workspaceChangedPaths = trustedWorkspaceChangedPaths({
299
+ controllerHome: input.controllerHome,
300
+ repository,
301
+ work: workContract,
302
+ verificationStatus,
303
+ });
304
+ const workBoundProcessEvidenceIds = (
305
+ workContract.workKind === 'local_effect'
306
+ || (workContract.workKind === 'repository_change' && workContract.checks.length === 0)
307
+ )
308
+ ? listWorkBoundRepositoryProcessEvidence({
309
+ controllerHome: input.controllerHome,
310
+ repoId: input.repository.repoId,
311
+ checkoutId: repository.activeCheckoutId,
312
+ workId: input.workId,
313
+ }).map((evidence) => evidence.processId)
314
+ : [];
315
+ const seenChecks = new Set<string>();
316
+ const reconciledProcessIds: string[] = [];
317
+ const explicitProcessIds = new Set(
318
+ (input.reconcileProcessIds ?? [])
319
+ .map((processId) => processId.trim())
320
+ .filter(Boolean)
321
+ .slice(0, 32),
322
+ );
323
+ const recordsById = new Map(
324
+ listProcessRecords(input.controllerHome, input.repository.repoId, 500).map((record) => [record.processId, record] as const),
325
+ );
326
+ // An explicitly named Process may be older than the bounded recent scan.
327
+ // Fetching that one exact id preserves bounded reads without treating an
328
+ // arbitrary caller-supplied receipt as authority.
329
+ for (const processId of explicitProcessIds) {
330
+ if (!recordsById.has(processId)) {
331
+ const record = getProcessRecord(input.controllerHome, input.repository.repoId, processId);
332
+ if (record) recordsById.set(processId, record);
333
+ }
334
+ }
335
+ const candidates = [...recordsById.values()].filter((record) => {
336
+ const workSnapshot = (
337
+ record.workId === input.workId
338
+ && record.checkoutId === repository.activeCheckoutId
339
+ && !isManagedProcessActive(record)
340
+ && record.origin?.workVerificationSnapshot === true
341
+ && typeof record.origin?.checkId === 'string'
342
+ && typeof record.origin?.requestSemanticFingerprint === 'string'
343
+ );
344
+ if (workSnapshot) return true;
345
+ if (!explicitProcessIds.has(record.processId)) return false;
346
+
347
+ // Generic run_check records have no Work owner. They are eligible only
348
+ // when the caller names the exact terminal Process and the record proves
349
+ // the same repository/checkout, canonical checkout root, checkout-scoped
350
+ // Check execution, and check surface. The persisted semantic result is
351
+ // validated below before any Work mutation.
352
+ const executionIdentity = record.executionIdentity;
353
+ return (
354
+ record.repoId === repository.repoId
355
+ && record.checkoutId === repository.activeCheckoutId
356
+ && record.workId == null
357
+ && !isManagedProcessActive(record)
358
+ && record.origin?.surface === 'check'
359
+ && typeof record.origin?.checkId === 'string'
360
+ && executionIdentity?.repositoryId === repository.repoId
361
+ && executionIdentity.checkoutId === repository.activeCheckoutId
362
+ && resolve(executionIdentity.canonicalRoot) === resolve(repository.canonicalRoot)
363
+ && record.checkExecution?.reuseScope === 'checkout'
364
+ && record.checkExecution.scopeKey === `checkout:${repository.activeCheckoutId}`
365
+ );
366
+ });
367
+
368
+ for (const record of candidates) {
369
+ const checkId = record.origin?.checkId?.trim() ?? '';
370
+ if (!checkId || seenChecks.has(checkId)) continue;
371
+ seenChecks.add(checkId);
372
+ const classified = classifyVerificationOutcome({ checkId, available: availableChecks });
373
+ if (classified.outcome === 'invalid_check_id' || !classified.normalizedCheckId) continue;
374
+ const normalizedCheckId = classified.normalizedCheckId;
375
+ const requestedChecks = workContract.checks.length ? workContract.checks : [normalizedCheckId];
376
+ const currentFingerprint = verificationInputFingerprint({
377
+ sourceRevision,
378
+ workspaceFingerprint,
379
+ checkId: normalizedCheckId,
380
+ requestedChecks,
381
+ });
382
+ const workSnapshot = record.workId === input.workId && record.origin?.workVerificationSnapshot === true;
383
+ if (workSnapshot && (record.origin?.requestSemanticFingerprint !== currentFingerprint || !record.checkExecution)) continue;
384
+ if (!workSnapshot) {
385
+ const recordedExecution = record.checkExecution;
386
+ if (!recordedExecution) continue;
387
+ const currentExecution = controllerCheckExecutionIdentity(repository.canonicalRoot, normalizedCheckId);
388
+ if (
389
+ currentExecution.cacheKey !== recordedExecution.cacheKey
390
+ || currentExecution.revision !== recordedExecution.revision
391
+ || currentExecution.definitionDigest !== recordedExecution.definitionDigest
392
+ || currentExecution.environmentFingerprint !== recordedExecution.environmentFingerprint
393
+ || currentExecution.timeoutMs !== recordedExecution.timeoutMs
394
+ || currentExecution.reuseScope !== recordedExecution.reuseScope
395
+ ) continue;
396
+ const structuredReceipt = readPersistedCheckResultReceipt(record.origin?.checkResultReceiptPath);
397
+ if (
398
+ !structuredReceipt
399
+ || structuredReceipt.checkId !== normalizedCheckId
400
+ || structuredReceipt.cacheKey !== recordedExecution.cacheKey
401
+ || structuredReceipt.validatedRevision !== recordedExecution.revision
402
+ ) continue;
403
+ }
404
+ const checkExecution = record.checkExecution;
405
+ if (!checkExecution) continue;
406
+
407
+ try {
408
+ const receipt = processCheckCompletionReceipt(record, {
409
+ repoId: repository.repoId,
410
+ checkoutId: repository.activeCheckoutId,
411
+ workId: input.workId,
412
+ checkId: normalizedCheckId,
413
+ processId: record.processId,
414
+ requestId: record.origin?.requestId,
415
+ checkExecution: {
416
+ cacheKey: checkExecution.cacheKey,
417
+ revision: checkExecution.revision,
418
+ definitionDigest: checkExecution.definitionDigest,
419
+ environmentFingerprint: checkExecution.environmentFingerprint,
420
+ timeoutMs: checkExecution.timeoutMs,
421
+ scopeKey: checkExecution.scopeKey,
422
+ },
423
+ });
424
+ if (workContract.checkRefs.some((entry) => entry.receipt?.receiptId === receipt.receiptId)) continue;
425
+
426
+ const legacyEvidence = record.origin?.checkResultReceiptPath
427
+ ? undefined
428
+ : readLatestControllerCheckEvidence(repository.canonicalRoot, normalizedCheckId);
429
+ const projection = projectTerminalCheckVerification(record, normalizedCheckId, receipt, { legacyEvidence });
430
+ recordWorkCheckEvidence({
431
+ store,
432
+ workId: input.workId,
433
+ checkId: normalizedCheckId,
434
+ availableChecks,
435
+ sourceRevision,
436
+ workspaceFingerprint,
437
+ verificationInputFingerprint: currentFingerprint,
438
+ commandFingerprint: commandFingerprint(normalizedCheckId, receipt.commandId),
439
+ receipt,
440
+ infrastructureFailed: projection.isInfrastructureIssue,
441
+ checkFailed: projection.isAcceptanceFailure,
442
+ });
443
+ reconciledProcessIds.push(record.processId);
444
+ } catch {
445
+ // Exact receipt/process identity is mandatory. Any malformed, stale, or
446
+ // mismatched terminal Process remains non-authoritative and is ignored.
447
+ }
448
+ }
449
+
450
+ return {
451
+ repository,
452
+ verificationStatus,
453
+ sourceRevision,
454
+ workspaceFingerprint,
455
+ reconciledProcessIds,
456
+ workBoundProcessEvidenceIds,
457
+ };
458
+ }
459
+
167
460
  export async function executeWorkVerificationBatch(input: ExecuteWorkVerificationBatchInput): Promise<ExecuteWorkVerificationResult> {
168
461
  const workId = input.workId?.trim() ?? '';
169
462
  const requestedCheckIds = [...new Set(input.checkIds.map((value) => value.trim()).filter(Boolean))];
@@ -337,20 +630,14 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
337
630
  }), true);
338
631
  }
339
632
 
340
- const workloopCtx = {
341
- workStore: store,
342
- handoffStore: store,
343
- repoId: input.repository.repoId,
344
- availableChecks: checks,
345
- };
346
- if (workId && (!workContract || workContract.status === 'completed' || workContract.status === 'cancelled' || workContract.status === 'failed')) {
347
- const facade = verifyGoalWorkloop(workloopCtx, { workId, checkId });
633
+ if (workId && (!workContract || workContract.semanticState !== 'open')) {
634
+ const facade = recordWorkCheckEvidence({ store, workId, checkId, availableChecks: checks });
348
635
  return result(facade, facade.status === 'failed');
349
636
  }
350
637
 
351
638
  const classified = classifyVerificationOutcome({ checkId, available: checks });
352
639
  if (classified.outcome === 'invalid_check_id') {
353
- if (workId) return result(verifyGoalWorkloop(workloopCtx, { workId, checkId }));
640
+ if (workId) return result(recordWorkCheckEvidence({ store, workId, checkId, availableChecks: checks }));
354
641
  return result(buildFacadeResult({
355
642
  status: 'ok',
356
643
  summary: classified.summary,
@@ -384,9 +671,11 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
384
671
  },
385
672
  }), input.simulate.checkFailed === true);
386
673
  }
387
- const facade = verifyGoalWorkloop(workloopCtx, {
674
+ const facade = recordWorkCheckEvidence({
675
+ store,
388
676
  workId,
389
677
  checkId: classified.normalizedCheckId ?? checkId,
678
+ availableChecks: checks,
390
679
  infrastructureFailed: input.simulate.infrastructureFailed === true,
391
680
  checkFailed: input.simulate.checkFailed === true,
392
681
  skipped: input.simulate.skipped === true,
@@ -399,6 +688,14 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
399
688
  const verificationStatus = repositoryGitStatus(verificationRepository);
400
689
  const observedGitHead = verificationStatus.head;
401
690
  const workspaceFingerprint = workspaceValidationFingerprint(verificationRepository.canonicalRoot, verificationStatus);
691
+ const workspaceChangedPaths = workContract
692
+ ? trustedWorkspaceChangedPaths({
693
+ controllerHome: input.controllerHome,
694
+ repository: verificationRepository,
695
+ work: workContract,
696
+ verificationStatus,
697
+ })
698
+ : undefined;
402
699
  const requestedChecks = workContract?.checks.length ? workContract.checks : [normalizedCheckId];
403
700
  const verificationRequestFingerprint = observedGitHead ? verificationInputFingerprint({
404
701
  sourceRevision: observedGitHead,
@@ -406,6 +703,75 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
406
703
  checkId: normalizedCheckId,
407
704
  requestedChecks,
408
705
  }) : undefined;
706
+
707
+ const explicitReconciliationRequested = (input.reconcileProcessIds?.length ?? 0) > 0;
708
+ const currentReceipt = currentReusableVerificationRecord({
709
+ workContract: explicitReconciliationRequested ? undefined : workContract,
710
+ checkId: normalizedCheckId,
711
+ sourceRevision: observedGitHead ?? undefined,
712
+ workspaceFingerprint,
713
+ requestedChecks,
714
+ });
715
+ if (currentReceipt) {
716
+ return reusedVerificationResult(currentReceipt, {
717
+ workContract,
718
+ sourceRevision: observedGitHead ?? undefined,
719
+ workspaceFingerprint,
720
+ workspaceChangedPaths,
721
+ });
722
+ }
723
+
724
+ let reconciledProcessIds: string[] = [];
725
+ if (workContract && observedGitHead) {
726
+ const reconciled = reconcileTerminalWorkVerifications({
727
+ controllerHome: input.controllerHome,
728
+ repository: input.repository,
729
+ workId: workContract.workId,
730
+ reconcileProcessIds: input.reconcileProcessIds,
731
+ });
732
+ reconciledProcessIds = reconciled.reconciledProcessIds;
733
+ if (reconciled.reconciledProcessIds.length > 0) {
734
+ const refreshed = resolveWorkVerificationContext({
735
+ controllerHome: input.controllerHome,
736
+ repository: input.repository,
737
+ workId: workContract.workId,
738
+ });
739
+ if (refreshed.ok) {
740
+ const reconciledReceipt = currentReusableVerificationRecord({
741
+ workContract: refreshed.context.workContract,
742
+ checkId: normalizedCheckId,
743
+ sourceRevision: observedGitHead,
744
+ workspaceFingerprint,
745
+ requestedChecks,
746
+ });
747
+ if (reconciledReceipt) {
748
+ return reusedVerificationResult(reconciledReceipt, {
749
+ workContract: refreshed.context.workContract,
750
+ sourceRevision: observedGitHead,
751
+ workspaceFingerprint,
752
+ workspaceChangedPaths,
753
+ }, reconciled.reconciledProcessIds);
754
+ }
755
+ }
756
+ }
757
+ }
758
+ if (explicitReconciliationRequested) {
759
+ return result(buildFacadeResult({
760
+ status: 'blocked',
761
+ summary: 'No explicitly requested terminal Process could be reconciled into the exact Work verification authority.',
762
+ data: {
763
+ verification: {
764
+ checkId: normalizedCheckId,
765
+ outcome: 'reconciliation_not_authoritative',
766
+ isAcceptanceFailure: false,
767
+ isInfrastructureIssue: true,
768
+ reconciledProcessIds,
769
+ },
770
+ },
771
+ warnings: ['WORK_VERIFY_RECONCILIATION_NOT_AUTHORIZED: Forge did not re-execute the Check after explicit reconciliation failed.'],
772
+ }), true);
773
+ }
774
+
409
775
  const registeredCheck = checks.find((entry) => entry.id === normalizedCheckId);
410
776
  const durableClassCheck = checkRequiresDurableWorkflow(registeredCheck);
411
777
  const allowDurableCheckExecution = Boolean(
@@ -413,8 +779,7 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
413
779
  && workContract
414
780
  && workContract.checks.includes(normalizedCheckId)
415
781
  && !workContract.completionReceipt
416
- && workContract.status === 'running'
417
- && input.allowDurableCheckExecution?.({ work: workContract, checkId: normalizedCheckId }),
782
+ && workContract.dispatchState === 'running',
418
783
  );
419
784
 
420
785
  const executed = await runPersistedCheckViaProcessRuntime({
@@ -431,11 +796,8 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
431
796
  requestSemanticFingerprint: verificationRequestFingerprint,
432
797
  workId: workId || undefined,
433
798
  commandId: input.requestId,
434
- verificationSnapshot: workContract ? {
435
- workId: workContract.workId,
436
- allowedPaths: workContract.allowedPaths,
437
- forbiddenPaths: workContract.forbiddenPaths,
438
- } : undefined,
799
+ // A Work has semantic scope and evidence, not a mutable path fence.
800
+ // Candidate snapshot ownership is supplied only by a bound EditSession.
439
801
  allowDurableCheckExecution,
440
802
  });
441
803
 
@@ -453,14 +815,7 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
453
815
  observedGitHead,
454
816
  },
455
817
  },
456
- suggestedNextActions: workId ? [{
457
- label: 'Continue Work with the durable check requirement',
458
- tool: 'rh_work',
459
- operation: 'continue',
460
- payload: { work_id: workId },
461
- risk: 'workspace_write',
462
- confidence: 'high',
463
- }] : [],
818
+ suggestedNextActions: [],
464
819
  }), true);
465
820
  }
466
821
 
@@ -517,14 +872,10 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
517
872
  const legacyEvidence = record.origin?.checkResultReceiptPath
518
873
  ? undefined
519
874
  : readLatestControllerCheckEvidence(verificationRepository.canonicalRoot, normalizedCheckId);
520
- const evidenceState = classifyPersistedCheckTerminalEvidence(record, normalizedCheckId, { legacyEvidence });
521
- const failureClass = evidenceState.failureClass;
522
- const infrastructureFailed = receipt.timedOut
523
- || receipt.cancelled
524
- || evidenceState.state !== 'matched'
525
- || (!receipt.ok && failureClass !== 'acceptance_failure');
526
- const checkFailed = !receipt.ok && !infrastructureFailed;
527
- if (receipt.ok && evidenceState.state === 'matched') {
875
+ const projection = projectTerminalCheckVerification(record, normalizedCheckId, receipt, { legacyEvidence });
876
+ const infrastructureFailed = projection.isInfrastructureIssue;
877
+ const checkFailed = projection.isAcceptanceFailure;
878
+ if (projection.outcome === 'valid_pass') {
528
879
  try {
529
880
  ingestCheckCompletionGraceProcess({
530
881
  controllerHome: input.controllerHome,
@@ -538,17 +889,18 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
538
889
  }
539
890
  const commonVerification = {
540
891
  checkId: normalizedCheckId,
541
- outcome: infrastructureFailed ? 'infrastructure_failure' : receipt.ok ? 'valid_pass' : 'valid_fail',
542
- isAcceptanceFailure: checkFailed,
543
- isInfrastructureIssue: infrastructureFailed,
892
+ outcome: projection.outcome,
893
+ isAcceptanceFailure: projection.isAcceptanceFailure,
894
+ isInfrastructureIssue: projection.isInfrastructureIssue,
544
895
  executed: true,
545
896
  completed: true,
546
897
  processId: receipt.processId,
547
898
  processStatus: receipt.runtimeStatus,
548
- ok: receipt.ok,
899
+ ok: projection.outcome === 'valid_pass',
900
+ processOk: receipt.ok,
549
901
  timedOut: receipt.timedOut,
550
902
  cancelled: receipt.cancelled,
551
- failureClass: infrastructureFailed ? 'infrastructure_failure' : failureClass,
903
+ failureClass: projection.failureClass,
552
904
  deduplicated: handle.deduplicated === true,
553
905
  semanticDeduplicated: handle.semanticDeduplicated === true,
554
906
  checkContentRevision: receipt.checkRevision,
@@ -557,19 +909,21 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
557
909
  evidenceArtifactPath: record.origin?.workVerificationSnapshot ? undefined : receipt.artifactPath,
558
910
  evidenceReceiptId: receipt.receiptId,
559
911
  checkResultReceiptId: structuredCheckResult?.receiptId,
560
- ...(evidenceState.failureEvidence ? { failureEvidence: evidenceState.failureEvidence } : {}),
912
+ ...(projection.evidence.failureEvidence ? { failureEvidence: projection.evidence.failureEvidence } : {}),
561
913
  verificationIsolation: record.origin?.workVerificationSnapshot ? 'work_snapshot' : 'shared_checkout',
562
- boundedStatus: receipt.ok ? 'pass' : infrastructureFailed ? 'infrastructure_failure' : 'fail',
563
- evidenceState: evidenceState.state,
564
- ...(evidenceState.infrastructureReason ? { infrastructureReason: evidenceState.infrastructureReason } : {}),
914
+ boundedStatus: projection.boundedStatus,
915
+ evidenceState: projection.evidence.state,
916
+ ...(projection.infrastructureReason ? { infrastructureReason: projection.infrastructureReason } : {}),
565
917
  ...(record.error?.code ? { processErrorCode: record.error.code } : {}),
566
918
  };
567
919
 
568
920
  if (workId) {
569
921
  const sourceRevision = observedGitHead ?? undefined;
570
- const facade = verifyGoalWorkloop(workloopCtx, {
922
+ const facade = recordWorkCheckEvidence({
923
+ store,
571
924
  workId,
572
925
  checkId: normalizedCheckId,
926
+ availableChecks: checks,
573
927
  sourceRevision,
574
928
  workspaceFingerprint,
575
929
  verificationInputFingerprint: sourceRevision ? verificationRequestFingerprint : undefined,
@@ -588,7 +942,7 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
588
942
  },
589
943
  },
590
944
  warnings: infrastructureFailed
591
- ? [...facade.warnings, evidenceState.warning ?? 'infrastructure_failure is distinct from acceptance failure']
945
+ ? [...facade.warnings, projection.evidence.warning ?? 'infrastructure_failure is distinct from acceptance failure']
592
946
  : facade.warnings,
593
947
  }, facade.status === 'failed');
594
948
  }
@@ -601,15 +955,17 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
601
955
  ? `Check ${normalizedCheckId} passed with persisted Process evidence.`
602
956
  : `Check ${normalizedCheckId} failed acceptance.`,
603
957
  data: { verification: commonVerification },
604
- warnings: infrastructureFailed ? [evidenceState.warning ?? 'infrastructure_failure is distinct from acceptance failure'] : [],
958
+ warnings: infrastructureFailed ? [projection.evidence.warning ?? 'infrastructure_failure is distinct from acceptance failure'] : [],
605
959
  rawAvailable: false,
606
960
  }), checkFailed);
607
961
  } catch (error) {
608
962
  const message = error instanceof Error ? error.message : String(error);
609
963
  if (workId) {
610
- const facade = verifyGoalWorkloop(workloopCtx, {
964
+ const facade = recordWorkCheckEvidence({
965
+ store,
611
966
  workId,
612
967
  checkId: classified.normalizedCheckId ?? checkId,
968
+ availableChecks: checks,
613
969
  infrastructureFailed: true,
614
970
  });
615
971
  return result({
@@ -138,7 +138,11 @@ export function cleanupStaleWorkVerificationSnapshots(
138
138
  return report;
139
139
  }
140
140
  for (const entry of entries) {
141
- if (!entry.isDirectory() || !entry.name.startsWith('snapshot-')) continue;
141
+ // The canonical root is the ownership boundary. Historical producers did
142
+ // not all use the snapshot-* prefix, so name shape must not make stale
143
+ // physical evidence invisible. Dirent.isDirectory() deliberately excludes
144
+ // symlinks before any recursive removal is considered.
145
+ if (!entry.isDirectory()) continue;
142
146
  if (report.inspected >= maxEntries) { report.truncated = true; skip('scan_budget_exhausted'); break; }
143
147
  report.inspected += 1;
144
148
  const path = join(root, entry.name);