@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,7 +1,7 @@
1
1
  import { createHash, randomUUID } from 'crypto';
2
2
  import { existsSync, readdirSync, rmSync, statSync } from 'fs';
3
3
  import { join } from 'path';
4
- import { repositoryControllerRoot } from '../../../../src/cli/repositories/controller-home';
4
+ import { controllerSystemRoot, repositoryControllerRoot } from '../../../../src/cli/repositories/controller-home';
5
5
  import { withControllerLock } from '../../../../src/cli/repositories/locks';
6
6
  import {
7
7
  createHandoffItem,
@@ -11,7 +11,7 @@ import {
11
11
  } from '../../../../src/runtime/control-plane/facade/handoff-inbox-store';
12
12
  import { readJsonFile, writeJsonAtomic } from '../../../../src/runtime/shared/json-files';
13
13
  import { appendRuntimeEvent } from '../../../../src/runtime/evidence/event-ledger';
14
- import type { RepositorySchedule, ScheduleDecision, ScheduleOccurrence } from '../domain/schedule';
14
+ import { type RepositorySchedule, type ScheduleDecision, type ScheduleOccurrence, type ScheduleDefinition, type ScheduleRuntimeState, extractScheduleDefinition, extractScheduleRuntimeState } from '../domain/schedule';
15
15
 
16
16
  interface OccurrenceIndex {
17
17
  schemaVersion: 1;
@@ -27,6 +27,19 @@ interface ScheduleRequestRecord {
27
27
  repoId: string;
28
28
  createdAt: string;
29
29
  }
30
+
31
+ class ScheduleStoreError extends Error {
32
+ readonly code: 'SCHEDULE_REPOSITORY_PROVENANCE_MISMATCH';
33
+ readonly scheduleId: string;
34
+
35
+ constructor(scheduleId: string) {
36
+ super(`SCHEDULE_REPOSITORY_PROVENANCE_MISMATCH: ${scheduleId}`);
37
+ this.name = 'ScheduleStoreError';
38
+ this.code = 'SCHEDULE_REPOSITORY_PROVENANCE_MISMATCH';
39
+ this.scheduleId = scheduleId;
40
+ }
41
+ }
42
+
30
43
  type CreateScheduleInput = Omit<RepositorySchedule, 'schemaVersion' | 'revision' | 'scheduleId' | 'createdAt' | 'updatedAt' | 'consecutiveFailures'>;
31
44
  type ScheduleMutableUpdate = Partial<Omit<RepositorySchedule, 'schemaVersion' | 'revision' | 'scheduleId' | 'repoId' | 'requestId' | 'createdAt' | 'updatedAt'>>;
32
45
 
@@ -34,7 +47,7 @@ export interface ScheduleOccurrenceHandoffInput {
34
47
  title: string;
35
48
  summary: string;
36
49
  reason: string;
37
- creationReason: 'ambiguous_outcome' | 'missing_authorization' | 'repeated_infrastructure_failure';
50
+ creationReason: 'ambiguous_outcome' | 'missing_authorization';
38
51
  blockingDecision: string;
39
52
  recommendedDecision: string;
40
53
  recommendedPrompt: string;
@@ -44,27 +57,49 @@ export interface ScheduleOccurrenceHandoffInput {
44
57
  evidenceRefs?: Array<{ title: string; summary?: string; detailLevel?: 'summary' | 'detail' | 'raw' }>;
45
58
  }
46
59
 
47
- function schedulesRoot(controllerHome: string, repoId: string): string {
60
+ function schedulesRoot(controllerHome: string): string {
61
+ return join(controllerSystemRoot(controllerHome), 'schedules');
62
+ }
63
+ function legacySchedulesRoot(controllerHome: string, repoId: string): string {
48
64
  return join(repositoryControllerRoot(controllerHome, repoId), 'schedules');
49
65
  }
50
- function schedulePath(controllerHome: string, repoId: string, scheduleId: string): string {
51
- return join(schedulesRoot(controllerHome, repoId), 'records', `${scheduleId}.json`);
66
+ function schedulePath(controllerHome: string, _repoId: string, scheduleId: string): string {
67
+ return join(schedulesRoot(controllerHome), 'records', `${scheduleId}.json`);
52
68
  }
53
- function occurrencePath(controllerHome: string, repoId: string, occurrenceId: string): string {
54
- return join(schedulesRoot(controllerHome, repoId), 'occurrences', `${occurrenceId}.json`);
69
+ function legacySchedulePath(controllerHome: string, repoId: string, scheduleId: string): string {
70
+ return join(legacySchedulesRoot(controllerHome, repoId), 'records', `${scheduleId}.json`);
55
71
  }
56
-
57
- function decisionPath(controllerHome: string, repoId: string, decisionId: string): string {
58
- return join(schedulesRoot(controllerHome, repoId), 'decisions', `${decisionId}.json`);
72
+ function occurrencePath(controllerHome: string, _repoId: string, occurrenceId: string): string {
73
+ return join(schedulesRoot(controllerHome), 'occurrences', `${occurrenceId}.json`);
74
+ }
75
+ function legacyOccurrencePath(controllerHome: string, repoId: string, occurrenceId: string): string {
76
+ return join(legacySchedulesRoot(controllerHome, repoId), 'occurrences', `${occurrenceId}.json`);
77
+ }
78
+ function decisionPath(controllerHome: string, _repoId: string, decisionId: string): string {
79
+ return join(schedulesRoot(controllerHome), 'decisions', `${decisionId}.json`);
80
+ }
81
+ function legacyDecisionPath(controllerHome: string, repoId: string, decisionId: string): string {
82
+ return join(legacySchedulesRoot(controllerHome, repoId), 'decisions', `${decisionId}.json`);
59
83
  }
60
84
  function occurrenceIndexPath(controllerHome: string, repoId: string): string {
61
- return join(schedulesRoot(controllerHome, repoId), 'indexes', 'occurrences.json');
85
+ const key = createHash('sha256').update(repoId).digest('hex').slice(0, 24);
86
+ return join(schedulesRoot(controllerHome), 'indexes', 'occurrences', `${key}.json`);
62
87
  }
63
- function requestPath(controllerHome: string, repoId: string, requestId: string): string {
64
- return join(schedulesRoot(controllerHome, repoId), 'indexes', 'requests', `${createHash('sha256').update(requestId).digest('hex')}.json`);
88
+ function requestTargetKey(input: Pick<RepositorySchedule, 'repoId' | 'scopeRef' | 'executionPlacement' | 'action'>): string {
89
+ return createHash('sha256').update(JSON.stringify(canonical({
90
+ scopeRef: input.scopeRef,
91
+ executionPlacement: input.executionPlacement,
92
+ repoId: input.repoId,
93
+ actionTarget: input.action.target,
94
+ operation: input.action.operation,
95
+ }))).digest('hex');
96
+ }
97
+ function requestPath(controllerHome: string, targetKey: string, requestId: string): string {
98
+ return join(schedulesRoot(controllerHome), 'indexes', 'requests', targetKey, `${createHash('sha256').update(requestId).digest('hex')}.json`);
65
99
  }
66
100
 
67
101
  export const SCHEDULE_OCCURRENCE_RECENT_LIMIT = 5_000;
102
+ export const SCHEDULE_CREATED_OCCURRENCE_STALE_MS = 5 * 60 * 1_000;
68
103
 
69
104
  const EXTERNAL_CONTROLLER_WAKE_MAX_FAILURES = 3;
70
105
  const EXTERNAL_CONTROLLER_WAKE_DAILY_BUDGET_MINUTES = 60;
@@ -131,8 +166,9 @@ export function createSchedule(controllerHome: string, input: CreateScheduleInpu
131
166
  const requestId = input.requestId.trim();
132
167
  if (!requestId) throw new Error('SCHEDULE_REQUEST_ID_REQUIRED');
133
168
  const semanticKey = scheduleSemanticKey(input);
134
- return withControllerLock(controllerHome, { scope: 'task', repoId: input.repoId, taskId: `schedule-request-${createHash('sha256').update(requestId).digest('hex').slice(0, 16)}` }, `create-schedule:${requestId}`, () => {
135
- const requestRecordPath = requestPath(controllerHome, input.repoId, requestId);
169
+ const targetKey = requestTargetKey(input);
170
+ return withControllerLock(controllerHome, { scope: 'global', resource: `schedule-request:${targetKey}:${createHash('sha256').update(requestId).digest('hex').slice(0, 16)}` }, `create-schedule:${requestId}`, () => {
171
+ const requestRecordPath = requestPath(controllerHome, targetKey, requestId);
136
172
  if (existsSync(requestRecordPath)) {
137
173
  const record = readJsonFile<ScheduleRequestRecord>(requestRecordPath);
138
174
  if (record.semanticKey !== semanticKey) throw new Error(`SCHEDULE_REQUEST_ID_CONFLICT: ${requestId}`);
@@ -157,8 +193,18 @@ export function createSchedule(controllerHome: string, input: CreateScheduleInpu
157
193
  }
158
194
 
159
195
  export function getSchedule(controllerHome: string, repoId: string, scheduleId: string): RepositorySchedule {
160
- const schedule = readJsonFile<RepositorySchedule>(schedulePath(controllerHome, repoId, scheduleId));
161
- // Hydrate schedules written before requestId/revision became mandatory.
196
+ const canonicalPath = schedulePath(controllerHome, repoId, scheduleId);
197
+ const legacyPath = legacySchedulePath(controllerHome, repoId, scheduleId);
198
+ const canonicalSchedule = existsSync(canonicalPath) ? readJsonFile<RepositorySchedule>(canonicalPath) : undefined;
199
+ const legacySchedule = existsSync(legacyPath) ? readJsonFile<RepositorySchedule>(legacyPath) : undefined;
200
+ if (canonicalSchedule && legacySchedule && JSON.stringify(canonicalSchedule) !== JSON.stringify(legacySchedule)) {
201
+ const canonicalRevision = Number.isFinite(canonicalSchedule.revision) ? canonicalSchedule.revision : 1;
202
+ const legacyRevision = Number.isFinite(legacySchedule.revision) ? legacySchedule.revision : 1;
203
+ if (canonicalRevision <= legacyRevision) throw new Error(`SCHEDULE_ID_COLLISION: ${scheduleId}`);
204
+ }
205
+ const schedule = canonicalSchedule ?? legacySchedule;
206
+ if (!schedule) throw new Error(`SCHEDULE_NOT_FOUND: ${scheduleId}`);
207
+ if (schedule.repoId !== repoId) throw new ScheduleStoreError(scheduleId);
162
208
  return {
163
209
  ...schedule,
164
210
  revision: Number.isFinite(schedule.revision) ? schedule.revision : 1,
@@ -194,7 +240,7 @@ function persistScheduleRevision(
194
240
  * writers fail closed instead of overwriting a newer decision.
195
241
  */
196
242
  export function saveSchedule(controllerHome: string, schedule: RepositorySchedule): RepositorySchedule {
197
- return withControllerLock(controllerHome, { scope: 'task', repoId: schedule.repoId, taskId: `schedule-${schedule.scheduleId}` }, `save-schedule:${schedule.scheduleId}`, () => {
243
+ return withControllerLock(controllerHome, { scope: 'global', resource: `schedule:${schedule.scheduleId}` }, `save-schedule:${schedule.scheduleId}`, () => {
198
244
  const current = getSchedule(controllerHome, schedule.repoId, schedule.scheduleId);
199
245
  if (schedule.revision !== current.revision) {
200
246
  throw new Error(`SCHEDULE_REVISION_CONFLICT: ${schedule.scheduleId}:expected=${schedule.revision}:actual=${current.revision}`);
@@ -215,7 +261,7 @@ export function updateSchedule(
215
261
  scheduleId: string,
216
262
  update: (current: RepositorySchedule) => ScheduleMutableUpdate,
217
263
  ): RepositorySchedule {
218
- return withControllerLock(controllerHome, { scope: 'task', repoId, taskId: `schedule-${scheduleId}` }, `update-schedule:${scheduleId}`, () => {
264
+ return withControllerLock(controllerHome, { scope: 'global', resource: `schedule:${scheduleId}` }, `update-schedule:${scheduleId}`, () => {
219
265
  const current = getSchedule(controllerHome, repoId, scheduleId);
220
266
  const changes = update(current);
221
267
  return persistScheduleRevision(controllerHome, current, { ...current, ...changes });
@@ -223,23 +269,34 @@ export function updateSchedule(
223
269
  }
224
270
 
225
271
  export function listSchedules(controllerHome: string, repoId: string): RepositorySchedule[] {
226
- const root = join(schedulesRoot(controllerHome, repoId), 'records');
227
- try {
228
- return readdirSync(root).filter((name) => name.endsWith('.json'))
229
- .map((name) => getSchedule(controllerHome, repoId, name.slice(0, -'.json'.length)))
230
- .sort((a, b) => a.createdAt.localeCompare(b.createdAt));
231
- } catch { return []; }
272
+ const ids = new Set<string>();
273
+ for (const root of [join(schedulesRoot(controllerHome), 'records'), join(legacySchedulesRoot(controllerHome, repoId), 'records')]) {
274
+ try {
275
+ for (const name of readdirSync(root)) if (name.endsWith('.json')) ids.add(name.slice(0, -'.json'.length));
276
+ } catch { /* missing storage root is empty */ }
277
+ }
278
+ return [...ids]
279
+ .flatMap((scheduleId) => {
280
+ try {
281
+ const schedule = getSchedule(controllerHome, repoId, scheduleId);
282
+ return schedule.repoId === repoId ? [schedule] : [];
283
+ } catch (error) {
284
+ if (error instanceof ScheduleStoreError && error.code === 'SCHEDULE_REPOSITORY_PROVENANCE_MISMATCH') return [];
285
+ throw error;
286
+ }
287
+ })
288
+ .sort((a, b) => a.createdAt.localeCompare(b.createdAt));
232
289
  }
233
290
 
234
291
  export function deleteSchedule(controllerHome: string, repoId: string, scheduleId: string): RepositorySchedule {
235
- return withControllerLock(controllerHome, { scope: 'task', repoId, taskId: `schedule-${scheduleId}` }, `delete-schedule:${scheduleId}`, () => {
292
+ return withControllerLock(controllerHome, { scope: 'global', resource: `schedule:${scheduleId}` }, `delete-schedule:${scheduleId}`, () => {
236
293
  const current = getSchedule(controllerHome, repoId, scheduleId);
237
294
  if (current.enabled) throw new Error(`SCHEDULE_DELETE_REQUIRES_PAUSED: ${scheduleId}`);
238
295
  if (listActiveOccurrences(controllerHome, repoId, scheduleId).length > 0) {
239
296
  throw new Error(`SCHEDULE_DELETE_ACTIVE_OCCURRENCE: ${scheduleId}`);
240
297
  }
241
298
  rmSync(schedulePath(controllerHome, repoId, scheduleId), { force: true });
242
- const requestRecordPath = requestPath(controllerHome, repoId, current.requestId);
299
+ const requestRecordPath = requestPath(controllerHome, requestTargetKey(current), current.requestId);
243
300
  if (existsSync(requestRecordPath)) {
244
301
  const record = readJsonFile<ScheduleRequestRecord>(requestRecordPath);
245
302
  if (record.scheduleId === scheduleId) rmSync(requestRecordPath, { force: true });
@@ -257,83 +314,8 @@ export function deleteSchedule(controllerHome: string, repoId: string, scheduleI
257
314
  }, 10_000);
258
315
  }
259
316
 
260
- function scheduleFailureClass(reason: string): string {
261
- const trimmed = reason.trim();
262
- const explicitCode = trimmed.match(/^([A-Z][A-Z0-9_]{2,})(?::|\b)/)?.[1];
263
- if (explicitCode) return explicitCode;
264
- const prefix = (trimmed.split(':', 1)[0] ?? trimmed)
265
- .replace(/\s+/g, ' ')
266
- .trim()
267
- .toLowerCase()
268
- .slice(0, 120);
269
- return prefix || 'unknown_failure';
270
- }
271
-
272
- function activeScheduleFailureHandoff(
273
- controllerHome: string,
274
- repoId: string,
275
- scheduleId: string,
276
- creationReason: ScheduleOccurrenceHandoffInput['creationReason'],
277
- reason: string,
278
- ) {
279
- const failureClass = scheduleFailureClass(reason);
280
- return listHandoffItems({ controllerHome, repoId, status: 'active', limit: 100 }).find((item) => (
281
- item.currentState?.taskId === scheduleId
282
- && item.creationReason === creationReason
283
- && scheduleFailureClass(item.reason) === failureClass
284
- ));
285
- }
286
-
287
- function stableScheduleFailureHandoffId(
288
- controllerHome: string,
289
- repoId: string,
290
- scheduleId: string,
291
- creationReason: ScheduleOccurrenceHandoffInput['creationReason'],
292
- reason: string,
293
- occurrenceId: string,
294
- ): string {
295
- const digest = createHash('sha256')
296
- .update(`${scheduleId}:${creationReason}:${scheduleFailureClass(reason)}`)
297
- .digest('hex')
298
- .slice(0, 20);
299
- const baseId = `schedule-failure-${digest}`;
300
- if (!getHandoffItem({ controllerHome, repoId }, baseId)) return baseId;
301
- // A previous failure streak may already have resolved the stable item. Handoff
302
- // records are immutable apart from lifecycle status, so use one new epoch id;
303
- // subsequent failures in this streak will discover and reuse the active item.
304
- const epoch = createHash('sha256').update(occurrenceId).digest('hex').slice(0, 8);
305
- return `${baseId}-${epoch}`;
306
- }
307
-
308
- function resolveRecoveredScheduleFailureHandoffs(controllerHome: string, occurrence: ScheduleOccurrence): void {
309
- try {
310
- const active = listHandoffItems({ controllerHome, repoId: occurrence.repoId, status: 'active', limit: 100 })
311
- .filter((item) => (
312
- item.currentState?.taskId === occurrence.scheduleId
313
- && item.creationReason === 'repeated_infrastructure_failure'
314
- ));
315
- for (const item of active) {
316
- try {
317
- resolveHandoffItem(
318
- { controllerHome, repoId: occurrence.repoId },
319
- item.id,
320
- {
321
- decision: `Schedule ${occurrence.scheduleId} recovered on occurrence ${occurrence.occurrenceId}.`,
322
- resolver: 'schedule-runtime',
323
- },
324
- );
325
- } catch {
326
- // The succeeded occurrence remains authoritative. Inbox cleanup is
327
- // best-effort and must never turn schedule recovery into a failure.
328
- }
329
- }
330
- } catch {
331
- // Preserve successful Schedule settlement even if Inbox storage is unavailable.
332
- }
333
- }
334
-
335
317
  export function saveOccurrence(controllerHome: string, occurrence: ScheduleOccurrence): ScheduleOccurrence {
336
- const next = withControllerLock(controllerHome, { scope: 'task', repoId: occurrence.repoId, taskId: `schedule-${occurrence.scheduleId}` }, `save-occurrence:${occurrence.occurrenceId}`, () => {
318
+ const next = withControllerLock(controllerHome, { scope: 'global', resource: `schedule:${occurrence.scheduleId}` }, `save-occurrence:${occurrence.occurrenceId}`, () => {
337
319
  const existingPath = occurrencePath(controllerHome, occurrence.repoId, occurrence.occurrenceId);
338
320
  const previous = existsSync(existingPath) ? readJsonFile<ScheduleOccurrence>(existingPath) : undefined;
339
321
  const expectedRevision = previous?.revision ?? 0;
@@ -347,13 +329,17 @@ export function saveOccurrence(controllerHome: string, occurrence: ScheduleOccur
347
329
  appendRuntimeEvent(controllerHome, { repoId: saved.repoId, entityType: 'occurrence', entityId: saved.occurrenceId, eventType: `occurrence_${saved.status}`, requestId: `${schedule.requestId}:${saved.windowKey}`, revision: saved.revision, correlationId: saved.scheduleId, data: { decision: saved.decision, jobId: saved.jobId, reason: saved.reason } });
348
330
  return saved;
349
331
  }, 10_000);
350
- if (next.status === 'succeeded' || next.status === 'dispatched') resolveRecoveredScheduleFailureHandoffs(controllerHome, next);
351
332
  return next;
352
333
  }
353
334
 
354
335
  export function getOccurrence(controllerHome: string, repoId: string, occurrenceId: string): ScheduleOccurrence | undefined {
355
- const path = occurrencePath(controllerHome, repoId, occurrenceId);
356
- return existsSync(path) ? readJsonFile<ScheduleOccurrence>(path) : undefined;
336
+ const canonicalPath = occurrencePath(controllerHome, repoId, occurrenceId);
337
+ if (existsSync(canonicalPath)) {
338
+ const occurrence = readJsonFile<ScheduleOccurrence>(canonicalPath);
339
+ return occurrence.repoId === repoId ? occurrence : undefined;
340
+ }
341
+ const legacyPath = legacyOccurrencePath(controllerHome, repoId, occurrenceId);
342
+ return existsSync(legacyPath) ? readJsonFile<ScheduleOccurrence>(legacyPath) : undefined;
357
343
  }
358
344
 
359
345
  export function recordScheduleOccurrenceHandoff(
@@ -363,20 +349,7 @@ export function recordScheduleOccurrenceHandoff(
363
349
  input: ScheduleOccurrenceHandoffInput,
364
350
  ): ScheduleOccurrence {
365
351
  if (occurrence.handoffId) return occurrence;
366
- const reusable = input.creationReason === 'repeated_infrastructure_failure'
367
- ? activeScheduleFailureHandoff(controllerHome, occurrence.repoId, schedule.scheduleId, input.creationReason, input.reason)
368
- : undefined;
369
- if (reusable) return saveOccurrence(controllerHome, { ...occurrence, handoffId: reusable.id });
370
- const handoffId = input.creationReason === 'repeated_infrastructure_failure'
371
- ? stableScheduleFailureHandoffId(
372
- controllerHome,
373
- occurrence.repoId,
374
- schedule.scheduleId,
375
- input.creationReason,
376
- input.reason,
377
- occurrence.occurrenceId,
378
- )
379
- : `schedule-${occurrence.occurrenceId}`;
352
+ const handoffId = `schedule-${occurrence.occurrenceId}`;
380
353
  const evidenceRefs: NonNullable<ScheduleOccurrenceHandoffInput['evidenceRefs']> = [
381
354
  { title: `Occurrence ${occurrence.occurrenceId}`, summary: occurrence.reason ?? input.reason, detailLevel: 'summary' as const },
382
355
  ];
@@ -434,6 +407,36 @@ export function listActiveOccurrences(controllerHome: string, repoId: string, sc
434
407
  });
435
408
  }
436
409
 
410
+ /**
411
+ * A created occurrence must be settled by the same evaluateSchedule call that
412
+ * creates it. If the process dies or an early Controller/Supervisor exception
413
+ * escapes before that settlement, leaving it active permanently blocks the
414
+ * schedule's maxActiveOccurrences admission. Reclaim only old `created`
415
+ * records; queued/running work remains owned by the normal worker recovery
416
+ * path.
417
+ */
418
+ export function reclaimStaleCreatedOccurrences(
419
+ controllerHome: string,
420
+ repoId: string,
421
+ scheduleId: string,
422
+ nowMs = Date.now(),
423
+ staleAfterMs = SCHEDULE_CREATED_OCCURRENCE_STALE_MS,
424
+ ): ScheduleOccurrence[] {
425
+ const threshold = Math.max(1_000, staleAfterMs);
426
+ return listActiveOccurrences(controllerHome, repoId, scheduleId)
427
+ .filter((occurrence) => occurrence.status === 'created')
428
+ .filter((occurrence) => {
429
+ const createdAt = Date.parse(occurrence.createdAt);
430
+ return Number.isFinite(createdAt) && nowMs - createdAt >= threshold;
431
+ })
432
+ .map((occurrence) => saveOccurrence(controllerHome, {
433
+ ...occurrence,
434
+ status: 'skipped',
435
+ decision: 'operation_blocked',
436
+ reason: `Orphaned created occurrence reclaimed after ${threshold}ms without Scheduler settlement.`,
437
+ }));
438
+ }
439
+
437
440
  export function listOccurrences(controllerHome: string, repoId: string, scheduleId?: string, limit = 100): ScheduleOccurrence[] {
438
441
  const bounded = Math.max(1, Math.min(limit, 1000));
439
442
  const index = readOccurrenceIndex(controllerHome, repoId);
@@ -446,15 +449,17 @@ export function listOccurrences(controllerHome: string, repoId: string, schedule
446
449
  });
447
450
  if (indexed.length > 0) return indexed;
448
451
 
449
- const root = join(schedulesRoot(controllerHome, repoId), 'occurrences');
452
+ const roots = [join(schedulesRoot(controllerHome), 'occurrences'), join(legacySchedulesRoot(controllerHome, repoId), 'occurrences')];
450
453
  try {
451
- const legacy = readdirSync(root).filter((name) => name.endsWith('.json'))
452
- .map((name) => readJsonFile<ScheduleOccurrence>(join(root, name)))
454
+ const legacy = roots.flatMap((root) => {
455
+ try { return readdirSync(root).filter((name) => name.endsWith('.json')).map((name) => readJsonFile<ScheduleOccurrence>(join(root, name))); }
456
+ catch { return []; }
457
+ })
453
458
  .filter((entry) => !scheduleId || entry.scheduleId === scheduleId)
454
459
  .sort((a, b) => b.createdAt.localeCompare(a.createdAt))
455
460
  .slice(0, bounded);
456
461
  if (legacy.length > 0) {
457
- withControllerLock(controllerHome, { scope: 'repository', repoId }, `schedule-index-backfill:${repoId}`, () => {
462
+ withControllerLock(controllerHome, { scope: 'global', resource: `schedule-index:${repoId}` }, `schedule-index-backfill:${repoId}`, () => {
458
463
  for (const occurrence of legacy) upsertOccurrenceIndexUnlocked(controllerHome, occurrence);
459
464
  }, 10_000);
460
465
  }
@@ -543,7 +548,7 @@ export function cleanupScheduleOccurrenceHistory(
543
548
  return true;
544
549
  };
545
550
 
546
- const occurrenceRoot = join(schedulesRoot(controllerHome, repoId), 'occurrences');
551
+ const occurrenceRoot = join(schedulesRoot(controllerHome), 'occurrences');
547
552
  let occurrenceNames: string[] = [];
548
553
  try { occurrenceNames = readdirSync(occurrenceRoot).filter((name) => name.endsWith('.json')).sort(); }
549
554
  catch { occurrenceNames = []; }
@@ -568,7 +573,7 @@ export function cleanupScheduleOccurrenceHistory(
568
573
  }
569
574
  if (!canRemove()) break;
570
575
  try {
571
- withControllerLock(controllerHome, { scope: 'task', repoId, taskId: `schedule-${occurrence.scheduleId}` }, `cleanup-schedule-occurrence:${occurrence.occurrenceId}`, () => {
576
+ withControllerLock(controllerHome, { scope: 'global', resource: `schedule:${occurrence.scheduleId}` }, `cleanup-schedule-occurrence:${occurrence.occurrenceId}`, () => {
572
577
  if (retainedOccurrenceIds(readOccurrenceIndex(controllerHome, repoId)).has(occurrence.occurrenceId)) {
573
578
  skip('indexed_occurrence_recheck');
574
579
  return;
@@ -588,7 +593,7 @@ export function cleanupScheduleOccurrenceHistory(
588
593
  }
589
594
  }
590
595
 
591
- const decisionRoot = join(schedulesRoot(controllerHome, repoId), 'decisions');
596
+ const decisionRoot = join(schedulesRoot(controllerHome), 'decisions');
592
597
  let decisionNames: string[] = [];
593
598
  try { decisionNames = readdirSync(decisionRoot).filter((name) => name.endsWith('.json')).sort(); }
594
599
  catch { decisionNames = []; }
@@ -615,7 +620,7 @@ export function cleanupScheduleOccurrenceHistory(
615
620
  }
616
621
  if (!canRemove()) break;
617
622
  try {
618
- withControllerLock(controllerHome, { scope: 'task', repoId, taskId: `schedule-${decision.scheduleId}` }, `cleanup-schedule-decision:${decision.decisionId}`, () => {
623
+ withControllerLock(controllerHome, { scope: 'global', resource: `schedule:${decision.scheduleId}` }, `cleanup-schedule-decision:${decision.decisionId}`, () => {
619
624
  if (retainedOccurrenceIds(readOccurrenceIndex(controllerHome, repoId)).has(decision.occurrenceId)) {
620
625
  skip('indexed_decision_recheck');
621
626
  return;
@@ -640,7 +645,7 @@ export function cleanupScheduleOccurrenceHistory(
640
645
 
641
646
 
642
647
  export function saveScheduleDecision(controllerHome: string, decision: ScheduleDecision): ScheduleDecision {
643
- return withControllerLock(controllerHome, { scope: 'task', repoId: decision.repoId, taskId: `schedule-${decision.scheduleId}` }, `save-schedule-decision:${decision.decisionId}`, () => {
648
+ return withControllerLock(controllerHome, { scope: 'global', resource: `schedule:${decision.scheduleId}` }, `save-schedule-decision:${decision.decisionId}`, () => {
644
649
  const path = decisionPath(controllerHome, decision.repoId, decision.decisionId);
645
650
  if (existsSync(path)) return readJsonFile<ScheduleDecision>(path);
646
651
  writeJsonAtomic(path, decision);
@@ -659,8 +664,13 @@ export function saveScheduleDecision(controllerHome: string, decision: ScheduleD
659
664
  }
660
665
 
661
666
  export function getScheduleDecision(controllerHome: string, repoId: string, decisionId: string): ScheduleDecision | undefined {
662
- const path = decisionPath(controllerHome, repoId, decisionId);
663
- return existsSync(path) ? readJsonFile<ScheduleDecision>(path) : undefined;
667
+ const canonicalPath = decisionPath(controllerHome, repoId, decisionId);
668
+ if (existsSync(canonicalPath)) {
669
+ const decision = readJsonFile<ScheduleDecision>(canonicalPath);
670
+ return decision.repoId === repoId ? decision : undefined;
671
+ }
672
+ const legacyPath = legacyDecisionPath(controllerHome, repoId, decisionId);
673
+ return existsSync(legacyPath) ? readJsonFile<ScheduleDecision>(legacyPath) : undefined;
664
674
  }
665
675
 
666
676
 
@@ -765,7 +775,7 @@ export function buildScheduleDedupeReport(controllerHome: string, repoId: string
765
775
  export function applyScheduleDedupe(controllerHome: string, repoId: string, input: { dryRun?: unknown; confirmAuthorization?: unknown } = {}): ScheduleDedupeApplyResult {
766
776
  const dryRun = input.dryRun === true;
767
777
  if (!dryRun && input.confirmAuthorization !== true) throw new Error('SCHEDULE_DEDUPE_AUTHORIZATION_REQUIRED: confirm_authorization must be true to pause duplicate schedules');
768
- return withControllerLock(controllerHome, { scope: 'task', repoId, taskId: 'schedule-dedupe' }, `schedule-dedupe:${repoId}`, () => {
778
+ return withControllerLock(controllerHome, { scope: 'global', resource: `schedule-dedupe:${repoId}` }, `schedule-dedupe:${repoId}`, () => {
769
779
  const report = buildScheduleDedupeReport(controllerHome, repoId);
770
780
  const disabled: ScheduleDedupeApplyResult['disabled'] = [];
771
781
  if (!dryRun) {
@@ -783,3 +793,13 @@ export function applyScheduleDedupe(controllerHome: string, repoId: string, inpu
783
793
  return { repoId, appliedAt: new Date().toISOString(), dryRun, report, disabled };
784
794
  }, 10_000);
785
795
  }
796
+
797
+ export function getScheduleDefinition(controllerHome: string, repoId: string, scheduleId: string): ScheduleDefinition {
798
+ const schedule = getSchedule(controllerHome, repoId, scheduleId);
799
+ return extractScheduleDefinition(schedule);
800
+ }
801
+
802
+ export function getScheduleRuntimeState(controllerHome: string, repoId: string, scheduleId: string): ScheduleRuntimeState {
803
+ const schedule = getSchedule(controllerHome, repoId, scheduleId);
804
+ return extractScheduleRuntimeState(schedule);
805
+ }
@@ -1,15 +1,16 @@
1
1
  /** Stable in-process API for the Kernel Work module. */
2
2
  export * from '../application/work-service';
3
3
  export * from '../domain/implementation-review';
4
- export * from '../domain/admission-policy';
5
4
  export * from '../domain/check-receipt';
6
5
  export * from '../domain/context-closure-receipt';
6
+ export * from '../domain/current-task-lineage';
7
+ export * from '../domain/objective-graph';
7
8
  export * from '../domain/execution-snapshot';
8
9
  export * from '../domain/execution-concurrency';
9
10
  export * from '../domain/engineering-contracts';
10
11
  export * from '../domain/engineering-design';
11
12
  export * from '../domain/engineering-profile';
13
+ export * from '../domain/evaluation-promotion-receipt';
12
14
  export * from '../domain/project-engineering-contract';
13
15
  export * from '../domain/repository-completion-receipt';
14
- export * from '../domain/state-machine';
15
16
  export * from '../domain/types';
@@ -1,11 +1,8 @@
1
1
  import {
2
2
  appendWorkEvidence as persistWorkEvidence,
3
3
  getWorkContract as readWorkContract,
4
- recordWorkCompletionReceipt as persistWorkCompletionReceipt,
4
+ recordWorkCompletionReceipt as persistWorkDeliveryReceipt,
5
5
  canonicalizeWorkContractForAuthority,
6
- rebindPlanBoundWorkContract as buildPlanBoundWorkRebind,
7
- refreshPlanBoundWorkRevision as buildPlanBoundWorkRevisionRefresh,
8
- retirePlanBoundWorkContract as buildPlanBoundWorkRetirement,
9
6
  } from '../infrastructure/work-contract-store';
10
7
  import type { WorkContract } from '../domain/types';
11
8
  import type { WorkContractStoreOptions } from '../ports/work-contract-store';
@@ -20,11 +17,10 @@ export interface CompleteRemoteEffectProcessInput {
20
17
  }
21
18
 
22
19
  /**
23
- * Application command for terminalizing a Work from one trusted repository
24
- * remote-effect Process receipt. Gateway supplies evidence identity only; Work
25
- * kind checks, evidence append, and terminal lifecycle mutation stay here.
20
+ * Record one trusted repository remote-effect Process receipt as Work evidence.
21
+ * This never changes semantic Work state; the model/user decides completion via complete.
26
22
  */
27
- export function completeRemoteEffectWorkFromProcessReceipt(
23
+ export function recordRemoteEffectWorkProcessReceipt(
28
24
  options: WorkContractStoreOptions,
29
25
  workId: string,
30
26
  input: CompleteRemoteEffectProcessInput,
@@ -34,7 +30,7 @@ export function completeRemoteEffectWorkFromProcessReceipt(
34
30
  if (work.workKind !== 'remote_effect') {
35
31
  throw new Error(`WORK_REMOTE_EFFECT_PROCESS_KIND_MISMATCH: ${workId} is ${work.workKind}, expected remote_effect`);
36
32
  }
37
- if (work.status === 'completed' && work.completionReceipt?.source === 'remote_effect') return work;
33
+ if (work.completionReceipt?.source === 'remote_effect') return work;
38
34
  if (!work.evidenceRefs.some((candidate) => candidate.evidenceId === input.processId)) {
39
35
  persistWorkEvidence(options, workId, {
40
36
  evidenceId: input.processId,
@@ -43,7 +39,7 @@ export function completeRemoteEffectWorkFromProcessReceipt(
43
39
  detailLevel: 'summary',
44
40
  });
45
41
  }
46
- return persistWorkCompletionReceipt(
42
+ return persistWorkDeliveryReceipt(
47
43
  options,
48
44
  workId,
49
45
  {
@@ -77,15 +73,21 @@ export {
77
73
  emptyWorkContractStore,
78
74
  readWorkContractStore,
79
75
  writeWorkContractStore,
76
+ createWorkSemanticContext,
80
77
  createWorkContract,
81
78
  getWorkContractByRequestId,
82
79
  acceptSubmittedWorkContract,
83
80
  listWorkContracts,
84
81
  readActiveWorkCandidates,
82
+ readWorkContractLineageSnapshot,
85
83
  initializeWorkCandidateIndex,
86
84
  isCurrentWorkContract,
87
85
  supersedeWorkContract,
88
86
  getWorkContract,
87
+ semanticWorkState,
88
+ workSemanticView,
89
+ listWorkSemanticRevisionRecords,
90
+ reviseWorkSemanticContext,
89
91
  summarizeWorkContract,
90
92
  updateWorkContract,
91
93
  promoteWorkToRepositoryChange,
@@ -93,13 +95,10 @@ export {
93
95
  activateWorkContract,
94
96
  failWorkContract,
95
97
  cancelWorkContract,
96
- resumeRetainedCancelledWorkContract,
98
+ recordCancelledWorkCleanupCompleted,
97
99
  recordWorkScopeEvidence,
98
100
  transitionWorkContractPhase,
99
- requestWorkImplementationReview,
100
101
  recordWorkImplementationReview,
101
- recordContentEquivalentCommitAuthorityTransfer,
102
- reconcileApprovedWorkImplementationReviewProjection,
103
102
  appendWorkEvidence,
104
103
  appendWorkHandoffRef,
105
104
  appendVerificationRecord,
@@ -107,42 +106,18 @@ export {
107
106
  canonicalizeWorkContractForAuthority,
108
107
  } from '../infrastructure/work-contract-store';
109
108
  export type {
109
+ CreateWorkSemanticInput,
110
110
  CreateWorkContractInput,
111
111
  ListWorkContractOptions,
112
112
  InvalidActiveWorkCandidate,
113
113
  ActiveWorkCandidateSnapshot,
114
+ WorkContractLineageSnapshot,
114
115
  SupersedeWorkContractInput,
115
116
  WorkContractSummary,
117
+ WorkSemanticRevisionRecord,
118
+ ReviseWorkSemanticInput,
116
119
  AcceptSubmittedWorkInput,
117
120
  WorkContractStoreLocation,
118
121
  WorkContractStoreOptions,
119
122
  WorkContractMetadataPatch,
120
123
  } from '../infrastructure/work-contract-store';
121
-
122
- /**
123
- * Public Work application command for constructing a validated scope-only
124
- * successor-Plan binding. Persistence remains with the caller so a higher-level
125
- * control-plane transaction can atomically update Plan + Work authority.
126
- */
127
- export function rebindPlanBoundWorkContract(
128
- current: WorkContract,
129
- input: Parameters<typeof buildPlanBoundWorkRebind>[1],
130
- ): WorkContract {
131
- return buildPlanBoundWorkRebind(current, input);
132
- }
133
-
134
- /** Build a validated terminal authority-retirement transition for a Work whose Plan is no longer current. */
135
- /** Refresh a Work against a newer revision of the same stable Plan identity. */
136
- export function refreshPlanBoundWorkRevision(
137
- current: WorkContract,
138
- input: Parameters<typeof buildPlanBoundWorkRevisionRefresh>[1],
139
- ): WorkContract {
140
- return buildPlanBoundWorkRevisionRefresh(current, input);
141
- }
142
-
143
- export function retirePlanBoundWorkContract(
144
- current: WorkContract,
145
- input: Parameters<typeof buildPlanBoundWorkRetirement>[1],
146
- ): WorkContract {
147
- return buildPlanBoundWorkRetirement(current, input);
148
- }