@moretea-labs/forge 1.6.0 → 1.7.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 (469) hide show
  1. package/AGENTS.md +4 -0
  2. package/CHANGELOG.md +39 -0
  3. package/CLAUDE.md +4 -0
  4. package/README.md +2 -2
  5. package/README.zh-CN.md +1 -1
  6. package/SKILL.md +2 -2
  7. package/THIRD_PARTY_NOTICES.md +1 -1
  8. package/agents/openai.yaml +1 -1
  9. package/assets/hooks/hook-input.sh +11 -8
  10. package/assets/hooks/lib/session-state.sh +10 -7
  11. package/assets/hooks/lib/workflow-state.sh +13 -177
  12. package/assets/hooks/post-tool-observer.sh +8 -2
  13. package/assets/hooks/prompt-guard.sh +5 -81
  14. package/assets/hooks/session-start-context.sh +56 -1
  15. package/assets/partials/05-workflow.partial.md +1 -1
  16. package/assets/partials-agents/02-operating-mode.partial.md +2 -0
  17. package/assets/partials-agents/03-orchestration.partial.md +1 -1
  18. package/assets/plugin-registry.v1.json +3 -3
  19. package/assets/reference-configs/document-generation.md +1 -1
  20. package/assets/reference-configs/harness-overview.md +1 -1
  21. package/assets/reference-configs/sprint-contracts.md +3 -3
  22. package/assets/skill-version.json +2 -2
  23. package/assets/templates/contract.template.md +2 -7
  24. package/assets/templates/helpers/capture-plan.sh +2 -2
  25. package/assets/templates/helpers/check-architecture-sync.sh +17 -0
  26. package/assets/templates/helpers/check-task-workflow.sh +4 -4
  27. package/assets/templates/helpers/contract-worktree.sh +1 -21
  28. package/assets/templates/helpers/ensure-task-workflow.sh +11 -36
  29. package/assets/templates/helpers/inspect-project-state.ts +8 -6
  30. package/assets/templates/helpers/migrate-project-template.sh +22 -45
  31. package/assets/templates/helpers/migrate-workflow-docs.ts +9 -7
  32. package/assets/templates/helpers/new-plan.sh +1 -1
  33. package/assets/templates/helpers/plan-to-todo.sh +12 -37
  34. package/assets/templates/helpers/ship-worktrees.sh +2 -29
  35. package/assets/templates/helpers/verify-contract.sh +1 -111
  36. package/assets/templates/helpers/verify-sprint.sh +3 -180
  37. package/assets/templates/helpers/workflow-contract.ts +5 -1
  38. package/assets/templates/plan.template.md +1 -1
  39. package/assets/templates/review.template.md +9 -34
  40. package/assets/workflow-contract.v1.json +10 -19
  41. package/docs/README.md +10 -10
  42. package/docs/architecture/CURRENT.md +178 -0
  43. package/docs/architecture/EVOLUTION.md +42 -0
  44. package/docs/architecture/current/README.md +4 -156
  45. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
  46. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
  47. package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
  48. package/docs/architecture/history/README.md +7 -0
  49. package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
  50. package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
  51. package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
  52. package/docs/architecture/history.md +3 -34
  53. package/docs/architecture/index.md +15 -98
  54. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  55. package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
  56. package/docs/architecture/versions/1.6.md +38 -0
  57. package/docs/architecture/versions/1.7.md +41 -0
  58. package/docs/forge-chatgpt-browser-engine.md +2 -2
  59. package/docs/forge-chatgpt-mcp-setup.md +4 -28
  60. package/docs/forge-chatgpt-supervised-automation.md +3 -3
  61. package/docs/forge-github-issue-launcher.md +1 -1
  62. package/docs/forge-plugin-management.md +1 -1
  63. package/docs/forge-runtime-self-healing-loop.md +1 -1
  64. package/docs/operations/controller-browser-plugin.md +26 -6
  65. package/docs/operations/controller-performance-and-502.md +143 -0
  66. package/docs/operations/controller-reliability-runbook.md +1 -1
  67. package/docs/operations/features.md +2 -2
  68. package/docs/operations/github-repository.md +1 -1
  69. package/docs/operations/homebrew.md +2 -2
  70. package/docs/operations/mcp-tool-exposure.md +5 -3
  71. package/docs/wiki/Architecture.md +6 -6
  72. package/docs/wiki/Implementation.md +2 -2
  73. package/docs/wiki/Integrations.md +2 -2
  74. package/docs/wiki/Work-Lifecycle.md +1 -1
  75. package/package.json +33 -11
  76. package/scripts/activate-source-baseline.ts +17 -13
  77. package/scripts/architecture-event.ts +2 -820
  78. package/scripts/architecture-queue.sh +2 -645
  79. package/scripts/archive-architecture-request.sh +2 -242
  80. package/scripts/archive-workflow.sh +1 -291
  81. package/scripts/benchmark-background-check-overlap.ts +228 -0
  82. package/scripts/benchmark-mcp-host.sh +117 -0
  83. package/scripts/benchmark-mcp-transport.ts +170 -0
  84. package/scripts/benchmark-quality-harness.ts +146 -0
  85. package/scripts/benchmark-route-session-concurrency.ts +207 -6
  86. package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
  87. package/scripts/benchmark-typescript-navigation.ts +186 -0
  88. package/scripts/benchmark-work-efficiency.ts +334 -0
  89. package/scripts/capability-config.ts +2 -392
  90. package/scripts/capability-resolver.ts +2 -503
  91. package/scripts/capture-plan.sh +1 -332
  92. package/scripts/check-agent-tooling.sh +2 -1558
  93. package/scripts/check-architecture-sync.sh +2 -371
  94. package/scripts/check-brain-manifest.sh +2 -253
  95. package/scripts/check-context-files.sh +2 -47
  96. package/scripts/check-deploy-sql-order.sh +2 -115
  97. package/scripts/check-mcp-compatibility.ts +14 -0
  98. package/scripts/check-runtime-architecture.mjs +349 -79
  99. package/scripts/check-skill-version.ts +3 -191
  100. package/scripts/check-source-duplication.mjs +61 -0
  101. package/scripts/check-stable-baseline.ts +92 -0
  102. package/scripts/check-task-sync.sh +2 -63
  103. package/scripts/check-task-workflow.sh +2 -1000
  104. package/scripts/codex-handoff-resume.sh +2 -267
  105. package/scripts/context-contract-sync.sh +2 -514
  106. package/scripts/contract-run.ts +2 -463
  107. package/scripts/contract-worktree.sh +1 -722
  108. package/scripts/ensure-task-workflow.sh +1 -1225
  109. package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
  110. package/scripts/inspect-project-state.ts +4 -279
  111. package/scripts/install-standalone-recovery.ts +24 -0
  112. package/scripts/lib/project-init-lib.sh +22 -46
  113. package/scripts/lib/run-forge-helper.sh +19 -0
  114. package/scripts/lib/run-forge-helper.ts +26 -0
  115. package/scripts/migrate-project-template.sh +1 -1189
  116. package/scripts/migrate-workflow-docs.ts +4 -412
  117. package/scripts/new-plan.sh +1 -180
  118. package/scripts/new-spec.sh +1 -47
  119. package/scripts/new-sprint.sh +1 -46
  120. package/scripts/plan-to-todo.sh +1 -796
  121. package/scripts/prepare-codex-handoff.sh +2 -201
  122. package/scripts/prepare-handoff.sh +1 -78
  123. package/scripts/refresh-current-status.sh +2 -467
  124. package/scripts/run-governed-gate.ts +5 -1
  125. package/scripts/select-agent-context-blocks.sh +2 -64
  126. package/scripts/ship-worktrees.sh +1 -558
  127. package/scripts/smoke-ios-physical-device.ts +4 -2
  128. package/scripts/smoke-runtime-recovery.ts +1 -35
  129. package/scripts/smoke-schedule-engine.ts +1 -20
  130. package/scripts/sprint-backlog.sh +1 -834
  131. package/scripts/stage-runtime-release.ts +2 -1
  132. package/scripts/summarize-failures.sh +2 -123
  133. package/scripts/switch-plan.sh +1 -150
  134. package/scripts/sync-brain-docs.sh +2 -379
  135. package/scripts/sync-generated-authority.mjs +175 -0
  136. package/scripts/verify-contract.sh +2 -703
  137. package/scripts/verify-forge-runtime.sh +0 -1
  138. package/scripts/verify-sprint.sh +1 -677
  139. package/scripts/workflow-contract.ts +4 -205
  140. package/scripts/workstream-sync.sh +2 -261
  141. package/src/cli/agent-jobs/executor-health.ts +1 -1
  142. package/src/cli/commands/init-hook.ts +3 -3
  143. package/src/cli/commands/mcp.ts +9 -5
  144. package/src/cli/commands/plugin.ts +12 -3
  145. package/src/cli/commands/recovery.ts +25 -3
  146. package/src/cli/commands/runtime.ts +55 -3
  147. package/src/cli/commands/security.ts +12 -1
  148. package/src/cli/commands/setup-profile.ts +31 -21
  149. package/src/cli/controller/check-runner.ts +113 -5
  150. package/src/cli/controller/composite-result.ts +1 -1
  151. package/src/cli/controller/context/focus.ts +51 -0
  152. package/src/cli/controller/context/instruction-context.ts +114 -0
  153. package/src/cli/controller/context/known-paths.ts +76 -0
  154. package/src/cli/controller/context/query-planning.ts +110 -0
  155. package/src/cli/controller/context/rule-resolution.ts +532 -0
  156. package/src/cli/controller/context/source-materializer.ts +278 -0
  157. package/src/cli/controller/context/structural.ts +16 -0
  158. package/src/cli/controller/context/types.ts +286 -0
  159. package/src/cli/controller/context-pack.ts +828 -487
  160. package/src/cli/controller/launch-agents.ts +77 -2
  161. package/src/cli/controller/operational-plan.ts +2 -2
  162. package/src/cli/controller/work-mode.ts +6 -4
  163. package/src/cli/editing/edit-session.ts +60 -7
  164. package/src/cli/github/contracts.ts +16 -0
  165. package/src/cli/github/github.ts +135 -16
  166. package/src/cli/github/session.ts +2 -1
  167. package/src/cli/installer/managed-entries.ts +15 -1
  168. package/src/cli/local-bridge/console-automations.ts +54 -78
  169. package/src/cli/local-bridge/console-view-models.ts +1 -35
  170. package/src/cli/local-bridge/facade-api.ts +37 -264
  171. package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
  172. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +23 -13
  173. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
  174. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +6 -4
  175. package/src/cli/local-bridge/frontend/src/lib/api.ts +1 -6
  176. package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
  177. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +2 -2
  178. package/src/cli/local-bridge/frontend/src/styles.css +1 -1
  179. package/src/cli/local-bridge/frontend/src/types.ts +5 -8
  180. package/src/cli/local-bridge/job-store.ts +1 -490
  181. package/src/cli/local-bridge/server.ts +2 -515
  182. package/src/cli/local-bridge/ui-dist/app.css +1 -1
  183. package/src/cli/local-bridge/ui-dist/app.js +3703 -3757
  184. package/src/cli/mcp/auth.ts +5 -5
  185. package/src/cli/mcp/instructions.ts +3 -2
  186. package/src/cli/mcp/legacy-tool-service.ts +10 -222
  187. package/src/cli/mcp/multi-repository.ts +16 -5
  188. package/src/cli/mcp/oauth.ts +175 -26
  189. package/src/cli/mcp/post-finalize-work-attribution.ts +150 -0
  190. package/src/cli/mcp/repository-tools.ts +282 -146
  191. package/src/cli/mcp/server.ts +586 -116
  192. package/src/cli/mcp/tool-capability-cache.ts +1 -1
  193. package/src/cli/mcp/tool-contract.ts +14 -0
  194. package/src/cli/mcp/toolset-selection.ts +1 -1
  195. package/src/cli/mcp/toolset.ts +44 -7
  196. package/src/cli/mcp/transports/http.ts +124 -14
  197. package/src/cli/mcp/transports/session-registry.ts +43 -5
  198. package/src/cli/mcp/types.ts +3 -3
  199. package/src/cli/repositories/command-classifier.ts +103 -21
  200. package/src/cli/repositories/command-executor.ts +78 -526
  201. package/src/cli/repositories/command-process.ts +108 -0
  202. package/src/cli/repositories/command-scope.ts +99 -41
  203. package/src/cli/repositories/controller-home.ts +7 -8
  204. package/src/cli/repositories/git-command-executor.ts +2 -0
  205. package/src/cli/repositories/locks.ts +53 -16
  206. package/src/cli/repositories/repository-snapshot.ts +124 -0
  207. package/src/cli/repositories/selected-path-actions.ts +17 -9
  208. package/src/cli/repositories/structured-git.ts +118 -6
  209. package/src/cli/repository/inspector.ts +563 -65
  210. package/src/cli/repository/session-cache.ts +58 -17
  211. package/src/cli/v81-entry.ts +1 -4
  212. package/src/effects/fs-transaction.ts +85 -17
  213. package/src/runtime/context/codegraph-read-provider.ts +233 -2
  214. package/src/runtime/context/codegraph-sidecar.cjs +74 -40
  215. package/src/runtime/context/generic-lsp-provider.ts +355 -0
  216. package/src/runtime/context/lsp-client.ts +283 -0
  217. package/src/runtime/context/semantic-navigation-contract.ts +61 -0
  218. package/src/runtime/context/semantic-navigation.ts +223 -0
  219. package/src/runtime/context/swift-navigation.ts +565 -0
  220. package/src/runtime/context/typescript-navigation.ts +226 -0
  221. package/src/runtime/control-plane/dispatch-priority.ts +28 -0
  222. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +48 -16
  223. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
  224. package/src/runtime/control-plane/execution/repository-work-attribution.ts +106 -0
  225. package/src/runtime/control-plane/execution/retained-work-resume.ts +203 -0
  226. package/src/runtime/control-plane/execution/session-store.ts +18 -0
  227. package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
  228. package/src/runtime/control-plane/execution/work-completion-authority.ts +58 -0
  229. package/src/runtime/control-plane/execution/work-evidence-policy.ts +200 -0
  230. package/src/runtime/control-plane/execution/work-execution-support.ts +386 -0
  231. package/src/runtime/control-plane/execution/work-finalization-service.ts +1913 -0
  232. package/src/runtime/control-plane/execution/work-handle-authority.ts +96 -0
  233. package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
  234. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
  235. package/src/runtime/control-plane/execution/work-operation-service.ts +468 -0
  236. package/src/runtime/control-plane/execution/work-path-scope.ts +37 -0
  237. package/src/runtime/control-plane/execution/work-preparation-service.ts +479 -0
  238. package/src/runtime/control-plane/execution/work-process-evidence.ts +129 -0
  239. package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
  240. package/src/runtime/control-plane/execution/work-task-receipt.ts +22 -18
  241. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +156 -11
  242. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +22 -14
  243. package/src/runtime/control-plane/execution/work-verification-context.ts +56 -0
  244. package/src/runtime/control-plane/execution/work-verification-service.ts +388 -0
  245. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +90 -9
  246. package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
  247. package/src/runtime/control-plane/facade/controller-round-relay.ts +1118 -0
  248. package/src/runtime/control-plane/facade/controller-session-store.ts +302 -12
  249. package/src/runtime/control-plane/facade/goal-workloop-access.ts +17 -1
  250. package/src/runtime/control-plane/facade/goal-workloop.ts +928 -190
  251. package/src/runtime/control-plane/facade/index.ts +3 -0
  252. package/src/runtime/control-plane/facade/plan-contract-store.ts +275 -42
  253. package/src/runtime/control-plane/facade/repository-work-admission.ts +147 -0
  254. package/src/runtime/control-plane/facade/requirement-authority.ts +83 -0
  255. package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
  256. package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
  257. package/src/runtime/control-plane/facade/types.ts +90 -10
  258. package/src/runtime/control-plane/facade/work-contract-store.ts +157 -261
  259. package/src/runtime/control-plane/facade/work-state-machine.ts +250 -0
  260. package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
  261. package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
  262. package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
  263. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
  264. package/src/runtime/control-plane/global-scheduler/maintenance.ts +152 -0
  265. package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
  266. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
  267. package/src/runtime/control-plane/global-scheduler/scheduler.ts +278 -543
  268. package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
  269. package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
  270. package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
  271. package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
  272. package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
  273. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
  274. package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
  275. package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
  276. package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
  277. package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
  278. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +63 -0
  279. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +365 -117
  280. package/src/runtime/control-plane/launcher/launch-reservation-store.ts +89 -0
  281. package/src/runtime/control-plane/launcher/thin-launcher.ts +244 -11
  282. package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
  283. package/src/runtime/control-plane/persistence/requirement-store.ts +0 -12
  284. package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
  285. package/src/runtime/control-plane/release-retention.ts +62 -2
  286. package/src/runtime/control-plane/repo-actor/registry.ts +4 -2
  287. package/src/runtime/control-plane/routing/route-policy.ts +24 -21
  288. package/src/runtime/control-plane/routing/workspace-admission.ts +70 -0
  289. package/src/runtime/control-plane/runtime-status-client.ts +0 -2
  290. package/src/runtime/diagnostics/mcp-timing.ts +13 -0
  291. package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
  292. package/src/runtime/diagnostics/performance.ts +24 -1
  293. package/src/runtime/evidence/event-ledger.ts +1 -1
  294. package/src/runtime/evidence/process-check-execution.ts +18 -0
  295. package/src/runtime/execution/jobs/child-reference.ts +6 -2
  296. package/src/runtime/execution/jobs/store.ts +58 -4
  297. package/src/runtime/execution/jobs/types.ts +1 -1
  298. package/src/runtime/execution/managed-workspace.ts +203 -1
  299. package/src/runtime/execution/process-runtime/check-facade.ts +51 -4
  300. package/src/runtime/execution/process-runtime/check-result.ts +88 -0
  301. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +7 -1
  302. package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
  303. package/src/runtime/execution/process-runtime/command-facade.ts +367 -40
  304. package/src/runtime/execution/process-runtime/gc.ts +38 -6
  305. package/src/runtime/execution/process-runtime/lightweight-managed.ts +1201 -0
  306. package/src/runtime/execution/process-runtime/persisted-check.ts +51 -5
  307. package/src/runtime/execution/process-runtime/resource-claims.ts +10 -6
  308. package/src/runtime/execution/process-runtime/runtime.ts +53 -3
  309. package/src/runtime/execution/process-runtime/store.ts +1 -0
  310. package/src/runtime/execution/process-runtime/types.ts +4 -12
  311. package/src/runtime/execution/thin-harness/async-process.ts +12 -2
  312. package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
  313. package/src/runtime/execution/work-activity.ts +21 -0
  314. package/src/runtime/execution/workers/executor.ts +18 -61
  315. package/src/runtime/gateway/mcp/execution-tools.ts +35 -1852
  316. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +61 -0
  317. package/src/runtime/gateway/mcp/process-tools.ts +83 -37
  318. package/src/runtime/gateway/mcp/router.ts +186 -84
  319. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +565 -0
  320. package/src/runtime/gateway/mcp/runtime-tools.ts +2378 -1947
  321. package/src/runtime/plugins/app-store-connect-adapter.ts +216 -47
  322. package/src/runtime/plugins/browser-adapter.ts +2662 -829
  323. package/src/runtime/plugins/browser-automation-service.ts +10 -0
  324. package/src/runtime/plugins/browser-handoff-host.ts +2 -25
  325. package/src/runtime/plugins/browser-handoff.ts +110 -5
  326. package/src/runtime/plugins/browser-macos-bridge.ts +701 -63
  327. package/src/runtime/plugins/browser-manifest-surface.ts +603 -0
  328. package/src/runtime/plugins/browser-native-session-service.ts +222 -0
  329. package/src/runtime/plugins/browser-node-bridge.ts +6 -34
  330. package/src/runtime/plugins/browser-provider-registry.ts +109 -0
  331. package/src/runtime/plugins/browser-runtime-contract.ts +154 -0
  332. package/src/runtime/plugins/browser-runtime.ts +193 -0
  333. package/src/runtime/plugins/browser-session-authority.ts +332 -0
  334. package/src/runtime/plugins/browser-session-store.ts +121 -0
  335. package/src/runtime/plugins/browser-session-types.ts +98 -0
  336. package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
  337. package/src/runtime/plugins/desktop-operator-registration.ts +10 -4
  338. package/src/runtime/plugins/external-adapter.ts +358 -3
  339. package/src/runtime/plugins/external-unix-socket.ts +7 -1
  340. package/src/runtime/plugins/first-party-registry.ts +2 -0
  341. package/src/runtime/plugins/github-adapter.ts +125 -0
  342. package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
  343. package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
  344. package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
  345. package/src/runtime/plugins/ios-adapter.ts +106 -16
  346. package/src/runtime/plugins/ios-agent-device.ts +234 -64
  347. package/src/runtime/plugins/ios-physical-device.ts +1143 -392
  348. package/src/runtime/plugins/lightweight-action.ts +153 -0
  349. package/src/runtime/plugins/local-system-adapter.ts +123 -6
  350. package/src/runtime/plugins/macos-capability-broker.ts +47 -9
  351. package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
  352. package/src/runtime/plugins/plugin-management-adapter.ts +49 -8
  353. package/src/runtime/plugins/resend-adapter.ts +1 -1
  354. package/src/runtime/plugins/store.ts +330 -33
  355. package/src/runtime/plugins/types.ts +38 -3
  356. package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
  357. package/src/runtime/projections/git-status-sampler.ts +16 -16
  358. package/src/runtime/projections/materialized-view.ts +28 -10
  359. package/src/runtime/recovery/maintenance-executor.ts +426 -25
  360. package/src/runtime/root/mcp-transport.ts +180 -10
  361. package/src/runtime/root/package-connector-service.ts +230 -10
  362. package/src/runtime/root/package-runtime-release.ts +143 -17
  363. package/src/runtime/root/package-runtime-service.ts +461 -22
  364. package/src/runtime/root/release-manifest.ts +144 -18
  365. package/src/runtime/root/release-materialize.ts +125 -32
  366. package/src/runtime/root/release-store.ts +48 -11
  367. package/src/runtime/root/runtime.ts +23 -5
  368. package/src/runtime/root/service.ts +100 -29
  369. package/src/runtime/root/types.ts +12 -0
  370. package/src/runtime/safe-tooling/ios-development.ts +321 -63
  371. package/src/runtime/shared/trusted-executable.ts +62 -0
  372. package/src/runtime/shared/trusted-node-executable.ts +48 -0
  373. package/src/runtime/standalone-recovery/core.ts +1079 -240
  374. package/src/runtime/standalone-recovery/entry.ts +100 -24
  375. package/src/runtime/standalone-recovery/installer.ts +20 -4
  376. package/src/runtime/standalone-recovery/service-labels.ts +2 -0
  377. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
  378. package/src/runtime/workflow/schedules/browser-probe.ts +81 -3
  379. package/src/runtime/workflow/schedules/engine.ts +364 -202
  380. package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
  381. package/src/runtime/workflow/schedules/settlement.ts +64 -17
  382. package/src/runtime/workflow/schedules/store.ts +209 -19
  383. package/src/runtime/workflow/schedules/types.ts +2 -4
  384. package/src/runtime/workflow/schedules/work-continuation.ts +26 -13
  385. package/src/testing/test-governance.ts +8 -40
  386. package/assets/reference-configs/heartbeat-triage.md +0 -57
  387. package/assets/templates/helpers/harness-trace-grade.sh +0 -150
  388. package/assets/templates/helpers/heartbeat-triage.sh +0 -361
  389. package/assets/templates/helpers/maintenance-triage.sh +0 -167
  390. package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
  391. package/docs/architecture/current/architecture-invariants.md +0 -331
  392. package/docs/architecture/current/automation-and-schedule-engine.md +0 -459
  393. package/docs/architecture/current/codegraph-context-provider.md +0 -238
  394. package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
  395. package/docs/architecture/current/controller-repository-decoupling.md +0 -148
  396. package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -373
  397. package/docs/architecture/current/entity-model.md +0 -612
  398. package/docs/architecture/current/external-plugin-governance.md +0 -396
  399. package/docs/architecture/current/failure-recovery.md +0 -447
  400. package/docs/architecture/current/governance.md +0 -213
  401. package/docs/architecture/current/human-interaction-plane.md +0 -87
  402. package/docs/architecture/current/implementation-status.md +0 -128
  403. package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
  404. package/docs/architecture/current/legacy-governance.md +0 -58
  405. package/docs/architecture/current/local-workspace-target-grants.md +0 -70
  406. package/docs/architecture/current/migration-roadmap.md +0 -105
  407. package/docs/architecture/current/multi-repository-execution.md +0 -371
  408. package/docs/architecture/current/operations-runbook.md +0 -45
  409. package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
  410. package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
  411. package/docs/architecture/current/repository-access-modes.md +0 -102
  412. package/docs/architecture/current/route-policy.md +0 -15
  413. package/docs/architecture/current/route-session-concurrency.md +0 -85
  414. package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
  415. package/docs/architecture/current/runtime-directory-map.md +0 -49
  416. package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
  417. package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
  418. package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
  419. package/docs/architecture/current/system-overview.md +0 -169
  420. package/docs/architecture/current/target-requirements-traceability.md +0 -202
  421. package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
  422. package/docs/architecture/current/thin-harness-v1.md +0 -321
  423. package/docs/architecture/current/verification-and-release-gates.md +0 -391
  424. package/docs/forge-autonomous-goal-loop.md +0 -9
  425. package/docs/forge-provider-configuration.md +0 -7
  426. package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -93
  427. package/docs/operations/gmail-assistant-routines.md +0 -186
  428. package/docs/operations/personal-assistant-operator-guide.md +0 -61
  429. package/docs/operations/provider-configuration.md +0 -31
  430. package/scripts/harness-trace-grade.sh +0 -150
  431. package/scripts/heartbeat-triage.sh +0 -361
  432. package/scripts/maintenance-triage.sh +0 -167
  433. package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
  434. package/src/cli/repositories/goal-registry.ts +0 -239
  435. package/src/runtime/assistant/action-proposals.ts +0 -279
  436. package/src/runtime/assistant/intent.ts +0 -395
  437. package/src/runtime/assistant/model-provider.ts +0 -460
  438. package/src/runtime/assistant/openapi.ts +0 -223
  439. package/src/runtime/assistant/policy.ts +0 -89
  440. package/src/runtime/assistant/readiness.ts +0 -258
  441. package/src/runtime/assistant/routine-runtime.ts +0 -477
  442. package/src/runtime/assistant/schedule-binding.ts +0 -171
  443. package/src/runtime/assistant/standing-grants.ts +0 -375
  444. package/src/runtime/assistant/store.ts +0 -243
  445. package/src/runtime/assistant/types.ts +0 -135
  446. package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
  447. package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
  448. package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
  449. package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
  450. package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
  451. package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
  452. package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
  453. package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
  454. package/src/runtime/control-plane/goal-loop/index.ts +0 -13
  455. package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
  456. package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
  457. package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
  458. package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
  459. package/src/runtime/control-plane/goal-loop/types.ts +0 -378
  460. package/src/runtime/control-plane/startup-recovery.ts +0 -198
  461. package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
  462. package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
  463. package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
  464. package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
  465. package/src/runtime/workflow/findings/store.ts +0 -204
  466. package/src/runtime/workflow/findings/types.ts +0 -58
  467. package/src/runtime/workflow/portfolio/engine.ts +0 -20
  468. package/src/runtime/workflow/portfolio/store.ts +0 -185
  469. package/src/runtime/workflow/portfolio/types.ts +0 -29
@@ -1,87 +0,0 @@
1
- # Human Interaction Plane
2
-
3
- ## Purpose
4
-
5
- The Human Interaction Plane preserves a provider session while a person completes CAPTCHA, login, two-factor authentication, device unlock, biometric approval, or another step that automation must not perform.
6
-
7
- ## Current Browser Implementation
8
-
9
- ```text
10
- bounded plugin action
11
- -> durable interaction record
12
- -> detached browser handoff host
13
- -> visible persistent browser + foreground presentation
14
- -> explicit resolve_handoff(resume|cancel)
15
- -> close browser context
16
- -> write terminal state and release profile
17
- ```
18
-
19
- The host is not a Controller, scheduler, Gateway, or MCP server. It owns one browser profile and survives the bounded Worker that requested the handoff.
20
- Browser CDP attach mode is not a human handoff owner; handoff still launches and fences the managed profile path for the saved session, then releases it only through the terminal handoff state.
21
-
22
- Records live below `.forge/interactions/<provider>/` as atomic session, launch, and command files. They contain provider/session identity, Work ownership, host PID/heartbeat, expiry, bounded URL/title results, and capability-local errors. They never copy cookies, passwords, verification codes, or user-entered form values.
23
-
24
- ## State and Ownership
25
-
26
- ```text
27
- starting -> waiting_for_user -> closing -> completed | closed | failed
28
- \-----------------> failed
29
- ```
30
-
31
- - `starting`, `waiting_for_user`, and `closing` own the selected profile.
32
- - Ordinary browser actions and session deletion are rejected while the profile is owned.
33
- - Resume/cancel use separate command files, avoiding concurrent state-file writers.
34
- - Status reads derive stale/dead state without writing files or signalling processes; the next handoff start persists dead-host outcomes and prunes old terminal records to a bounded set.
35
- - The host enforces its own expiry and remains `closing`; the profile is released only after the browser context closes and terminal state is written.
36
- - Final URL/title are saved only after an explicit resume request.
37
-
38
- ## Security and Failure Isolation
39
-
40
- - Existing domain allowlists apply during handoff and again on resume.
41
- - The host uses Playwright foregrounding plus best-effort macOS application activation.
42
- - Human actions are not represented as automated evidence.
43
- - Handoff does not weaken authorization or strong-confirmation requirements for purchases, payment, deletion, or other irreversible actions.
44
- - Host failure is capability-local and must not degrade Controller, repository, or unrelated plugin readiness.
45
-
46
- ## Public Contract
47
-
48
- The browser plugin exposes three actions:
49
-
50
- - `request_human_handoff` — start and foreground a saved session.
51
- - `get_handoff_status` — read/reconcile durable state.
52
- - `resolve_handoff` — explicitly resume or cancel.
53
-
54
- The small surface limits additional plugin schema growth and avoids alias actions with overlapping semantics.
55
-
56
- ## Optional agent-device iOS Provider
57
-
58
- The existing `ios` plugin includes an optional `agent-device` provider with these boundaries:
59
-
60
- - The local CLI must satisfy the reviewed `>=0.19.3 <0.21.0` capability/help contract. Status and evidence record its resolved executable, actual version and contract fingerprint. Forge never downloads tooling at action time.
61
- - The exact optional `agent-device@0.20.2` package provides the typed read-only snapshot backend on Node 22.12 or newer; Node 20 and unavailable/mismatched typed packages fall back to the reviewed CLI contract with explicit evidence. CLI absence or incompatibility degrades only this optional provider. Existing Xcode, `simctl`, build, launch, screenshot, and smoke-review readiness remains unchanged.
62
- - Device inventory comes from bounded `agent-device devices --platform ios --json` output. Simulator selection resolves to exactly one already-booted simulator. A physical iPhone is accepted only through an explicit exact name or UDID and must be connected; unavailable targets and ambiguous names are rejected before app actions.
63
- - Physical sessions use the shared `ios-device` ownership fence while simulator sessions continue to use `ios-simulator`. The interaction record separately declares the `agent-device` or `coredevice` execution engine, so the two implementations cannot consume each other's sessions while still mutually excluding access to the same phone. Legacy schema-v1 records use bounded prefix/reason inference only. Signing inputs are limited to non-secret team and reverse-DNS bundle identifiers, are stored beside the Controller-owned interaction state, and are mapped to agent-device environment variables without persisting certificates, profiles, pairing records, or credentials.
64
- - `agent_device_prepare` explicitly builds, signs, installs, and health-checks the XCTest Runner. Readiness is never inferred from inventory alone: a paired phone can be listed while Runner preparation still fails because the phone is locked, the developer tunnel is unreachable, or signing is incomplete.
65
- - `agent_device_jd_search` is a narrow physical-device workflow for `com.360buy.jdmobile`. It accepts a bounded product-information query, uses accessibility evidence to locate the search field, submits through an explicit target or keyboard return, and returns bounded visible result text. Fresh one-shot calls retain the compatibility behavior of writing one Controller-owned PNG and closing. A caller may instead supply one active physical-iPhone JD `interaction_id`; the trusted warm path reuses that exact fenced session, skips device inventory and app open, defaults to no screenshot, and leaves the session active for the next bounded action. Non-JD, simulator, terminal, expired, or unknown interactions fail before the search batch. Credentials, verification, biometrics, checkout, purchase, order submission, and payment semantics are rejected before mutation.
66
- - Each interaction receives an isolated `AGENT_DEVICE_STATE_DIR` and explicit session name. Direct session commands are serialized by exact interaction identity before process launch, while the provider session lock rejects cross-process collision; only a fixed argv allowlist is exposed, and the provider never invokes `agent-device mcp` or arbitrary commands. The MCP request cancellation signal and the caller's bounded timeout flow only through the current action, are never persisted, and terminate the complete child process group before cleanup. A command cancelled while waiting for its interaction turn never touches or terminalizes that session.
67
- - Screenshots stay in Controller-owned artifact storage. JSON responses are capped before entering evidence; event payload fields and direct fill results are redacted.
68
- - Open accepts only an app name or bundle identifier, not a URL or token-bearing deep link. `fill` is limited to non-sensitive text; passwords and verification codes must be entered manually.
69
- - Command failure, explicit close, or the next access after expiry attempts to close the provider session. Terminal state is written only after close succeeds. For an exact session inside its isolated `AGENT_DEVICE_STATE_DIR`, provider code `SESSION_NOT_FOUND` is also terminal success: it proves there is no provider-owned session left, so the local fence is released rather than remaining permanently `closing`. Other cleanup failures remain `closing`, keep device ownership fenced, and can be retried through the idempotent close action. Fill arguments and diagnostics are redacted from failure evidence. The lightweight interaction record remains bounded, while the provider daemon and a healthy XCTest Runner use configurable finite idle retention (five minutes by default) so adjacent trusted actions do not repeatedly pay cold-start cost; explicit close still terminates ownership immediately.
70
- - Physical iPhone mutation is limited to an explicitly selected device, a healthy signed Runner, authorized typed actions, and the same cleanup/redaction fence. Closing never shuts down a physical phone.
71
-
72
-
73
- ## Physical iOS Computer Use boundary
74
-
75
- The iOS plugin treats a paired physical iPhone as a separate `ios-device` ownership provider. CoreDevice remains the baseline path, while agent-device is an optional signed XCTest engine for bounded direct UI automation.
76
-
77
- The CoreDevice layer is authoritative for bounded device discovery, exact installed-app lookup, foreground application launch, and native PNG screen capture. Device selection is exact by CoreDevice identifier, UDID, or an unambiguous exact name. Responses omit serial numbers, ECIDs, application container paths, pairing records, and signing material.
78
-
79
- UI-tree inspection and input injection are optional. They can use either a separately installed WebDriverAgent-compatible runner forwarded to the configured unauthenticated localhost endpoint, or the pinned local agent-device XCTest Runner prepared with an explicitly supplied Apple team and unique runner bundle identifier. Forge never downloads automation tooling at action time or persists signing credentials. A missing or unhealthy runner leaves CoreDevice launch and screenshot available while UI actions fail closed with typed prerequisite errors.
80
-
81
- Every physical-device mutation is serialized through the interaction session. Text input is removed from results and event evidence. Passwords, passcodes, verification codes, biometric prompts, account recovery, purchases, checkout submission, order confirmation, and payment semantics are human-only. The provider does not jailbreak devices, bypass device locks, solve CAPTCHAs, accept tokenized deep links, or shut down or erase the phone when a session closes.
82
-
83
- ## Browser CDP execution boundary
84
-
85
- Browser interaction sessions keep one durable session and tab-resume model across all Browser modes. When the Gateway is Bun-hosted and the selected mode is `attach_preferred`, the interaction plane crosses a narrow Node process boundary for the complete Browser page action. This boundary exists solely to host Playwright's CDP WebSocket connection; policy checks, domain allowlisting, tab matching, session persistence, diagnostics, and action behavior remain implemented by the shared Browser adapter.
86
-
87
- The bridge uses bounded stdin/stdout JSON, a minimal child environment, an explicitly resolved Node executable, no shell, and bounded startup/action lifetime. A host marker prevents recursion. Test runtime hooks bypass the bridge so deterministic adapter unit tests remain in-process. Attached-browser teardown is `disconnect`, preserving the user's Chrome process and login state; managed persistent and isolated contexts retain their existing close semantics.
@@ -1,128 +0,0 @@
1
- # Forge Runtime Implementation Status
2
-
3
- > Status: **Runtime Authority**
4
- > Baseline: **Canonical Forge Runtime — 2026-08-06**
5
-
6
- ## Completion Statement
7
-
8
- The **Canonical Single Runtime vertical slice** is implemented in executable code:
9
-
10
- ```text
11
- forge-runtime
12
- -> MCP Transport
13
- -> Controller Services
14
- -> Scheduler and Repository Actors
15
- -> Process Runtime and Workers
16
- -> Evidence, Artifact, and Projection planes
17
- ```
18
-
19
- One Runtime Root owns lifecycle, readiness, scheduling, process fencing, and the active whole-release identity. Standalone Recovery owns independent observation, bounded restart, and active/previous whole-release rollback. Supervisor, runtime slots, independent Daemon authority, component rollout, KeepAlive commands, and compatibility configuration authority are deleted.
20
-
21
- ## Capability Matrix
22
-
23
- | Capability | Status | Runtime evidence |
24
- | --- | --- | --- |
25
- | Thin MCP Gateway | Implemented | `src/runtime/gateway/mcp/router.ts`, `src/cli/mcp/server.ts`, `src/cli/mcp/transports/http.ts` |
26
- | Thin Harness V1 Fast Path | Implemented | `src/runtime/execution/thin-harness/` router, fast executor, receipts, typed batch, lightweight lanes; eligible short repository commands skip Local Job / ExecutionJob; docs in `thin-harness-v1.md` |
27
- | Deterministic MCP transport lifecycle | Implemented | global `McpSessionRegistry`, stream leases, active-POST protection, capacity-aware `/ready`, and recoverable tool-surface fencing that keeps the stale transport alive until replacement initialize supersedes it |
28
- | Unified Process Runtime | Implemented | `src/runtime/execution/process-runtime/`; repository commands and checks spawn once, return stable Process handles, preserve output/completion state, and attach later status/wait/log/cancel calls without re-execution |
29
- | Independent daemon lifecycle | Deleted | `runtime-status-client.ts` is read-only observation over Canonical Forge Runtime state and cannot start, replace, recover, or fence Workers |
30
- | Canonical Single Runtime | Implemented in source; live activation separately authorized | `src/runtime/root/` starts Controller Services, SQLite, Scheduler, Gateway Adapter, and MCP Transport under one lifecycle owner |
31
- | Legacy Supervisor/Ingress/slot lifecycle | Deleted | Supervisor, Stable Ingress, slots, bootstrap authority, restart coordinator, component rollout/rollback, and repository lifecycle scripts are absent and guarded against reintroduction |
32
- | Isolated Worker processes | Implemented | `src/runtime/execution/workers/worker-entry.ts`, Scheduler process spawning |
33
- | Per-Repository Actor | Implemented | `src/runtime/control-plane/repo-actor/actor.ts`, actor registry and repository mailbox lock |
34
- | Resource Claims | Implemented | `src/runtime/gateway/mcp/resource-policy.ts`, `resources/claims/conflicts.ts` |
35
- | Renewable Leases and fencing tokens | Implemented | `src/runtime/resources/leases/store.ts` |
36
- | Zombie Worker exclusion | Implemented | attempt/PID/exact-Lease ownership on heartbeat, renewal, release and terminal writes |
37
- | Workspace single writer | Implemented | Workspace Claim conflicts and eligible automatic Worktree placement |
38
- | Concurrent Worktrees with serialized integration | Implemented | unique Worktree Claims plus exclusive Integration/Git-ref Claims |
39
- | Global fair scheduler | Implemented | priority aging, persisted repository fairness, global/repository quotas |
40
- | Provider and host budgets | Implemented | Worker, Agent provider, Heavy Check, memory and CPU-load admission limits |
41
- | Durable reconciliation | Implemented | heartbeat, deadline, Operation Receipt recovery, safe retry and ambiguous-mutation stop |
42
- | Startup recovery before readiness | Implemented in Canonical Runtime | SQLite, Controller Services and in-process Scheduler initialize before MCP end-to-end probe; any fatal core failure makes the one Runtime readiness false and stops the complete Runtime |
43
- | Canonical repository command input | Implemented | typed argv is validated and direct-spawned without shell reparsing; legacy strings use one explicit compatibility shell boundary |
44
- | Active/recent/request indexes | Implemented | Execution Job, Agent Run, Task-to-Run, pending integration, Local Job, Occurrence, Portfolio and Finding indexes |
45
- | Schedule, Trigger, Decision and Occurrence | Implemented | interval/manual/UTC cron/calendar/condition/event/dependency triggers, bounded Occurrence and persisted Decision |
46
- | Schedule safety policy | Implemented | Shadow Mode, max-active, daily budget, cooldown, exponential backoff, failure circuit breaker and stop conditions |
47
- | Candidate Finding governance | Implemented | semantic dedupe, evidence, observation count and explicit human promotion |
48
- | Personal-assistant plugin manifests and registry | Implemented | `src/runtime/plugins/`, Controller Home `plugins/`, MCP and Local Controller discovery |
49
- | Portfolio DAG and Saga | Implemented | dependency-cycle rejection, deterministic stop and compensation under `src/runtime/workflow/portfolio/` |
50
- | Evidence Plane | Implemented | unified append-only events, exact-revision evidence, Operation Receipts and bounded Artifacts |
51
- | Materialized projections | Implemented | dirty-marker invalidation, indexed runtime projections and non-blocking Controller Context refresh |
52
- | Release Freeze and Gate | Implemented | exclusive `release:<repoId>` Lease and deterministic exact-revision release manifest |
53
- | External side-effect authorization | Implemented | Gateway/Portfolio/Schedule/Worker defense-in-depth policy |
54
- | Whole-Runtime readiness | Implemented in the Canonical Runtime source path | Public readiness is one `ready: boolean`; database, Scheduler, release coherence, MCP transport and repository checks are diagnostic evidence rather than independent lifecycle states |
55
- | Legacy compatibility | Implemented | stable MCP facade, unchanged compatibility fingerprint, Local Job projection into Execution Job |
56
- | Work-only execution contract convergence | Implemented for Work-backed Tasks | `WorkContract` owns objective/scope/check/risk/status/phase and completion receipt; linked Task fields are read projections, PlanStep retains `workId`, and receipt/revision/cleanup gates fail closed |
57
- | Node/Bun process portability | Implemented | project TypeScript Loader and bounded Worker/child process execution; Bun remains the supported package/test runtime |
58
-
59
- ## Public Contract and Tool Surface
60
-
61
- The normal ChatGPT-facing MCP surface is a bounded **19-tool** schema. The five preferred orchestration facades are `rh_status`, `rh_access`, `rh_inbox`, `rh_context`, and `rh_work`. Repository selection, `repository_command_execute`, bounded source read/patch, focused checks, typed plugin dispatch, Process lifecycle, and bounded result access complete the default surface defined by `src/cli/mcp/toolset-names.ts`.
62
-
63
- The Runtime keeps internal atomic handlers and an exhaustive `full` compatibility profile without advertising them to ordinary ChatGPT discovery. `core` remains a compatibility label for the same bounded default surface. Request/Full Access changes execution authorization, not tool discovery.
64
-
65
- Small understood work is Direct-first. Repository commands and checks use Unified Process Runtime and return one stable Process lifecycle; known-long calls can return a handle immediately, while later `process_get`, `process_wait`, `process_logs`, and `process_cancel` attach to that same physical execution. Durable Work, isolated worktrees, or workers are introduced when recovery, dependency tracking, isolation, parallelism, or a longer lifecycle actually requires them.
66
-
67
- Tool names and input schemas are fingerprinted. A stale MCP session receives `MCP_TOOL_SURFACE_CHANGED` with a reinitialize instruction while its transport remains available for the host to observe the reset. Replacement initialize then supersedes and closes the old session; schema rotation must not unregister the Forge namespace from the host conversation.
68
-
69
- Capability descriptors identify domain group, operation class, risk, facade route, and schema source. Plugin completeness is separate from the core Runtime baseline: optional plugin health does not redefine repository execution or Runtime readiness unless the requested operation explicitly depends on that plugin.
70
-
71
- ## Runtime Truth
72
-
73
- Controller Home owns runtime state:
74
-
75
- ```text
76
- repositories/<repoId>/
77
- execution-jobs/
78
- plugins/
79
- leases/
80
- schedules/
81
- records/
82
- occurrences/
83
- decisions/
84
- indexes/
85
- findings/
86
- artifacts/
87
- evidence/
88
- events/
89
- projections/
90
- runs/
91
- edit-sessions/
92
-
93
- indexes/execution-jobs/
94
- scheduler/state.json
95
- portfolio/workflows/
96
- ```
97
-
98
- Repository files under `plans/`, `tasks/` and Issue storage remain business intent and audit material. They are not scanned as a hot execution queue.
99
-
100
- ## Compatibility Boundary
101
-
102
- The following remain supported:
103
-
104
- - original Issue and Task lifecycle;
105
- - Task/Run separation and retry history;
106
- - Direct Edit sessions;
107
- - Local Bridge API and UI;
108
- - repository registry and GitHub mapping;
109
- - Agent Run and Worktree integration records;
110
- - legacy MCP schemas and stored-state readers;
111
- - historical plans and architecture documents for audit.
112
-
113
- `src/cli/mcp/tools.ts` is now a thin stable facade. `legacy-tool-service.ts` contains compatibility implementations invoked inside isolated Workers when work is durable. No product capability was removed to reduce source size or latency.
114
-
115
- ## Validation Authority
116
-
117
- Completion is guarded by:
118
-
119
- - strict TypeScript checking across `src`, `scripts` and `tests`;
120
- - architecture invariant checks;
121
- - MCP compatibility fingerprint checks;
122
- - recovery, fencing and ambiguous-side-effect smoke tests;
123
- - Schedule trigger/Decision/backoff smoke tests;
124
- - Scheduler → Repo Actor → isolated Worker → Evidence process smoke;
125
- - HTTP Gateway `/health`, `/ready` and repository-health smoke;
126
- - package and source-manifest verification.
127
-
128
- Release readiness requires Bun-native tests, TypeScript checking, MCP surface checks, public-document validation, tracked-file hygiene, and package export verification in the release environment.
@@ -1,413 +0,0 @@
1
- # Job and Run Lifecycle
2
-
3
- > Status: **Runtime Authority**
4
-
5
- ## 1. Purpose
6
-
7
- This document defines asynchronous execution semantics. It prevents request lifetime, process lifetime, Job lifetime, Run lifetime, and Task lifetime from being treated as the same state machine.
8
-
9
- ## 2. Lifecycle Ownership
10
-
11
- | Lifecycle | Owner | Answers |
12
- | --- | --- | --- |
13
- | Request | Thin Gateway | Was the command accepted and what ID should the client query? |
14
- | Job | Repo Actor / Controller | What asynchronous system operation is pending or complete? |
15
- | Run | Agent execution subsystem | What happened during one Agent attempt? |
16
- | Task | Workflow Plane | Is the objective ready, under review, verified, accepted, or terminal? |
17
- | Worker | Execution Plane | Which process currently holds execution ownership? |
18
- | Lease | Resource subsystem | May this Worker still mutate the protected resource? |
19
-
20
- No lifecycle may substitute for another.
21
-
22
- ## 3. Job State Machine
23
-
24
- ### Target States
25
-
26
- ```text
27
- accepted
28
- -> queued
29
- -> waiting_for_resource
30
- -> dispatched
31
- -> running
32
- -> succeeded
33
-
34
- accepted/queued/waiting_for_resource/dispatched/running
35
- -> failed
36
- -> timed_out
37
- -> cancelled
38
- -> orphaned
39
- -> stale
40
- ```
41
-
42
- Optional review-oriented Jobs may include:
43
-
44
- ```text
45
- running -> waiting_for_user -> running
46
- ```
47
-
48
- ### State Meanings
49
-
50
- - `accepted` — durable record exists and idempotency identity is reserved.
51
- - `queued` — eligible for scheduling but no Worker assigned.
52
- - `waiting_for_resource` — blocked by a dependency, claim, quota, or barrier.
53
- - `dispatched` — a Worker or external provider was assigned; execution may not have started.
54
- - `running` — valid Lease and execution heartbeat exist.
55
- - `waiting_for_user` — execution cannot progress without human input.
56
- - `succeeded` — the Job-owned operation completed successfully and result evidence is durable.
57
- - `failed` — operation completed unsuccessfully with durable error evidence.
58
- - `timed_out` — persisted deadline was exceeded and termination/reconciliation was recorded.
59
- - `cancelled` — an authorized cancellation ended this Job's ownership.
60
- - `orphaned` — ownership disappeared and success/failure cannot be proven.
61
- - `stale` — the operation's required revision or precondition changed before valid completion.
62
-
63
- ### Current Implementation
64
-
65
- Local Bridge currently uses compatibility states such as `approved`, `running`, and `dispatched`. These remain readable. `approved` maps to accepted/queued semantics rather than a human approval queue.
66
-
67
- ### Migration Rule
68
-
69
- New Job types should use the target meanings even if stored names remain temporarily compatible. A compatibility adapter must not mark a Job succeeded merely because a linked Run was created or dispatched.
70
-
71
- ## 4. Admission Protocol
72
-
73
- Every long operation follows:
74
-
75
- ```text
76
- 1. validate repository, checkout, schema, policy and authorization
77
- 2. derive requestId and semanticKey
78
- 3. check idempotency index
79
- 4. evaluate Task/dependency and resource policy
80
- 5. atomically persist Job + accepted event + index entries
81
- 6. return Job ID to caller
82
- 7. schedule asynchronously
83
- ```
84
-
85
- If step 5 fails, no execution may start.
86
-
87
- If the client disconnects after step 5, the Job remains accepted.
88
-
89
- ## 5. Idempotency Protocol
90
-
91
- ### Identity
92
-
93
- ```text
94
- idempotencyKey = hash(requestId, repoId, operationType, semanticKey)
95
- ```
96
-
97
- ### Behavior
98
-
99
- - The first accepted command owns the key.
100
- - Repeated calls return the original Job summary.
101
- - A caller may explicitly request a new attempt only through retry semantics, producing a new attempt identity linked to the prior Job.
102
- - A terminal failure is not silently rerun because the client repeated the original request.
103
-
104
- ### Semantic Keys
105
-
106
- Examples:
107
-
108
- ```text
109
- dispatch-task: issueId + taskId + retryFromRunId
110
- run-check: checkId + revision + environmentFingerprint
111
- verify-edit: sessionId + editRevision + checkSet
112
- repository-command: approvalToken + checkoutSnapshot
113
- integration: runId + targetCheckoutId + reviewedDiffHash
114
- schedule-occurrence: scheduleId + occurrenceWindow + repoId
115
- ```
116
-
117
- ## 6. Scheduling and Claims
118
-
119
- After admission, the Repo Actor computes required Claims.
120
-
121
- Possible results:
122
-
123
- - all Claims granted: assign Worker and Lease;
124
- - compatible shared execution already active: subscribe to it;
125
- - temporary conflict: enter `waiting_for_resource`;
126
- - dependency incomplete: enter `waiting_for_dependency` detail;
127
- - release freeze or policy block: wait or fail according to explicit policy;
128
- - invalid scope or forbidden action: fail before Worker dispatch.
129
-
130
- A waiting Job remains observable and retains its deadline and queue metadata.
131
-
132
- ## 7. Worker Start Protocol
133
-
134
- A Worker starts only after:
135
-
136
- 1. Job is durable;
137
- 2. resource Claims are granted;
138
- 3. Lease with fencing token is persisted;
139
- 4. execution configuration and artifact paths are durable.
140
-
141
- The Worker then records:
142
-
143
- ```text
144
- workerAssigned
145
- workerStarted
146
- heartbeat
147
- progress events
148
- output references
149
- terminal result
150
- ```
151
-
152
- A PID is diagnostic evidence. Lease identity is the authority to write lifecycle state.
153
-
154
- ## 8. Heartbeat and Deadline
155
-
156
- A running Job or Run records:
157
-
158
- ```text
159
- startedAt
160
- deadlineAt
161
- heartbeatAt
162
- leaseExpiresAt
163
- worker identity
164
- ```
165
-
166
- The Controller distinguishes:
167
-
168
- - missing heartbeat but live process;
169
- - dead process but unexpired Lease;
170
- - expired Lease;
171
- - completed result with missing terminal transition;
172
- - process tree still alive after parent exit.
173
-
174
- Timeout handling must attempt process-tree termination, record the signal path, wait for terminal confirmation or mark unresolved descendants, and persist the resulting state.
175
-
176
- ## 9. Run State Machine
177
-
178
- ### Current and Target Core States
179
-
180
- ```text
181
- queued
182
- -> starting
183
- -> running
184
- -> waiting_for_user
185
- -> succeeded
186
-
187
- queued/starting/running/waiting_for_user
188
- -> failed
189
- -> cancelled
190
- -> unknown
191
- ```
192
-
193
- A timeout is represented by terminal failure/unknown metadata plus a structured termination reason until a dedicated Run `timed_out` status is introduced.
194
-
195
- ### Run Success Contract
196
-
197
- For Workspace execution, Run success requires:
198
-
199
- - Agent process exited successfully;
200
- - result record is durable;
201
- - declared process tree is closed;
202
- - final diff/evidence can be read.
203
-
204
- For isolated Worktree execution with automatic integration, Task-visible success requires either:
205
-
206
- - integration completed, `integratedSessionId` exists, and cleanup is recorded; or
207
- - Run execution succeeded but integration is explicitly pending/failed, in which case the Task remains review/integration pending and must not appear fully completed.
208
-
209
- For GitHub execution, provider success and collaboration artifacts are recorded, but merge and acceptance remain separate.
210
-
211
- ## 10. Job-to-Run Relationship
212
-
213
- A Dispatch Task Job may proceed:
214
-
215
- ```text
216
- Job accepted
217
- -> Run accepted
218
- -> Run dispatched
219
- -> Job dispatched
220
- -> Run running
221
- -> Job running
222
- -> Run terminal
223
- -> continuation / integration / verification
224
- -> Job terminal
225
- ```
226
-
227
- The Job may remain non-terminal after Run success while integration or required continuation remains part of the Job contract.
228
-
229
- A Run terminal failure normally makes its owning dispatch Job fail, but Task retry semantics still require an explicit new Run.
230
-
231
- ## 11. Shared Execution
232
-
233
- Identical check or deterministic execution requests may share one physical Worker execution.
234
-
235
- The model is:
236
-
237
- ```text
238
- SharedExecution
239
- -> Subscriber Job A
240
- -> Subscriber Job B
241
- -> Subscriber Job C
242
- ```
243
-
244
- Rules:
245
-
246
- - each subscriber has independent cancellation, timeout, stale, and result-link state;
247
- - cancelling one subscriber does not kill the shared process while another subscriber remains active;
248
- - the physical execution terminates only after the last subscriber leaves or the shared contract itself fails;
249
- - every subscriber receives the shared result or its own scoped terminal outcome;
250
- - shared identity includes Revision and execution environment.
251
-
252
- In-memory subscriber sets may optimize delivery but must be reconstructable from durable Job relationships.
253
-
254
- ## 12. Cancellation
255
-
256
- Cancellation targets an entity and authority boundary.
257
-
258
- ### Job cancellation
259
-
260
- - marks that Job cancelled;
261
- - releases or withdraws its Claims;
262
- - removes its subscription from shared work;
263
- - terminates a dedicated Worker only if the Job is its sole owner.
264
-
265
- ### Run cancellation
266
-
267
- - attempts to stop the Agent process tree or provider session;
268
- - records terminal evidence;
269
- - does not delete Task or prior evidence.
270
-
271
- ### Request cancellation
272
-
273
- A disconnected or abandoned MCP request after acknowledgement does not cancel the Job.
274
-
275
- ## 13. Timeout
276
-
277
- Timeout is evaluated from a persisted deadline, not an in-memory timer alone.
278
-
279
- On timeout:
280
-
281
- 1. confirm the Job is still owned by the same fencing token;
282
- 2. mark timeout intent;
283
- 3. signal the complete process tree or external provider;
284
- 4. persist termination events;
285
- 5. close or orphan the Lease;
286
- 6. record `timed_out` or `unknown` according to available evidence;
287
- 7. release Claims;
288
- 8. expose explicit retry semantics.
289
-
290
- ## 14. Orphan Reconciliation
291
-
292
- A Job or Run may be orphaned when:
293
-
294
- - Controller or Worker exits unexpectedly;
295
- - persisted owner PID is dead;
296
- - Lease expires without terminal result;
297
- - external provider state is unavailable;
298
- - result exists but lifecycle transition was interrupted.
299
-
300
- Reconciliation order:
301
-
302
- ```text
303
- 1. read durable result/evidence
304
- 2. inspect Lease and fencing token
305
- 3. inspect process/provider liveness
306
- 4. inspect process tree and artifact completeness
307
- 5. recover terminal state when provable
308
- 6. otherwise mark orphaned/unknown
309
- 7. require explicit retry where duplicate execution is unsafe
310
- ```
311
-
312
- Reconciliation must be idempotent.
313
-
314
- ## 15. Stale State
315
-
316
- A Job becomes stale when a required precondition changes, including:
317
-
318
- - repository Revision changed while a queued or running check required the old Revision;
319
- - approval token no longer matches checkout snapshot;
320
- - source Run diff no longer applies to target Checkout;
321
- - Schedule Occurrence window was superseded;
322
- - resource mapping or repository identity changed incompatibly.
323
-
324
- Stale work must not produce reusable success evidence.
325
-
326
- ## 16. Retry
327
-
328
- Retry creates a new attempt linked to the terminal entity:
329
-
330
- ```text
331
- priorJobId
332
- priorRunId
333
- attemptNumber
334
- retryReason
335
- new requestId or retry identity
336
- ```
337
-
338
- Before retry, the Repo Actor determines whether:
339
-
340
- - the original operation is safe to repeat;
341
- - a result may already exist;
342
- - cleanup is complete;
343
- - the repository Revision changed;
344
- - scope or acceptance criteria must be revised;
345
- - a different Agent is justified.
346
-
347
- Infrastructure failure does not automatically imply implementation failure, and Agent failure does not automatically justify switching Agents.
348
-
349
- ## 17. Continuation After Successful Run
350
-
351
- Successful Run continuation is deterministic:
352
-
353
- ```text
354
- Run success
355
- -> inspect execution mode
356
- -> integrate when required
357
- -> run declared checks when policy applies
358
- -> persist Verification
359
- -> auto-complete eligible low/medium-risk Task
360
- -> wait for human acceptance for high/destructive Task
361
- -> unlock dependent Tasks
362
- ```
363
-
364
- Every continuation step is either a durable Job or an atomic state transaction. A Controller restart can resume from the last durable boundary.
365
-
366
- ## 18. Terminal-State Rules
367
-
368
- - `succeeded` requires durable result evidence.
369
- - `failed` requires durable error evidence.
370
- - `cancelled` requires cancellation authority and event.
371
- - `timed_out` requires persisted deadline evidence.
372
- - `orphaned` or `unknown` means the system cannot prove success or failure.
373
- - `stale` means result cannot satisfy the original semantic contract.
374
- - terminal entities do not return to running;
375
- - retry creates a new entity or attempt relationship.
376
-
377
- ## 19. Projection Rules
378
-
379
- Active indexes include only non-terminal Jobs/Runs. Terminal history is queried separately and bounded by requested limits.
380
-
381
- A list endpoint may reconcile active entities but must not scan full terminal history. An entity detail endpoint may reconcile that entity specifically.
382
-
383
- ## 20. Audit Requirements
384
-
385
- Every lifecycle transition records:
386
-
387
- ```text
388
- entityId
389
- previousStatus
390
- nextStatus
391
- actor
392
- requestId
393
- correlationId
394
- causationId
395
- fencingToken when applicable
396
- reason
397
- evidence references
398
- occurredAt
399
- ```
400
-
401
- Lifecycle transitions without an audit event are recovery anomalies and must be detectable by governance checks.
402
-
403
- ## 21. Controller Ownership Fencing
404
-
405
- Repository controller ownership is a stable lease identity, not a per-Task token. Heartbeat or sibling dispatch renews/reuses the live owner and does not rotate its epoch. The epoch changes only on a proven takeover after the previous owner is dead or its record is malformed. Epoch writes are serialized and atomic.
406
-
407
- A child Worker receives the current controller PID and epoch as a derived execution capability. It may publish heartbeats or terminal state only while that capability still matches the durable owner record. Parallel sibling Runs therefore cannot invalidate each other by reacquiring repository ownership.
408
-
409
- ## 22. Local Job Projection
410
-
411
- Local Bridge states are compatibility projections of Agent Runs or durable Execution Jobs. `starting` is active and maps to `running`; it is never interpreted as terminal failure. A projected Local Job synchronizes its durable Job before applying action-specific orphan or timeout rules, preventing a compatibility projection from masking a terminal durable result.
412
-
413
- Runtime storage is bound before the first Local Job is persisted. This prevents the Job from blocking migration of the directory that contains its own state.