@moretea-labs/forge 1.5.1 → 1.7.0

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 (434) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +46 -0
  3. package/CLAUDE.md +2 -0
  4. package/DESIGN.md +7 -2
  5. package/README.md +4 -4
  6. package/README.zh-CN.md +2 -2
  7. package/SKILL.md +2 -2
  8. package/THIRD_PARTY_NOTICES.md +1 -1
  9. package/agents/openai.yaml +1 -1
  10. package/assets/hooks/hook-input.sh +11 -8
  11. package/assets/hooks/lib/session-state.sh +10 -7
  12. package/assets/hooks/lib/workflow-state.sh +13 -177
  13. package/assets/hooks/post-tool-observer.sh +8 -2
  14. package/assets/hooks/pre-edit-guard.sh +8 -39
  15. package/assets/hooks/prompt-guard.sh +7 -83
  16. package/assets/hooks/session-start-context.sh +56 -1
  17. package/assets/partials/05-workflow.partial.md +1 -1
  18. package/assets/partials-agents/03-orchestration.partial.md +1 -1
  19. package/assets/plugin-registry.v1.json +54 -3
  20. package/assets/reference-configs/document-generation.md +1 -1
  21. package/assets/reference-configs/harness-overview.md +1 -1
  22. package/assets/reference-configs/hook-operations.md +1 -1
  23. package/assets/reference-configs/sprint-contracts.md +3 -3
  24. package/assets/skill-version.json +2 -2
  25. package/assets/templates/contract.template.md +2 -7
  26. package/assets/templates/helpers/capture-plan.sh +2 -2
  27. package/assets/templates/helpers/check-task-workflow.sh +4 -4
  28. package/assets/templates/helpers/contract-worktree.sh +1 -21
  29. package/assets/templates/helpers/ensure-task-workflow.sh +13 -38
  30. package/assets/templates/helpers/migrate-project-template.sh +22 -45
  31. package/assets/templates/helpers/new-plan.sh +1 -1
  32. package/assets/templates/helpers/plan-to-todo.sh +12 -37
  33. package/assets/templates/helpers/ship-worktrees.sh +2 -29
  34. package/assets/templates/helpers/sprint-backlog.sh +6 -6
  35. package/assets/templates/helpers/verify-contract.sh +1 -111
  36. package/assets/templates/helpers/verify-sprint.sh +3 -180
  37. package/assets/templates/plan.template.md +1 -1
  38. package/assets/templates/review.template.md +9 -34
  39. package/assets/workflow-contract.v1.json +10 -19
  40. package/docs/README.md +10 -10
  41. package/docs/architecture/CURRENT.md +170 -0
  42. package/docs/architecture/EVOLUTION.md +42 -0
  43. package/docs/architecture/current/README.md +4 -156
  44. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
  45. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
  46. package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
  47. package/docs/architecture/history/README.md +7 -0
  48. package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
  49. package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
  50. package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
  51. package/docs/architecture/history.md +3 -34
  52. package/docs/architecture/index.md +15 -98
  53. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  54. package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
  55. package/docs/architecture/versions/1.6.md +38 -0
  56. package/docs/architecture/versions/1.7.md +41 -0
  57. package/docs/forge-chatgpt-browser-engine.md +2 -2
  58. package/docs/forge-chatgpt-mcp-setup.md +4 -28
  59. package/docs/forge-chatgpt-supervised-automation.md +3 -3
  60. package/docs/forge-github-issue-launcher.md +1 -1
  61. package/docs/forge-runtime-self-healing-loop.md +1 -1
  62. package/docs/operations/controller-browser-plugin.md +38 -22
  63. package/docs/operations/controller-performance-and-502.md +124 -0
  64. package/docs/operations/controller-reliability-runbook.md +1 -1
  65. package/docs/operations/features.md +3 -3
  66. package/docs/operations/github-repository.md +1 -1
  67. package/docs/operations/homebrew.md +2 -2
  68. package/docs/operations/mcp-tool-exposure.md +5 -3
  69. package/docs/tutorials/01-install-and-start.md +1 -1
  70. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  71. package/docs/wiki/Architecture.md +6 -6
  72. package/docs/wiki/Implementation.md +2 -2
  73. package/docs/wiki/Installation.md +1 -1
  74. package/docs/wiki/Integrations.md +2 -2
  75. package/docs/wiki/Quick-Start.md +1 -1
  76. package/docs/wiki/Work-Lifecycle.md +1 -1
  77. package/package.json +29 -10
  78. package/scripts/activate-source-baseline.ts +17 -13
  79. package/scripts/benchmark-background-check-overlap.ts +228 -0
  80. package/scripts/benchmark-mcp-host.sh +117 -0
  81. package/scripts/benchmark-mcp-transport.ts +170 -0
  82. package/scripts/benchmark-quality-harness.ts +146 -0
  83. package/scripts/benchmark-route-session-concurrency.ts +207 -6
  84. package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
  85. package/scripts/benchmark-typescript-navigation.ts +186 -0
  86. package/scripts/benchmark-work-efficiency.ts +334 -0
  87. package/scripts/capture-plan.sh +3 -3
  88. package/scripts/check-agent-tooling.sh +8 -35
  89. package/scripts/check-architecture-sync.sh +17 -86
  90. package/scripts/check-mcp-compatibility.ts +14 -0
  91. package/scripts/check-public-docs.sh +14 -1
  92. package/scripts/check-runtime-architecture.mjs +107 -64
  93. package/scripts/check-stable-baseline.ts +92 -0
  94. package/scripts/check-task-workflow.sh +4 -4
  95. package/scripts/contract-worktree.sh +1 -21
  96. package/scripts/ensure-task-workflow.sh +22 -55
  97. package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
  98. package/scripts/install-standalone-recovery.ts +24 -0
  99. package/scripts/lib/project-init-lib.sh +15 -44
  100. package/scripts/migrate-chatgpt-automation-schedules.ts +64 -0
  101. package/scripts/migrate-project-template.sh +23 -1179
  102. package/scripts/new-plan.sh +1 -1
  103. package/scripts/plan-to-todo.sh +11 -36
  104. package/scripts/run-governed-gate.ts +2 -1
  105. package/scripts/ship-worktrees.sh +2 -29
  106. package/scripts/smoke-ios-physical-device.ts +4 -2
  107. package/scripts/smoke-runtime-recovery.ts +1 -35
  108. package/scripts/smoke-schedule-engine.ts +1 -20
  109. package/scripts/sprint-backlog.sh +1 -1
  110. package/scripts/verify-contract.sh +1 -111
  111. package/scripts/verify-forge-runtime.sh +0 -1
  112. package/scripts/verify-sprint.sh +3 -180
  113. package/scripts/workflow-contract.ts +1 -5
  114. package/src/cli/commands/chatgpt.ts +31 -2
  115. package/src/cli/commands/init-hook.ts +3 -3
  116. package/src/cli/commands/mcp.ts +9 -5
  117. package/src/cli/commands/plugin.ts +37 -10
  118. package/src/cli/commands/recovery.ts +25 -3
  119. package/src/cli/commands/runtime.ts +55 -3
  120. package/src/cli/commands/security.ts +12 -1
  121. package/src/cli/commands/setup-profile.ts +31 -21
  122. package/src/cli/controller/check-runner.ts +106 -3
  123. package/src/cli/controller/composite-result.ts +1 -1
  124. package/src/cli/controller/context/focus.ts +51 -0
  125. package/src/cli/controller/context/instruction-context.ts +114 -0
  126. package/src/cli/controller/context/known-paths.ts +76 -0
  127. package/src/cli/controller/context/query-planning.ts +110 -0
  128. package/src/cli/controller/context/rule-resolution.ts +532 -0
  129. package/src/cli/controller/context/source-materializer.ts +278 -0
  130. package/src/cli/controller/context/structural.ts +16 -0
  131. package/src/cli/controller/context/types.ts +286 -0
  132. package/src/cli/controller/context-pack.ts +898 -430
  133. package/src/cli/controller/launch-agents.ts +77 -2
  134. package/src/cli/controller/operational-plan.ts +2 -2
  135. package/src/cli/controller/work-mode.ts +6 -4
  136. package/src/cli/editing/edit-session.ts +60 -7
  137. package/src/cli/github/github.ts +133 -0
  138. package/src/cli/hook/prompt-guard-decision.ts +17 -18
  139. package/src/cli/hook/prompt-intents.ts +1 -1
  140. package/src/cli/installer/managed-entries.ts +15 -1
  141. package/src/cli/local-bridge/console-automations.ts +225 -67
  142. package/src/cli/local-bridge/console-view-models.ts +3 -35
  143. package/src/cli/local-bridge/facade-api.ts +2 -217
  144. package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
  145. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +153 -3
  146. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
  147. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +183 -3
  148. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +1 -1
  149. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +4 -3
  150. package/src/cli/local-bridge/frontend/src/lib/api.ts +18 -11
  151. package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
  152. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +1 -1
  153. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +4 -3
  154. package/src/cli/local-bridge/frontend/src/styles.css +27 -11
  155. package/src/cli/local-bridge/frontend/src/types.ts +8 -7
  156. package/src/cli/local-bridge/job-store.ts +1 -490
  157. package/src/cli/local-bridge/server.ts +29 -532
  158. package/src/cli/local-bridge/ui-dist/app.css +1 -1
  159. package/src/cli/local-bridge/ui-dist/app.js +5101 -4967
  160. package/src/cli/mcp/auth.ts +5 -5
  161. package/src/cli/mcp/instructions.ts +3 -2
  162. package/src/cli/mcp/legacy-tool-service.ts +0 -189
  163. package/src/cli/mcp/multi-repository.ts +16 -5
  164. package/src/cli/mcp/oauth.ts +175 -26
  165. package/src/cli/mcp/paths.ts +8 -2
  166. package/src/cli/mcp/repository-tools.ts +356 -101
  167. package/src/cli/mcp/server.ts +625 -54
  168. package/src/cli/mcp/tool-capability-cache.ts +1 -1
  169. package/src/cli/mcp/toolset-selection.ts +1 -1
  170. package/src/cli/mcp/toolset.ts +42 -5
  171. package/src/cli/mcp/transports/http.ts +125 -15
  172. package/src/cli/mcp/transports/session-registry.ts +67 -5
  173. package/src/cli/mcp/types.ts +3 -3
  174. package/src/cli/repositories/command-classifier.ts +209 -14
  175. package/src/cli/repositories/command-executor.ts +55 -521
  176. package/src/cli/repositories/command-process.ts +108 -0
  177. package/src/cli/repositories/command-scope.ts +99 -41
  178. package/src/cli/repositories/controller-home.ts +7 -8
  179. package/src/cli/repositories/git-command-executor.ts +2 -0
  180. package/src/cli/repositories/locks.ts +53 -16
  181. package/src/cli/repositories/repository-snapshot.ts +121 -0
  182. package/src/cli/repositories/safe-patch.ts +6 -4
  183. package/src/cli/repositories/selected-path-actions.ts +17 -9
  184. package/src/cli/repositories/structured-git.ts +110 -10
  185. package/src/cli/repository/inspector.ts +565 -62
  186. package/src/cli/repository/session-cache.ts +58 -17
  187. package/src/cli/v81-entry.ts +1 -4
  188. package/src/effects/fs-transaction.ts +85 -17
  189. package/src/runtime/context/codegraph-read-provider.ts +233 -2
  190. package/src/runtime/context/codegraph-sidecar.cjs +74 -40
  191. package/src/runtime/context/generic-lsp-provider.ts +355 -0
  192. package/src/runtime/context/lsp-client.ts +283 -0
  193. package/src/runtime/context/semantic-navigation.ts +275 -0
  194. package/src/runtime/context/swift-navigation.ts +565 -0
  195. package/src/runtime/context/typescript-navigation.ts +226 -0
  196. package/src/runtime/control-plane/dispatch-priority.ts +28 -0
  197. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +196 -2
  198. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
  199. package/src/runtime/control-plane/execution/execution-identity.ts +65 -14
  200. package/src/runtime/control-plane/execution/session-store.ts +18 -0
  201. package/src/runtime/control-plane/execution/validation.ts +15 -2
  202. package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
  203. package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
  204. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
  205. package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
  206. package/src/runtime/control-plane/execution/work-task-receipt.ts +54 -11
  207. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +175 -8
  208. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -21
  209. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +87 -9
  210. package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
  211. package/src/runtime/control-plane/facade/controller-round-relay.ts +991 -0
  212. package/src/runtime/control-plane/facade/controller-session-store.ts +144 -14
  213. package/src/runtime/control-plane/facade/goal-workloop-access.ts +9 -2
  214. package/src/runtime/control-plane/facade/goal-workloop.ts +885 -105
  215. package/src/runtime/control-plane/facade/index.ts +1 -0
  216. package/src/runtime/control-plane/facade/plan-contract-store.ts +211 -26
  217. package/src/runtime/control-plane/facade/requirement-board.ts +24 -8
  218. package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
  219. package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
  220. package/src/runtime/control-plane/facade/types.ts +55 -11
  221. package/src/runtime/control-plane/facade/work-contract-store.ts +204 -73
  222. package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
  223. package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
  224. package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
  225. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
  226. package/src/runtime/control-plane/global-scheduler/maintenance.ts +145 -0
  227. package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
  228. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
  229. package/src/runtime/control-plane/global-scheduler/scheduler.ts +273 -542
  230. package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
  231. package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
  232. package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
  233. package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
  234. package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
  235. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
  236. package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
  237. package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
  238. package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
  239. package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
  240. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +50 -0
  241. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +642 -51
  242. package/src/runtime/control-plane/launcher/launch-reservation-store.ts +40 -0
  243. package/src/runtime/control-plane/launcher/thin-launcher.ts +194 -10
  244. package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
  245. package/src/runtime/control-plane/persistence/requirement-store.ts +15 -11
  246. package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
  247. package/src/runtime/control-plane/release-retention.ts +62 -2
  248. package/src/runtime/control-plane/routing/route-policy.ts +7 -16
  249. package/src/runtime/control-plane/runtime-status-client.ts +0 -2
  250. package/src/runtime/diagnostics/mcp-timing.ts +19 -0
  251. package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
  252. package/src/runtime/diagnostics/performance.ts +24 -1
  253. package/src/runtime/evidence/event-ledger.ts +1 -1
  254. package/src/runtime/execution/jobs/store.ts +58 -4
  255. package/src/runtime/execution/jobs/types.ts +1 -1
  256. package/src/runtime/execution/managed-workspace.ts +203 -1
  257. package/src/runtime/execution/process-runtime/check-facade.ts +52 -14
  258. package/src/runtime/execution/process-runtime/check-result.ts +63 -2
  259. package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
  260. package/src/runtime/execution/process-runtime/command-facade.ts +346 -40
  261. package/src/runtime/execution/process-runtime/gc.ts +98 -12
  262. package/src/runtime/execution/process-runtime/lightweight-managed.ts +1184 -0
  263. package/src/runtime/execution/process-runtime/persisted-check.ts +57 -6
  264. package/src/runtime/execution/process-runtime/resource-claims.ts +97 -8
  265. package/src/runtime/execution/process-runtime/runtime.ts +59 -4
  266. package/src/runtime/execution/process-runtime/store.ts +7 -0
  267. package/src/runtime/execution/process-runtime/types.ts +2 -0
  268. package/src/runtime/execution/thin-harness/async-process.ts +12 -2
  269. package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
  270. package/src/runtime/execution/workers/executor.ts +0 -48
  271. package/src/runtime/gateway/mcp/execution-tools.ts +1219 -126
  272. package/src/runtime/gateway/mcp/process-tools.ts +83 -37
  273. package/src/runtime/gateway/mcp/router.ts +185 -83
  274. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +546 -0
  275. package/src/runtime/gateway/mcp/runtime-tools.ts +2555 -1616
  276. package/src/runtime/model-clients/deepseek-adapter.ts +0 -32
  277. package/src/runtime/plugins/app-store-connect-adapter.ts +123 -19
  278. package/src/runtime/plugins/browser-adapter.ts +2925 -318
  279. package/src/runtime/plugins/browser-automation-service.ts +10 -0
  280. package/src/runtime/plugins/browser-handoff-host.ts +6 -31
  281. package/src/runtime/plugins/browser-handoff.ts +92 -5
  282. package/src/runtime/plugins/browser-macos-bridge.ts +586 -45
  283. package/src/runtime/plugins/browser-node-bridge.ts +6 -34
  284. package/src/runtime/plugins/browser-provider-registry.ts +109 -0
  285. package/src/runtime/plugins/browser-runtime-contract.ts +152 -0
  286. package/src/runtime/plugins/browser-runtime.ts +183 -0
  287. package/src/runtime/plugins/browser-session-authority.ts +332 -0
  288. package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
  289. package/src/runtime/plugins/desktop-operator-registration.ts +15 -12
  290. package/src/runtime/plugins/external-adapter.ts +324 -3
  291. package/src/runtime/plugins/external-registration.ts +84 -5
  292. package/src/runtime/plugins/external-unix-socket.ts +7 -1
  293. package/src/runtime/plugins/first-party-registry.ts +4 -2
  294. package/src/runtime/plugins/github-adapter.ts +125 -0
  295. package/src/runtime/plugins/gmail-adapter.ts +28 -2
  296. package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
  297. package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
  298. package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
  299. package/src/runtime/plugins/ios-adapter.ts +106 -16
  300. package/src/runtime/plugins/ios-agent-device.ts +234 -64
  301. package/src/runtime/plugins/ios-physical-device.ts +1143 -392
  302. package/src/runtime/plugins/lightweight-action.ts +153 -0
  303. package/src/runtime/plugins/local-system-adapter.ts +125 -8
  304. package/src/runtime/plugins/macos-capability-broker.ts +55 -9
  305. package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
  306. package/src/runtime/plugins/plugin-management-adapter.ts +181 -0
  307. package/src/runtime/plugins/resend-adapter.ts +1 -1
  308. package/src/runtime/plugins/store.ts +366 -24
  309. package/src/runtime/plugins/types.ts +39 -2
  310. package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
  311. package/src/runtime/projections/git-status-sampler.ts +16 -16
  312. package/src/runtime/projections/materialized-view.ts +28 -10
  313. package/src/runtime/recovery/actions.ts +0 -10
  314. package/src/runtime/recovery/classifier.ts +0 -9
  315. package/src/runtime/recovery/maintenance-executor.ts +415 -18
  316. package/src/runtime/recovery/probe.ts +0 -1
  317. package/src/runtime/recovery/types.ts +0 -1
  318. package/src/runtime/root/mcp-transport.ts +180 -10
  319. package/src/runtime/root/package-connector-service.ts +186 -8
  320. package/src/runtime/root/package-runtime-release.ts +143 -17
  321. package/src/runtime/root/package-runtime-service.ts +430 -22
  322. package/src/runtime/root/release-manifest.ts +7 -2
  323. package/src/runtime/root/release-materialize.ts +162 -19
  324. package/src/runtime/root/release-store.ts +48 -11
  325. package/src/runtime/root/runtime.ts +23 -5
  326. package/src/runtime/root/service.ts +100 -27
  327. package/src/runtime/root/types.ts +2 -0
  328. package/src/runtime/safe-tooling/index.ts +0 -1
  329. package/src/runtime/safe-tooling/ios-development.ts +321 -63
  330. package/src/runtime/safe-tooling/types.ts +0 -30
  331. package/src/runtime/shared/trusted-executable.ts +62 -0
  332. package/src/runtime/shared/trusted-node-executable.ts +48 -0
  333. package/src/runtime/standalone-recovery/core.ts +702 -94
  334. package/src/runtime/standalone-recovery/entry.ts +99 -23
  335. package/src/runtime/standalone-recovery/installer.ts +19 -3
  336. package/src/runtime/standalone-recovery/service-labels.ts +2 -0
  337. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
  338. package/src/runtime/workflow/schedules/browser-probe.ts +258 -0
  339. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +40 -0
  340. package/src/runtime/workflow/schedules/engine.ts +509 -80
  341. package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
  342. package/src/runtime/workflow/schedules/settlement.ts +48 -4
  343. package/src/runtime/workflow/schedules/store.ts +131 -10
  344. package/src/runtime/workflow/schedules/types.ts +6 -3
  345. package/src/runtime/workflow/schedules/work-continuation.ts +120 -34
  346. package/src/testing/test-governance.ts +8 -40
  347. package/assets/reference-configs/heartbeat-triage.md +0 -57
  348. package/assets/templates/helpers/harness-trace-grade.sh +0 -150
  349. package/assets/templates/helpers/heartbeat-triage.sh +0 -361
  350. package/assets/templates/helpers/maintenance-triage.sh +0 -167
  351. package/bin/forge-desktop-helper.mjs +0 -204
  352. package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
  353. package/docs/architecture/current/architecture-invariants.md +0 -331
  354. package/docs/architecture/current/automation-and-schedule-engine.md +0 -453
  355. package/docs/architecture/current/codegraph-context-provider.md +0 -226
  356. package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
  357. package/docs/architecture/current/controller-repository-decoupling.md +0 -148
  358. package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -354
  359. package/docs/architecture/current/entity-model.md +0 -592
  360. package/docs/architecture/current/external-plugin-governance.md +0 -396
  361. package/docs/architecture/current/failure-recovery.md +0 -447
  362. package/docs/architecture/current/governance.md +0 -213
  363. package/docs/architecture/current/human-interaction-plane.md +0 -87
  364. package/docs/architecture/current/implementation-status.md +0 -128
  365. package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
  366. package/docs/architecture/current/legacy-governance.md +0 -58
  367. package/docs/architecture/current/local-workspace-target-grants.md +0 -70
  368. package/docs/architecture/current/migration-roadmap.md +0 -105
  369. package/docs/architecture/current/multi-repository-execution.md +0 -371
  370. package/docs/architecture/current/operations-runbook.md +0 -45
  371. package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
  372. package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
  373. package/docs/architecture/current/repository-access-modes.md +0 -102
  374. package/docs/architecture/current/route-policy.md +0 -15
  375. package/docs/architecture/current/route-session-concurrency.md +0 -85
  376. package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
  377. package/docs/architecture/current/runtime-directory-map.md +0 -49
  378. package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
  379. package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
  380. package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
  381. package/docs/architecture/current/system-overview.md +0 -144
  382. package/docs/architecture/current/target-requirements-traceability.md +0 -202
  383. package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
  384. package/docs/architecture/current/thin-harness-v1.md +0 -311
  385. package/docs/architecture/current/verification-and-release-gates.md +0 -391
  386. package/docs/forge-autonomous-goal-loop.md +0 -9
  387. package/docs/forge-provider-configuration.md +0 -7
  388. package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -83
  389. package/docs/operations/controller-desktop-plugin.md +0 -112
  390. package/docs/operations/gmail-assistant-routines.md +0 -186
  391. package/docs/operations/personal-assistant-operator-guide.md +0 -61
  392. package/docs/operations/provider-configuration.md +0 -31
  393. package/scripts/harness-trace-grade.sh +0 -150
  394. package/scripts/heartbeat-triage.sh +0 -361
  395. package/scripts/maintenance-triage.sh +0 -167
  396. package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
  397. package/src/cli/repositories/goal-registry.ts +0 -239
  398. package/src/runtime/assistant/action-proposals.ts +0 -279
  399. package/src/runtime/assistant/intent.ts +0 -395
  400. package/src/runtime/assistant/model-provider.ts +0 -460
  401. package/src/runtime/assistant/openapi.ts +0 -223
  402. package/src/runtime/assistant/policy.ts +0 -89
  403. package/src/runtime/assistant/readiness.ts +0 -258
  404. package/src/runtime/assistant/routine-runtime.ts +0 -477
  405. package/src/runtime/assistant/schedule-binding.ts +0 -171
  406. package/src/runtime/assistant/standing-grants.ts +0 -375
  407. package/src/runtime/assistant/store.ts +0 -243
  408. package/src/runtime/assistant/types.ts +0 -135
  409. package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
  410. package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
  411. package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
  412. package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
  413. package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
  414. package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
  415. package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
  416. package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
  417. package/src/runtime/control-plane/goal-loop/index.ts +0 -13
  418. package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
  419. package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
  420. package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
  421. package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
  422. package/src/runtime/control-plane/goal-loop/types.ts +0 -378
  423. package/src/runtime/control-plane/startup-recovery.ts +0 -198
  424. package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
  425. package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
  426. package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
  427. package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
  428. package/src/runtime/plugins/desktop-adapter.ts +0 -374
  429. package/src/runtime/safe-tooling/browser-safe.ts +0 -133
  430. package/src/runtime/workflow/findings/store.ts +0 -204
  431. package/src/runtime/workflow/findings/types.ts +0 -58
  432. package/src/runtime/workflow/portfolio/engine.ts +0 -20
  433. package/src/runtime/workflow/portfolio/store.ts +0 -185
  434. package/src/runtime/workflow/portfolio/types.ts +0 -29
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { readFileSync, existsSync, readdirSync } from 'node:fs';
2
+ import { readFileSync, existsSync, lstatSync, readdirSync } from 'node:fs';
3
3
  import { resolve } from 'node:path';
4
4
 
5
5
  const root = resolve(new URL('..', import.meta.url).pathname);
@@ -15,8 +15,16 @@ function text(path) {
15
15
  function requireText(path, needle) {
16
16
  if (!text(path).includes(needle)) failures.push(`${path} must contain ${JSON.stringify(needle)}`);
17
17
  }
18
+ function hasFilesystemContent(path) {
19
+ const absolute = resolve(root, path);
20
+ if (!existsSync(absolute)) return false;
21
+ if (!lstatSync(absolute).isDirectory()) return true;
22
+ return readdirSync(absolute, { withFileTypes: true }).some((entry) =>
23
+ entry.isDirectory() ? hasFilesystemContent(`${path}/${entry.name}`) : true,
24
+ );
25
+ }
18
26
  function requireMissing(path) {
19
- if (existsSync(resolve(root, path))) failures.push(`${path} must be deleted`);
27
+ if (hasFilesystemContent(path)) failures.push(`${path} must be deleted`);
20
28
  }
21
29
  function requireMatch(path, expression, description) {
22
30
  if (!expression.test(text(path))) failures.push(`${path} must ${description}`);
@@ -44,10 +52,42 @@ function sourceFiles(directory) {
44
52
  return files;
45
53
  }
46
54
 
55
+ const allowedArchitectureRootMarkdown = new Set(['CURRENT.md', 'EVOLUTION.md', 'history.md', 'index.md']);
56
+ const architectureRootMarkdown = readdirSync(resolve(root, 'docs/architecture'), { withFileTypes: true })
57
+ .filter((entry) => entry.isFile() && entry.name.endsWith('.md'))
58
+ .map((entry) => entry.name)
59
+ .sort();
60
+ for (const name of architectureRootMarkdown) {
61
+ if (!allowedArchitectureRootMarkdown.has(name)) {
62
+ failures.push(`docs/architecture/${name} must be archived under docs/architecture/history/ instead of acting as parallel root architecture authority`);
63
+ }
64
+ }
65
+
66
+ for (const path of ['README.md', 'docs/ROADMAP.md', 'docs/architecture/CURRENT.md', 'docs/architecture/index.md']) {
67
+ forbid(path, /\/Users\//, 'maintained documentation must not contain personal absolute macOS paths');
68
+ forbid(path, /\bRepo Harness\b/i, 'maintained documentation must use the current Forge product identity');
69
+ forbid(path, /(?:^|\n)\s*(?:>\s*)?(?:\*\*)?Status(?:\*\*)?\s*:\s*[^\n]*(?:implementation in progress|Phase\s+\d+)/i, 'maintained documentation must not carry transient execution status; use Plan/Work/evidence or history');
70
+ }
71
+
47
72
  const required = [
48
73
  'src/runtime/gateway/mcp/router.ts',
49
74
  'src/cli/agent-jobs/executable-resolver.ts',
50
75
  'src/runtime/control-plane/global-scheduler/scheduler.ts',
76
+ 'src/runtime/control-plane/global-scheduler/config.ts',
77
+ 'src/runtime/control-plane/global-scheduler/state.ts',
78
+ 'src/runtime/control-plane/global-scheduler/worker-launch.ts',
79
+ 'src/runtime/control-plane/global-scheduler/dispatch-capacity.ts',
80
+ 'src/runtime/control-plane/global-scheduler/projection-refresh.ts',
81
+ 'src/runtime/control-plane/global-scheduler/worker-lifecycle.ts',
82
+ 'src/runtime/control-plane/global-scheduler/worker-stderr.ts',
83
+ 'src/runtime/control-plane/global-scheduler/worker-attachment.ts',
84
+ 'src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts',
85
+ 'src/runtime/control-plane/global-scheduler/maintenance.ts',
86
+ 'src/runtime/control-plane/global-scheduler/source-scan.ts',
87
+ 'src/runtime/control-plane/global-scheduler/durable-admission.ts',
88
+ 'src/runtime/control-plane/global-scheduler/worker-exit-decision.ts',
89
+ 'src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts',
90
+ 'src/runtime/control-plane/global-scheduler/worker-process.ts',
51
91
  'src/runtime/control-plane/repo-actor/actor.ts',
52
92
  'src/runtime/execution/jobs/store.ts',
53
93
  'src/runtime/execution/jobs/timeouts.ts',
@@ -56,8 +96,7 @@ const required = [
56
96
  'src/runtime/execution/thin-harness/index.ts',
57
97
  'src/runtime/execution/thin-harness/execution-router.ts',
58
98
  'src/runtime/control-plane/routing/route-policy.ts',
59
- 'docs/architecture/current/route-policy.md',
60
- 'docs/architecture/current/thin-harness-v1.md',
99
+ 'docs/architecture/CURRENT.md',
61
100
  'src/runtime/resources/leases/store.ts',
62
101
  'src/runtime/evidence/event-ledger.ts',
63
102
  'src/runtime/evidence/evidence-store.ts',
@@ -70,8 +109,6 @@ const required = [
70
109
  'src/runtime/workflow/schedules/work-continuation.ts',
71
110
  'scripts/smoke-runtime-recovery.ts',
72
111
  'scripts/smoke-schedule-engine.ts',
73
- 'src/runtime/workflow/portfolio/engine.ts',
74
- 'src/runtime/workflow/findings/store.ts',
75
112
  'src/runtime/release/release-gate.ts',
76
113
  'src/runtime/root/runtime.ts',
77
114
  'src/runtime/root/readiness.ts',
@@ -85,12 +122,6 @@ const required = [
85
122
  'src/cli/commands/init-hook.ts',
86
123
  'src/cli/commands/runtime.ts',
87
124
  'src/cli/index.ts',
88
- 'docs/architecture/current/runtime-architecture-simplification.md',
89
- 'docs/architecture/current/implementation-status.md',
90
- 'docs/architecture/current/runtime-directory-map.md',
91
- 'docs/architecture/current/operations-runbook.md',
92
- 'docs/architecture/current/target-requirements-traceability.md',
93
- 'docs/architecture/current/approved-target-architecture.zh-CN.md',
94
125
  ];
95
126
  for (const path of required) text(path);
96
127
  requireText('src/runtime/control-plane/routing/route-policy.ts', "export function decideRoute");
@@ -110,7 +141,6 @@ forbidBetween(
110
141
  for (const adapter of [
111
142
  'src/cli/controller/work-mode.ts',
112
143
  'src/runtime/control-plane/facade/types.ts',
113
- 'src/runtime/control-plane/goal-loop/executor-router.ts',
114
144
  ]) {
115
145
  requireText(adapter, '@deprecated Compatibility adapter');
116
146
  requireText(adapter, 'decideRoute(');
@@ -126,6 +156,16 @@ requireMissing('src/runtime/control-plane/daemon-entry.ts');
126
156
  requireMissing('scripts/smoke-runtime-control-plane.ts');
127
157
  requireMissing('src/cli/controller/lifecycle.ts');
128
158
  requireMissing('src/cli/commands/supervisor.ts');
159
+ requireMissing('src/runtime/control-plane/goal-loop');
160
+ requireMissing('src/cli/repositories/goal-registry.ts');
161
+ requireMissing('src/runtime/assistant');
162
+ requireMissing('src/runtime/personal-assistant');
163
+ requireMissing('src/runtime/workflow/findings');
164
+ forbid(
165
+ 'src/runtime/control-plane/global-scheduler/scheduler.ts',
166
+ /tickGoalLoopsForController|lastGoalLoopTick/,
167
+ 'Scheduler must not restore autonomous Goal Loop polling',
168
+ );
129
169
  requireMissing('src/cli/controller/restart-coordinator-entry.ts');
130
170
  requireMissing('scripts/controller-runtime.sh');
131
171
  requireMissing('scripts/activate-source-baseline.command');
@@ -145,6 +185,13 @@ requireMissing('OPTIMIZATION_REPORT.md');
145
185
  requireMissing('docs/architecture/RELIABILITY-PROGRAM.md');
146
186
  requireMissing('docs/architecture/p0-canonical-single-runtime-plan.md');
147
187
  requireMissing('docs/architecture/transactional-adoption-planner.md');
188
+ requireMissing('docs/architecture/global-hook-runtime.md');
189
+ requireMissing('docs/architecture/ios-semantic-automation-provider-v2.md');
190
+ requireMissing('docs/architecture/chatgpt-handoff-facade.md');
191
+ requireText('docs/architecture/history/global-hook-runtime.md', 'Status: **Historical Evidence — Not Runtime Authority**');
192
+ requireText('docs/architecture/history/ios-semantic-automation-provider-v2.md', 'Status: **Historical Design Evidence — Not Runtime Authority**');
193
+ requireText('docs/architecture/history/chatgpt-handoff-facade.md', 'Status: **Historical Design Rationale — Not Runtime Authority**');
194
+ requireText('docs/architecture/history/README.md', 'Status: **Historical Evidence — Not Runtime Authority**');
148
195
  requireMissing('docs/operations/20260802-requirement-portfolio-migration.md');
149
196
  requireMissing('docs/runbooks/RELIABILITY-SESSION-PROTOCOL.md');
150
197
  requireMissing('docs/architecture/decisions/20260718-mcp-session-lifecycle-and-ingress-isolation.md');
@@ -156,6 +203,7 @@ requireMissing('bin/repo-harness-hook.mjs');
156
203
  requireMissing('bin/repo-harness-runtime.mjs');
157
204
  requireMissing('src/runtime/control-plane/daemon-client.ts');
158
205
  requireMissing('src/runtime/control-plane/daemon-ownership.ts');
206
+ requireMissing('src/runtime/workflow/portfolio');
159
207
  for (const path of sourceFiles('src')) {
160
208
  const source = text(path);
161
209
  for (const retiredAuthority of [
@@ -209,24 +257,16 @@ for (const projectionPath of [
209
257
  }
210
258
  requireText('src/runtime/projections/invalidation.ts', 'runtimeInstanceId?: string');
211
259
  requireText('src/runtime/projections/materialized-view.ts', 'currentOwner.runtimeInstanceId !== owner.runtimeInstanceId');
212
- requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'getRuntimeWriteClaim()?.runtimeInstanceId');
260
+ requireText('src/runtime/control-plane/global-scheduler/projection-refresh.ts', 'getRuntimeWriteClaim()?.runtimeInstanceId');
213
261
  forbid(
214
262
  'src/runtime/execution/jobs/receipt-store.ts',
215
263
  /ownerEpoch|releaseFencingToken/,
216
264
  'persist only non-secret Canonical Runtime/release identity in OperationReceipt ownership evidence',
217
265
  );
218
266
 
219
- requireText('docs/architecture/current/runtime-architecture-simplification.md', 'one local MCP application');
220
- requireText('docs/architecture/current/runtime-architecture-simplification.md', 'one active Runtime');
221
- requireText('docs/architecture/current/runtime-architecture-simplification.md', 'one whole-Runtime readiness result');
222
- requireText('docs/architecture/current/runtime-architecture-simplification.md', 'Legacy code may receive only deletion-enabling or safety-fencing changes.');
223
- forbidBetween(
224
- 'docs/architecture/current/runtime-architecture-simplification.md',
225
- '## 2. Target Runtime',
226
- '## 3. Seven phases',
227
- /Stable Supervisor|Stable Ingress|blue\/green|candidate\/current\/previous/i,
228
- 'define the target Runtime without Supervisor, ingress, slots, or component rollback',
229
- );
267
+ requireText('docs/architecture/CURRENT.md', 'Canonical Runtime is activated as one immutable whole release');
268
+ requireText('docs/architecture/CURRENT.md', 'Runtime availability/recovery keeps Forge itself healthy');
269
+ requireText('docs/architecture/CURRENT.md', 'Historical Issue/Task/Local Job and compatibility projections must not become second mutable authorities.');
230
270
  requireText('src/runtime/root/runtime.ts', 'export class CanonicalForgeRuntime');
231
271
  forbid('src/runtime/control-plane/runtime-status-client.ts', /ensureControllerDaemon|child_process|daemon-entry|StableSupervisor|ownerEpoch|slot\?:/, 'keep Forge Runtime status observation read-only and free of legacy lifecycle authority');
232
272
  requireText('src/runtime/root/runtime.ts', "startInProcessScheduler");
@@ -354,21 +394,11 @@ forbid(
354
394
  /\bcreateExecutionJob\b/,
355
395
  'Runtime MCP tools must not retain dormant ExecutionJob creation paths',
356
396
  );
357
- forbid(
358
- 'src/runtime/assistant/intent.ts',
359
- /\bcreateExecutionJob\b/,
360
- 'Assistant intent and routine triggers must use direct plugin actions or external-Controller handoffs',
361
- );
362
397
  forbid(
363
398
  'src/runtime/execution/jobs/legacy-adapter.ts',
364
399
  /\bcreateExecutionJob\b|\bdispatchLegacyLocalJob\b/,
365
400
  'Legacy Local Bridge compatibility must be read-only and must not dispatch new ExecutionJobs',
366
401
  );
367
- forbid(
368
- 'src/runtime/workflow/portfolio/engine.ts',
369
- /\bcreateExecutionJob\b|\bfindExecutionJob\b/,
370
- 'Portfolio definitions are planning records; Kernel-owned Portfolio execution is retired',
371
- );
372
402
  forbid(
373
403
  'src/cli/local-bridge/server.ts',
374
404
  /\bsubmitLocalBridgeJob\b|\bdispatchLocalBridgeJob\b|\basyncExecute\b/,
@@ -425,16 +455,6 @@ forbid(
425
455
  /\bretryAgentJob\b/,
426
456
  'Legacy MCP must not call Agent Run retry',
427
457
  );
428
- forbid(
429
- 'src/runtime/workflow/portfolio/engine.ts',
430
- /\bacceptTaskJob\b|\bstartTaskJob\b|\bretryAgentJob\b/,
431
- 'Portfolio Engine must not start or retry Kernel-managed Agent Runs',
432
- );
433
- forbid(
434
- 'src/runtime/control-plane/goal-loop/goal-loop-engine.ts',
435
- /\bcreateExecutionJob\b|\bsubmitLocalBridgeJob\b|\bacceptTaskJob\b|\bstartTaskJob\b|\bdispatchProvider\b/,
436
- 'Goal Loop must not create Jobs, Agent Runs, or invoke Kernel Provider dispatch',
437
- );
438
458
  forbid('src/runtime/gateway/mcp/router.ts', /Use process_get \/ process_wait \/ process_logs/, 'Gateway follow-up instructions must use an always-exposed neutral Work facade');
439
459
  requireMatch(
440
460
  'src/runtime/gateway/mcp/router.ts',
@@ -446,12 +466,6 @@ requireText('src/runtime/gateway/mcp/runtime-tools.ts', "case 'local_bridge_stat
446
466
  requireText('src/runtime/gateway/mcp/runtime-tools.ts', 'readAgentExecutableReadinessSnapshot');
447
467
  requireText('src/runtime/gateway/mcp/runtime-tools.ts', 'connectorExposedTools');
448
468
  requireText('src/runtime/gateway/mcp/runtime-tools.ts', 'currentCallableTools');
449
- forbid(
450
- 'docs/architecture/current/implementation-status.md',
451
- /Stable external lifecycle Supervisor \| Implemented|Stable ingress event-loop isolation \| Implemented/,
452
- 'legacy Supervisor or Stable Ingress must not be reported as the target implementation',
453
- );
454
- requireText('docs/architecture/current/implementation-status.md', 'Canonical Single Runtime vertical slice');
455
469
  forbid('src/runtime/gateway/mcp/runtime-tools.ts', /inspectAgentExecutableReadiness|resolveAgentExecutable|writeAgentExecutableReadinessSnapshot/, 'Gateway readiness must only read the Daemon-produced Agent executable snapshot');
456
470
  forbidBetween(
457
471
  'src/runtime/gateway/mcp/runtime-tools.ts',
@@ -491,15 +505,50 @@ requireText('src/runtime/execution/jobs/receipt-store.ts', "state: 'started' | '
491
505
  requireText('src/runtime/execution/thin-harness/execution-router.ts', "mode: 'fast'");
492
506
  requireText('src/runtime/execution/thin-harness/execution-router.ts', 'routeExecution');
493
507
  requireText('src/runtime/execution/thin-harness/types.ts', 'FastExecutionReceipt');
494
- requireText('docs/architecture/current/thin-harness-v1.md', 'Default to direct Fast Path execution');
508
+ requireText('docs/architecture/CURRENT.md', '### Ephemeral Direct — default');
495
509
  requireText('src/runtime/resources/leases/types.ts', 'fencingToken: number');
496
510
  requireText('src/runtime/resources/leases/store.ts', 'assertFencingToken');
497
511
  requireText('src/runtime/resources/leases/store.ts', 'expectedLeaseMap');
498
512
  requireText('src/runtime/resources/claims/conflicts.ts', "'repo-content:*'");
499
513
  requireText('src/runtime/control-plane/repo-actor/actor.ts', 'repo-actor-mailbox');
500
514
  requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'maxConcurrentRepositories');
501
- requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'maxHeavyChecks');
502
- requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'maxAgentProcesses');
515
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'createSchedulerDispatchCapacity');
516
+ requireText('src/runtime/control-plane/global-scheduler/dispatch-capacity.ts', 'maxHeavyChecks');
517
+ requireText('src/runtime/control-plane/global-scheduler/dispatch-capacity.ts', 'maxAgentProcesses');
518
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'normalizeSchedulerConfig');
519
+ requireText('src/runtime/control-plane/global-scheduler/config.ts', 'normalizeSchedulerConfig');
520
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'writeSchedulerHealthSnapshot');
521
+ requireText('src/runtime/control-plane/global-scheduler/state.ts', 'writeSchedulerHealthSnapshot');
522
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'buildSchedulerWorkerLaunchDescriptor');
523
+ requireText('src/runtime/control-plane/global-scheduler/worker-launch.ts', 'buildSchedulerWorkerLaunchDescriptor');
524
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'refreshSchedulerRepositoryProjections');
525
+ requireText('src/runtime/control-plane/global-scheduler/projection-refresh.ts', 'refreshRepositoryProjectionForRepository');
526
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'buildSchedulerWorkerSpawnedLifecycle');
527
+ requireText('src/runtime/control-plane/global-scheduler/worker-lifecycle.ts', 'buildSchedulerWorkerExitFailure');
528
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'createSchedulerWorkerStderrCapture');
529
+ requireText('src/runtime/control-plane/global-scheduler/worker-stderr.ts', 'MAX_SCHEDULER_WORKER_STDERR_BYTES');
530
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'persistSchedulerWorkerAttachment');
531
+ requireText('src/runtime/control-plane/global-scheduler/worker-attachment.ts', 'attachExecutionWorker');
532
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'runSchedulerPeriodicCleanup');
533
+ requireText('src/runtime/control-plane/global-scheduler/maintenance.ts', 'runSchedulerValidationReconciliation');
534
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'planSchedulerSourceSampling');
535
+ requireText('src/runtime/control-plane/global-scheduler/source-scan.ts', 'selectSchedulerSourceScanRepositories');
536
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'runSchedulerDurableAdmission');
537
+ requireText('src/runtime/control-plane/global-scheduler/durable-admission.ts', 'markExecutionJobSchedulerObserved');
538
+ requireText('src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts', 'persistSchedulerTerminalWorkerLifecycle');
539
+ requireText('src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts', 'TERMINAL_JOB_STATUSES');
540
+ requireText('src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts', 'evaluateSchedulerWorkerExitCandidate');
541
+ requireText('src/runtime/control-plane/global-scheduler/worker-exit-decision.ts', 'TERMINAL_JOB_STATUSES');
542
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'reconcileSchedulerWorkerExit');
543
+ requireText('src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts', 'releaseExecutionLeases');
544
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'cleanupSchedulerWorkerProcesses');
545
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'registerSchedulerWorkerProcess');
546
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'spawnSchedulerWorkerProcess');
547
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'wireSchedulerWorkerProcess');
548
+ requireText('src/runtime/control-plane/global-scheduler/worker-process.ts', 'cleanupSchedulerWorkerProcesses');
549
+ requireText('src/runtime/control-plane/global-scheduler/worker-process.ts', 'dependencies.spawnProcess');
550
+ requireText('src/runtime/control-plane/global-scheduler/worker-process.ts', 'terminateProcessTree');
551
+ requireText('src/runtime/control-plane/global-scheduler/worker-process.ts', "child.once('close'");
503
552
  requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'writeAgentExecutableReadinessSnapshot');
504
553
  requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'sampleRepositoryGitStatusForRepositories');
505
554
  requireText('src/cli/agent-jobs/executable-resolver.ts', 'revalidateAgentExecutable');
@@ -533,7 +582,7 @@ forbidBetween(
533
582
  requireText('src/runtime/control-plane/execution/session-store.ts', 'lastValidatedAt: now');
534
583
  requireText('src/runtime/control-plane/execution/validation.ts', 'warnings.push');
535
584
  requireText('src/runtime/control-plane/execution/work-handle-store.ts', "failed: ['validating', 'editing', 'committed', 'merged', 'cleaned', 'failed_terminal_cleanup']");
536
- requireText('src/runtime/gateway/mcp/execution-tools.ts', 'resetFailedFinalizationStages');
585
+ requireText('src/runtime/gateway/mcp/execution-tools.ts', 'resetFinalizationStagesForRequest');
537
586
  requireText('src/runtime/gateway/mcp/execution-tools.ts', 'finalizationComplete');
538
587
  forbidBetween(
539
588
  'src/runtime/gateway/mcp/execution-tools.ts',
@@ -546,9 +595,6 @@ requireText('src/runtime/workflow/schedules/types.ts', "'repository-event'");
546
595
  requireText('src/runtime/workflow/schedules/types.ts', "'dependency-checkpoint'");
547
596
  requireText('src/runtime/workflow/schedules/store.ts', 'saveScheduleDecision');
548
597
  requireText('src/runtime/workflow/schedules/settlement.ts', 'backoffMinutes');
549
- requireText('src/runtime/workflow/portfolio/store.ts', "'workflows.json'");
550
- requireText('src/runtime/workflow/portfolio/store.ts', 'PORTFOLIO_DEPENDENCY_CYCLE');
551
- requireText('src/runtime/workflow/findings/store.ts', 'observationCount');
552
598
  requireText('src/runtime/release/release-gate.ts', 'releaseReady');
553
599
  requireText('src/cli/mcp/transports/http.ts', "'/ready'");
554
600
  requireText('src/cli/mcp/transports/http.ts', "'/repos/:repoId/health'");
@@ -568,12 +614,9 @@ for (const path of [
568
614
  forbid(path, /\b(?:spawnSync|execSync|execFileSync)\s*\(/, 'the non-blocking Gateway/Controller hot-path rule');
569
615
  }
570
616
 
571
- requireText('docs/architecture/current/implementation-status.md', 'Thin MCP Gateway | Implemented');
572
- requireText('docs/architecture/current/implementation-status.md', 'Per-Repository Actor | Implemented');
573
- requireText('docs/architecture/current/implementation-status.md', 'Schedule, Trigger, Decision and Occurrence | Implemented');
574
- requireText('docs/architecture/current/implementation-status.md', 'Release Freeze and Gate | Implemented');
575
- requireText('docs/architecture/current/target-requirements-traceability.md', '## 4. Architecture constitution');
576
- requireText('docs/architecture/current/target-requirements-traceability.md', '## 16. Standard execution flow');
617
+ requireText('docs/architecture/CURRENT.md', '## State ownership');
618
+ requireText('docs/architecture/CURRENT.md', '## Runtime and MCP boundary');
619
+ requireText('docs/architecture/CURRENT.md', '## Testing and verification');
577
620
  requireText('plans/README.md', 'not the runtime execution queue');
578
621
  if (text('src/cli/mcp/tools.ts').split(/\r?\n/).length > 40) failures.push('src/cli/mcp/tools.ts must remain a thin compatibility facade');
579
622
 
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env bun
2
+ import { createHash } from 'crypto';
3
+ import { mkdirSync, renameSync, writeFileSync } from 'fs';
4
+ import { dirname, join } from 'path';
5
+ import { resolveControllerHome } from '../src/cli/repositories/controller-home';
6
+ import { recoveryConnectorDescriptor, verifyRecoveryConnector } from '../src/cli/commands/recovery';
7
+ import { loadRecoveryConfig, verifyStableRuntime } from '../src/runtime/standalone-recovery/core';
8
+ import { observeRuntimeStatus } from '../src/runtime/root/status';
9
+
10
+ interface BaselineReceipt {
11
+ schemaVersion: 1;
12
+ status: 'passed' | 'failed';
13
+ controllerHome: string;
14
+ observedAt: string;
15
+ runtime: ReturnType<typeof observeRuntimeStatus>;
16
+ recovery: {
17
+ connector: ReturnType<typeof recoveryConnectorDescriptor>;
18
+ runtimeVerify: Awaited<ReturnType<typeof verifyStableRuntime>>;
19
+ connectorVerify: Awaited<ReturnType<typeof verifyRecoveryConnector>>;
20
+ };
21
+ blockers: string[];
22
+ receiptId: string;
23
+ }
24
+
25
+ function argValue(name: string): string | undefined {
26
+ const index = process.argv.indexOf(name);
27
+ return index >= 0 ? process.argv[index + 1] : undefined;
28
+ }
29
+
30
+ function atomicJson(path: string, value: unknown): void {
31
+ mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
32
+ const temporary = `${path}.${process.pid}.tmp`;
33
+ writeFileSync(temporary, `${JSON.stringify(value, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 });
34
+ renameSync(temporary, path);
35
+ }
36
+
37
+ export async function checkStableBaseline(controllerHomeInput?: string): Promise<BaselineReceipt> {
38
+ const controllerHome = resolveControllerHome(controllerHomeInput);
39
+ const config = loadRecoveryConfig(controllerHome);
40
+ const runtime = observeRuntimeStatus(controllerHome);
41
+ const connector = recoveryConnectorDescriptor(controllerHome);
42
+ const runtimeVerify = await verifyStableRuntime(config);
43
+ const connectorVerify = await verifyRecoveryConnector(controllerHome);
44
+ const blockers: string[] = [];
45
+
46
+ if (!runtime.running || !runtime.ready) blockers.push(`runtime_not_ready:${runtime.reasonCodes.join(',') || 'unknown'}`);
47
+ if (!runtimeVerify.ok) blockers.push('recovery_runtime_verify_failed');
48
+ if (!runtimeVerify.releases.coherent) blockers.push('runtime_release_not_coherent');
49
+ if (!connector.readyForChatGPT) blockers.push(...connector.warnings.map((warning) => `recovery_connector:${warning}`));
50
+ if (!connectorVerify.ok) blockers.push(...connectorVerify.failures.map((failure) => `recovery_connector_verify:${failure}`));
51
+ if (!connector.currentRelease) blockers.push('recovery_release_missing');
52
+
53
+ const observedAt = new Date().toISOString();
54
+ const identity = {
55
+ schemaVersion: 1,
56
+ controllerHome,
57
+ runtimeInstanceId: runtime.snapshot?.runtimeInstanceId,
58
+ runtimeRelease: runtimeVerify.releases.active?.revision,
59
+ runtimeManifest: runtimeVerify.releases.active?.manifestSha256,
60
+ runtimeToolSurfaceFingerprint: runtime.snapshot?.toolSurfaceFingerprint,
61
+ runtimeEndpoint: runtime.snapshot?.endpoint,
62
+ recoveryRelease: connector.currentRelease,
63
+ recoveryUrl: connector.url,
64
+ runtimeReady: runtime.ready,
65
+ runtimeVerifyOk: runtimeVerify.ok,
66
+ connectorVerifyOk: connectorVerify.ok,
67
+ };
68
+ const receiptId = createHash('sha256').update(JSON.stringify(identity)).digest('hex');
69
+ const receipt: BaselineReceipt = {
70
+ schemaVersion: 1,
71
+ status: blockers.length === 0 ? 'passed' : 'failed',
72
+ controllerHome,
73
+ observedAt,
74
+ runtime,
75
+ recovery: { connector, runtimeVerify, connectorVerify },
76
+ blockers,
77
+ receiptId,
78
+ };
79
+
80
+ const root = join(controllerHome, 'recovery', 'stable-baseline');
81
+ atomicJson(join(root, `${receiptId}.json`), receipt);
82
+ atomicJson(join(root, 'latest.json'), receipt);
83
+ return receipt;
84
+ }
85
+
86
+ if (import.meta.main) {
87
+ const explicit = argValue('--controller-home');
88
+ if (process.argv.includes('--controller-home') && !explicit) throw new Error('STABLE_BASELINE_CONTROLLER_HOME_REQUIRED');
89
+ const receipt = await checkStableBaseline(explicit);
90
+ process.stdout.write(`${JSON.stringify(receipt, null, 2)}\n`);
91
+ if (receipt.status !== 'passed') process.exitCode = 1;
92
+ }
@@ -161,7 +161,7 @@ plan_evidence_contract_error() {
161
161
  fi
162
162
 
163
163
  local label line value
164
- for label in "State/progress path" "Verification evidence" "Evaluator rubric" "Stop condition" "Rollback surface"; do
164
+ for label in "State/progress path" "Verification evidence" "Impact review|Evaluator rubric" "Stop condition" "Rollback surface"; do
165
165
  line="$(printf '%s\n' "$section" | grep -Ei "^[[:space:]]*-[[:space:]]*(\\*\\*)?${label}(\\*\\*)?[[:space:]]*:" | head -1 || true)"
166
166
  if [[ -z "$line" ]]; then
167
167
  echo "missing field: ${label}"
@@ -189,7 +189,7 @@ check_plan_template_evidence_contract() {
189
189
  return
190
190
  }
191
191
 
192
- for label in "State/progress path" "Verification evidence" "Evaluator rubric" "Stop condition" "Rollback surface"; do
192
+ for label in "State/progress path" "Verification evidence" "Impact review" "Stop condition" "Rollback surface"; do
193
193
  if ! grep -Eiq "^[[:space:]]*-[[:space:]]*(\\*\\*)?${label}(\\*\\*)?[[:space:]]*:" "$file"; then
194
194
  report_issue "Plan template Evidence Contract is missing field '${label}': $file"
195
195
  fi
@@ -668,11 +668,11 @@ check_helper_runtime_files() {
668
668
  new-spec.sh new-sprint.sh new-plan.sh capture-plan.sh plan-to-todo.sh
669
669
  contract-run.ts contract-worktree.sh ship-worktrees.sh archive-workflow.sh
670
670
  refresh-current-status.sh prepare-handoff.sh verify-contract.sh summarize-failures.sh
671
- verify-sprint.sh harness-trace-grade.sh sprint-backlog.sh check-task-sync.sh check-deploy-sql-order.sh
671
+ verify-sprint.sh sprint-backlog.sh check-task-sync.sh check-deploy-sql-order.sh
672
672
  check-architecture-sync.sh check-agent-tooling.sh check-context-files.sh
673
673
  check-brain-manifest.sh sync-brain-docs.sh check-skill-version.ts
674
674
  select-agent-context-blocks.sh ensure-task-workflow.sh check-task-workflow.sh
675
- maintenance-triage.sh heartbeat-triage.sh switch-plan.sh workflow-contract.ts
675
+ switch-plan.sh workflow-contract.ts
676
676
  inspect-project-state.ts migrate-workflow-docs.ts migrate-project-template.sh
677
677
  capability-resolver.ts architecture-event.ts capability-config.ts architecture-queue.sh
678
678
  archive-architecture-request.sh context-contract-sync.sh workstream-sync.sh
@@ -456,8 +456,7 @@ finish_worktree() {
456
456
  exit 1
457
457
  fi
458
458
 
459
- local current_branch slug active_plan contract_file review_file target_worktree artifact_stem
460
- local external_status external_state external_reviewer external_source external_message
459
+ local current_branch slug active_plan contract_file target_worktree artifact_stem
461
460
  current_branch="$(git branch --show-current)"
462
461
  [[ -n "$current_branch" ]] || { echo "contract-worktree: detached HEAD is not supported" >&2; exit 1; }
463
462
  [[ "$current_branch" != "$target_branch" ]] || { echo "contract-worktree: already on target branch $target_branch" >&2; exit 1; }
@@ -470,7 +469,6 @@ finish_worktree() {
470
469
  active_plan="$(get_active_plan || true)"
471
470
  if [[ -n "$active_plan" ]]; then
472
471
  contract_file="$(workflow_active_contract || true)"
473
- review_file="$(workflow_active_review || true)"
474
472
  fi
475
473
  fi
476
474
 
@@ -483,27 +481,9 @@ finish_worktree() {
483
481
  contract_file="tasks/contracts/${artifact_stem}.contract.md"
484
482
  fi
485
483
  fi
486
- if [[ -n "${active_plan:-}" && -z "${review_file:-}" ]]; then
487
- artifact_stem="${artifact_stem:-$(derive_artifact_stem_from_plan "$active_plan")}"
488
- if [[ -f "tasks/reviews/${artifact_stem}.review.md" ]] || [[ ! -f "tasks/reviews/${slug}.review.md" ]]; then
489
- review_file="tasks/reviews/${artifact_stem}.review.md"
490
- fi
491
- fi
492
484
  contract_file="${contract_file:-tasks/contracts/${slug}.contract.md}"
493
- review_file="${review_file:-tasks/reviews/${slug}.review.md}"
494
485
 
495
486
  [[ -n "$contract_file" && -f "$contract_file" ]] || { echo "contract-worktree: no active sprint contract found" >&2; exit 1; }
496
- [[ -n "$review_file" && -f "$review_file" ]] || { echo "contract-worktree: no active sprint review found" >&2; exit 1; }
497
-
498
- if declare -F workflow_external_acceptance_status >/dev/null 2>&1; then
499
- external_status="$(workflow_external_acceptance_status "$review_file")"
500
- IFS=$'\t' read -r external_state external_reviewer external_source external_message <<< "$external_status"
501
- if [[ "$external_state" != "pass" && "$external_state" != "manual_override" ]]; then
502
- echo "contract-worktree: external acceptance gate failed: ${external_message:-missing external acceptance}" >&2
503
- echo "contract-worktree: record ## External Acceptance Advice in $review_file via $(workflow_external_acceptance_expected_source) before finish" >&2
504
- exit 1
505
- fi
506
- fi
507
487
 
508
488
  check_architecture_freshness "$target_branch"
509
489
  bash "scripts/verify-sprint.sh"