@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,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { readFileSync, existsSync, readdirSync } from 'node:fs';
3
- import { resolve } from 'node:path';
2
+ import { readFileSync, existsSync, lstatSync, readdirSync } from 'node:fs';
3
+ import { createRequire } from 'node:module';
4
+ import { dirname, extname, normalize, resolve } from 'node:path';
4
5
 
5
6
  const root = resolve(new URL('..', import.meta.url).pathname);
6
7
  const failures = [];
@@ -15,8 +16,16 @@ function text(path) {
15
16
  function requireText(path, needle) {
16
17
  if (!text(path).includes(needle)) failures.push(`${path} must contain ${JSON.stringify(needle)}`);
17
18
  }
19
+ function hasFilesystemContent(path) {
20
+ const absolute = resolve(root, path);
21
+ if (!existsSync(absolute)) return false;
22
+ if (!lstatSync(absolute).isDirectory()) return true;
23
+ return readdirSync(absolute, { withFileTypes: true }).some((entry) =>
24
+ entry.isDirectory() ? hasFilesystemContent(`${path}/${entry.name}`) : true,
25
+ );
26
+ }
18
27
  function requireMissing(path) {
19
- if (existsSync(resolve(root, path))) failures.push(`${path} must be deleted`);
28
+ if (hasFilesystemContent(path)) failures.push(`${path} must be deleted`);
20
29
  }
21
30
  function requireMatch(path, expression, description) {
22
31
  if (!expression.test(text(path))) failures.push(`${path} must ${description}`);
@@ -44,10 +53,141 @@ function sourceFiles(directory) {
44
53
  return files;
45
54
  }
46
55
 
56
+ function relativeStaticTypeScriptDependencyGraph(directory = 'src') {
57
+ let ts;
58
+ try {
59
+ ts = createRequire(import.meta.url)('typescript');
60
+ } catch (error) {
61
+ failures.push(`TypeScript dependency is required for architecture import-cycle analysis: ${error instanceof Error ? error.message : String(error)}`);
62
+ return new Map();
63
+ }
64
+
65
+ const files = sourceFiles(directory).sort();
66
+ const known = new Set(files);
67
+ const graph = new Map(files.map((path) => [path, new Set()]));
68
+
69
+ function resolveTypeScriptImport(fromPath, specifier) {
70
+ if (!specifier.startsWith('.')) return undefined;
71
+ const base = normalize(`${dirname(fromPath)}/${specifier}`).replaceAll('\\', '/');
72
+ const extension = extname(base);
73
+ const withoutRuntimeExtension = ['.js', '.mjs', '.cjs'].includes(extension)
74
+ ? base.slice(0, -extension.length)
75
+ : base;
76
+ const candidates = extension === '.ts'
77
+ ? [base]
78
+ : [withoutRuntimeExtension, `${withoutRuntimeExtension}.ts`, `${withoutRuntimeExtension}/index.ts`];
79
+ return candidates.find((candidate) => known.has(candidate));
80
+ }
81
+
82
+ for (const path of files) {
83
+ const sourceFile = ts.createSourceFile(path, text(path), ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
84
+ for (const statement of sourceFile.statements) {
85
+ let specifier;
86
+ if ((ts.isImportDeclaration(statement) || ts.isExportDeclaration(statement))
87
+ && statement.moduleSpecifier
88
+ && ts.isStringLiteralLike(statement.moduleSpecifier)) {
89
+ specifier = statement.moduleSpecifier.text;
90
+ } else if (ts.isImportEqualsDeclaration(statement)
91
+ && ts.isExternalModuleReference(statement.moduleReference)
92
+ && statement.moduleReference.expression
93
+ && ts.isStringLiteralLike(statement.moduleReference.expression)) {
94
+ specifier = statement.moduleReference.expression.text;
95
+ }
96
+ if (!specifier) continue;
97
+ const target = resolveTypeScriptImport(path, specifier);
98
+ if (target) graph.get(path).add(target);
99
+ }
100
+ }
101
+ return graph;
102
+ }
103
+
104
+ function stronglyConnectedComponents(graph) {
105
+ let index = 0;
106
+ const indices = new Map();
107
+ const lowLinks = new Map();
108
+ const stack = [];
109
+ const onStack = new Set();
110
+ const components = [];
111
+
112
+ function visit(node) {
113
+ indices.set(node, index);
114
+ lowLinks.set(node, index);
115
+ index += 1;
116
+ stack.push(node);
117
+ onStack.add(node);
118
+
119
+ for (const target of graph.get(node) ?? []) {
120
+ if (!indices.has(target)) {
121
+ visit(target);
122
+ lowLinks.set(node, Math.min(lowLinks.get(node), lowLinks.get(target)));
123
+ } else if (onStack.has(target)) {
124
+ lowLinks.set(node, Math.min(lowLinks.get(node), indices.get(target)));
125
+ }
126
+ }
127
+
128
+ if (lowLinks.get(node) !== indices.get(node)) return;
129
+ const component = [];
130
+ while (stack.length) {
131
+ const member = stack.pop();
132
+ onStack.delete(member);
133
+ component.push(member);
134
+ if (member === node) break;
135
+ }
136
+ components.push(component.sort());
137
+ }
138
+
139
+ for (const node of [...graph.keys()].sort()) {
140
+ if (!indices.has(node)) visit(node);
141
+ }
142
+ return components;
143
+ }
144
+
145
+ function requireAcyclicProductionTypeScript() {
146
+ const graph = relativeStaticTypeScriptDependencyGraph('src');
147
+ const cyclic = stronglyConnectedComponents(graph).filter((component) =>
148
+ component.length > 1 || (component.length === 1 && graph.get(component[0])?.has(component[0])),
149
+ );
150
+ for (const component of cyclic) {
151
+ failures.push(`production TypeScript import cycle: ${component.join(' -> ')}`);
152
+ }
153
+ }
154
+
155
+ const allowedArchitectureRootMarkdown = new Set(['CURRENT.md', 'EVOLUTION.md', 'history.md', 'index.md']);
156
+ const architectureRootMarkdown = readdirSync(resolve(root, 'docs/architecture'), { withFileTypes: true })
157
+ .filter((entry) => entry.isFile() && entry.name.endsWith('.md'))
158
+ .map((entry) => entry.name)
159
+ .sort();
160
+ for (const name of architectureRootMarkdown) {
161
+ if (!allowedArchitectureRootMarkdown.has(name)) {
162
+ failures.push(`docs/architecture/${name} must be archived under docs/architecture/history/ instead of acting as parallel root architecture authority`);
163
+ }
164
+ }
165
+
166
+ for (const path of ['README.md', 'docs/ROADMAP.md', 'docs/architecture/CURRENT.md', 'docs/architecture/index.md']) {
167
+ forbid(path, /\/Users\//, 'maintained documentation must not contain personal absolute macOS paths');
168
+ forbid(path, /\bRepo Harness\b/i, 'maintained documentation must use the current Forge product identity');
169
+ 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');
170
+ }
171
+
47
172
  const required = [
48
173
  'src/runtime/gateway/mcp/router.ts',
49
174
  'src/cli/agent-jobs/executable-resolver.ts',
50
175
  'src/runtime/control-plane/global-scheduler/scheduler.ts',
176
+ 'src/runtime/control-plane/global-scheduler/config.ts',
177
+ 'src/runtime/control-plane/global-scheduler/state.ts',
178
+ 'src/runtime/control-plane/global-scheduler/worker-launch.ts',
179
+ 'src/runtime/control-plane/global-scheduler/dispatch-capacity.ts',
180
+ 'src/runtime/control-plane/global-scheduler/projection-refresh.ts',
181
+ 'src/runtime/control-plane/global-scheduler/worker-lifecycle.ts',
182
+ 'src/runtime/control-plane/global-scheduler/worker-stderr.ts',
183
+ 'src/runtime/control-plane/global-scheduler/worker-attachment.ts',
184
+ 'src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts',
185
+ 'src/runtime/control-plane/global-scheduler/maintenance.ts',
186
+ 'src/runtime/control-plane/global-scheduler/source-scan.ts',
187
+ 'src/runtime/control-plane/global-scheduler/durable-admission.ts',
188
+ 'src/runtime/control-plane/global-scheduler/worker-exit-decision.ts',
189
+ 'src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts',
190
+ 'src/runtime/control-plane/global-scheduler/worker-process.ts',
51
191
  'src/runtime/control-plane/repo-actor/actor.ts',
52
192
  'src/runtime/execution/jobs/store.ts',
53
193
  'src/runtime/execution/jobs/timeouts.ts',
@@ -56,8 +196,27 @@ const required = [
56
196
  'src/runtime/execution/thin-harness/index.ts',
57
197
  'src/runtime/execution/thin-harness/execution-router.ts',
58
198
  'src/runtime/control-plane/routing/route-policy.ts',
59
- 'docs/architecture/current/route-policy.md',
60
- 'docs/architecture/current/thin-harness-v1.md',
199
+ 'src/runtime/control-plane/routing/workspace-admission.ts',
200
+ 'src/runtime/control-plane/facade/requirement-authority.ts',
201
+ 'src/runtime/control-plane/facade/repository-work-admission.ts',
202
+ 'src/runtime/control-plane/execution/retained-work-resume.ts',
203
+ 'src/runtime/control-plane/execution/work-handle-authority.ts',
204
+ 'src/runtime/control-plane/execution/work-verification-context.ts',
205
+ 'src/runtime/control-plane/execution/work-verification-service.ts',
206
+ 'src/runtime/control-plane/execution/repository-work-attribution.ts',
207
+ 'src/runtime/control-plane/execution/work-completion-authority.ts',
208
+ 'src/runtime/control-plane/execution/work-evidence-policy.ts',
209
+ 'src/runtime/control-plane/execution/work-execution-support.ts',
210
+ 'src/runtime/control-plane/execution/work-finalization-service.ts',
211
+ 'src/runtime/control-plane/execution/work-preparation-service.ts',
212
+ 'src/runtime/control-plane/execution/work-operation-service.ts',
213
+ 'src/runtime/control-plane/facade/work-state-machine.ts',
214
+ 'src/runtime/evidence/process-check-execution.ts',
215
+ 'src/runtime/context/semantic-navigation-contract.ts',
216
+ 'src/cli/mcp/tool-contract.ts',
217
+ 'src/cli/github/contracts.ts',
218
+ 'src/runtime/gateway/mcp/runtime-tool-definitions.ts',
219
+ 'docs/architecture/CURRENT.md',
61
220
  'src/runtime/resources/leases/store.ts',
62
221
  'src/runtime/evidence/event-ledger.ts',
63
222
  'src/runtime/evidence/evidence-store.ts',
@@ -70,8 +229,6 @@ const required = [
70
229
  'src/runtime/workflow/schedules/work-continuation.ts',
71
230
  'scripts/smoke-runtime-recovery.ts',
72
231
  'scripts/smoke-schedule-engine.ts',
73
- 'src/runtime/workflow/portfolio/engine.ts',
74
- 'src/runtime/workflow/findings/store.ts',
75
232
  'src/runtime/release/release-gate.ts',
76
233
  'src/runtime/root/runtime.ts',
77
234
  'src/runtime/root/readiness.ts',
@@ -85,32 +242,39 @@ const required = [
85
242
  'src/cli/commands/init-hook.ts',
86
243
  'src/cli/commands/runtime.ts',
87
244
  '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
245
  ];
95
246
  for (const path of required) text(path);
247
+ requireAcyclicProductionTypeScript();
248
+ for (const path of sourceFiles('src/runtime/control-plane')) {
249
+ forbid(path, /(?:from\s+['"]|import\s*\(\s*['"])(?:\.\.\/)+gateway\//, 'control-plane domain/application code must not depend on Gateway transport');
250
+ }
96
251
  requireText('src/runtime/control-plane/routing/route-policy.ts', "export function decideRoute");
97
252
  requireText('src/runtime/control-plane/routing/route-policy.ts', 'inputFingerprint');
98
253
  requireText('src/runtime/control-plane/routing/route-policy.ts', 'policyVersion');
99
- requireText('src/runtime/gateway/mcp/runtime-tools.ts', 'runPersistedCheckViaProcessRuntime({');
100
- requireText('src/runtime/gateway/mcp/runtime-tools.ts', 'interactiveWaitMs: 0');
101
- requireText('src/runtime/gateway/mcp/runtime-tools.ts', 'checkContentRevision');
102
- requireText('src/runtime/gateway/mcp/runtime-tools.ts', 'observedGitHead');
103
- forbidBetween(
254
+ requireText('src/runtime/control-plane/execution/work-verification-service.ts', 'runPersistedCheckViaProcessRuntime({');
255
+ requireText('src/runtime/control-plane/execution/work-verification-service.ts', 'interactiveWaitMs: input.interactiveWaitMs ?? 0');
256
+ requireText('src/runtime/control-plane/execution/work-verification-service.ts', 'checkContentRevision');
257
+ requireText('src/runtime/control-plane/execution/work-verification-service.ts', 'observedGitHead');
258
+ requireText('src/runtime/gateway/mcp/runtime-tools.ts', 'executeWorkVerification({');
259
+ requireText('src/cli/local-bridge/facade-api.ts', 'executeWorkVerification({');
260
+ forbid(
261
+ 'src/cli/local-bridge/facade-api.ts',
262
+ /runControllerCheck\s*\(/,
263
+ 'Local Bridge Work verification must use the canonical persisted Work verification service',
264
+ );
265
+ forbid(
104
266
  'src/runtime/gateway/mcp/runtime-tools.ts',
105
- 'async function runFacadeVerify(',
106
- 'export async function callRuntimeTool',
267
+ /function\s+classifyTerminalCheckEvidence\s*\(/,
268
+ 'terminal Check evidence classification belongs to Process Runtime, not the Gateway transport',
269
+ );
270
+ forbid(
271
+ 'src/runtime/control-plane/execution/work-verification-service.ts',
107
272
  /runControllerCheck\s*\(/,
108
- 'route rh_work verify through persisted Process Runtime instead of synchronous check execution',
273
+ 'route Work verification through persisted Process Runtime instead of synchronous check execution',
109
274
  );
110
275
  for (const adapter of [
111
276
  'src/cli/controller/work-mode.ts',
112
277
  'src/runtime/control-plane/facade/types.ts',
113
- 'src/runtime/control-plane/goal-loop/executor-router.ts',
114
278
  ]) {
115
279
  requireText(adapter, '@deprecated Compatibility adapter');
116
280
  requireText(adapter, 'decideRoute(');
@@ -122,10 +286,66 @@ for (const path of sourceFiles('src')) {
122
286
  forbid(path, /requirePlanForGoalWorkloop\s*:\s*true/, 'never restore mandatory Plan gating in production');
123
287
  }
124
288
  if (routeAuthorityCount !== 1) failures.push(`exactly one decideRoute authority is required; found ${routeAuthorityCount}`);
289
+ forbid(
290
+ 'src/runtime/control-plane/facade/goal-workloop.ts',
291
+ /function\s+(?:evaluateWorkCompletionEvidence|evaluateWorkImplementationEvidence|verificationRecordAppliesToCurrentWorkspace)\s*\(/,
292
+ 'keep Work evidence policy in the canonical work-evidence-policy module instead of reimplementing it in the facade',
293
+ );
294
+ requireText('src/runtime/control-plane/facade/goal-workloop.ts', "from '../execution/work-evidence-policy'");
295
+ for (const path of sourceFiles('src/runtime/control-plane')) {
296
+ if (path === 'src/runtime/control-plane/facade/work-contract-store.ts' || path === 'src/runtime/control-plane/execution/work-completion-authority.ts') continue;
297
+ forbid(
298
+ path,
299
+ /\brecordWorkCompletionReceipt\s*\(/,
300
+ 'route Work completion through the canonical work-completion-authority instead of writing terminal receipts directly',
301
+ );
302
+ }
303
+ requireText('src/runtime/control-plane/execution/work-finalization-service.ts', 'completeWorkWithReceipt(');
304
+ forbid(
305
+ 'src/runtime/plugins/browser-handoff-host.ts',
306
+ /browser\/sessions|saveBrowserSession|writeBrowserSession|sessionPath/,
307
+ 'Browser handoff sidecars must return interaction results and never write BrowserSession authority directly',
308
+ );
309
+ forbid(
310
+ 'src/runtime/plugins/browser-adapter.ts',
311
+ /BROWSER_POST_DISPATCH_REPLAY_SAFE_ACTIONS|POST_DISPATCH_REPLAY_SAFE_ACTIONS/,
312
+ 'Browser replay safety must come from Browser Runtime transaction policy, not an adapter-local allowlist',
313
+ );
314
+ requireText('src/runtime/plugins/browser-runtime.ts', 'browserActionCanReplayAfterDispatch');
315
+ forbid(
316
+ 'src/runtime/gateway/mcp/runtime-tools.ts',
317
+ /\b(?:createRequirement|resumeRetainedCancelledWorkContract)\s*\(/,
318
+ 'keep Requirement admission and retained-cancelled Work lifecycle authority out of the MCP transport',
319
+ );
320
+ forbid(
321
+ 'src/runtime/gateway/mcp/runtime-tools.ts',
322
+ /\b(?:updateWorkContract|writeWorkHandle)\s*\(/,
323
+ 'keep WorkContract/WorkHandle persistence policy out of the MCP transport',
324
+ );
325
+ forbid(
326
+ 'src/runtime/gateway/mcp/execution-tools.ts',
327
+ /\bcreateWorkContract\s*\(/,
328
+ 'route compatibility work preparation through canonical Work admission authority',
329
+ );
330
+ forbid(
331
+ 'src/cli/mcp/legacy-tool-service.ts',
332
+ /\bcreateWorkContract\s*\(/,
333
+ 'keep the legacy MCP surface as translation over canonical Work admission authority',
334
+ );
125
335
  requireMissing('src/runtime/control-plane/daemon-entry.ts');
126
336
  requireMissing('scripts/smoke-runtime-control-plane.ts');
127
337
  requireMissing('src/cli/controller/lifecycle.ts');
128
338
  requireMissing('src/cli/commands/supervisor.ts');
339
+ requireMissing('src/runtime/control-plane/goal-loop');
340
+ requireMissing('src/cli/repositories/goal-registry.ts');
341
+ requireMissing('src/runtime/assistant');
342
+ requireMissing('src/runtime/personal-assistant');
343
+ requireMissing('src/runtime/workflow/findings');
344
+ forbid(
345
+ 'src/runtime/control-plane/global-scheduler/scheduler.ts',
346
+ /tickGoalLoopsForController|lastGoalLoopTick/,
347
+ 'Scheduler must not restore autonomous Goal Loop polling',
348
+ );
129
349
  requireMissing('src/cli/controller/restart-coordinator-entry.ts');
130
350
  requireMissing('scripts/controller-runtime.sh');
131
351
  requireMissing('scripts/activate-source-baseline.command');
@@ -145,6 +365,13 @@ requireMissing('OPTIMIZATION_REPORT.md');
145
365
  requireMissing('docs/architecture/RELIABILITY-PROGRAM.md');
146
366
  requireMissing('docs/architecture/p0-canonical-single-runtime-plan.md');
147
367
  requireMissing('docs/architecture/transactional-adoption-planner.md');
368
+ requireMissing('docs/architecture/global-hook-runtime.md');
369
+ requireMissing('docs/architecture/ios-semantic-automation-provider-v2.md');
370
+ requireMissing('docs/architecture/chatgpt-handoff-facade.md');
371
+ requireText('docs/architecture/history/global-hook-runtime.md', 'Status: **Historical Evidence — Not Runtime Authority**');
372
+ requireText('docs/architecture/history/ios-semantic-automation-provider-v2.md', 'Status: **Historical Design Evidence — Not Runtime Authority**');
373
+ requireText('docs/architecture/history/chatgpt-handoff-facade.md', 'Status: **Historical Design Rationale — Not Runtime Authority**');
374
+ requireText('docs/architecture/history/README.md', 'Status: **Historical Evidence — Not Runtime Authority**');
148
375
  requireMissing('docs/operations/20260802-requirement-portfolio-migration.md');
149
376
  requireMissing('docs/runbooks/RELIABILITY-SESSION-PROTOCOL.md');
150
377
  requireMissing('docs/architecture/decisions/20260718-mcp-session-lifecycle-and-ingress-isolation.md');
@@ -156,6 +383,7 @@ requireMissing('bin/repo-harness-hook.mjs');
156
383
  requireMissing('bin/repo-harness-runtime.mjs');
157
384
  requireMissing('src/runtime/control-plane/daemon-client.ts');
158
385
  requireMissing('src/runtime/control-plane/daemon-ownership.ts');
386
+ requireMissing('src/runtime/workflow/portfolio');
159
387
  for (const path of sourceFiles('src')) {
160
388
  const source = text(path);
161
389
  for (const retiredAuthority of [
@@ -209,24 +437,16 @@ for (const projectionPath of [
209
437
  }
210
438
  requireText('src/runtime/projections/invalidation.ts', 'runtimeInstanceId?: string');
211
439
  requireText('src/runtime/projections/materialized-view.ts', 'currentOwner.runtimeInstanceId !== owner.runtimeInstanceId');
212
- requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'getRuntimeWriteClaim()?.runtimeInstanceId');
440
+ requireText('src/runtime/control-plane/global-scheduler/projection-refresh.ts', 'getRuntimeWriteClaim()?.runtimeInstanceId');
213
441
  forbid(
214
442
  'src/runtime/execution/jobs/receipt-store.ts',
215
443
  /ownerEpoch|releaseFencingToken/,
216
444
  'persist only non-secret Canonical Runtime/release identity in OperationReceipt ownership evidence',
217
445
  );
218
446
 
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
- );
447
+ requireText('docs/architecture/CURRENT.md', 'Canonical Runtime is activated as one immutable whole release');
448
+ requireText('docs/architecture/CURRENT.md', 'Runtime availability/recovery keeps Forge itself healthy');
449
+ requireText('docs/architecture/CURRENT.md', 'Historical Issue/Task/Local Job and compatibility projections must not become second mutable authorities.');
230
450
  requireText('src/runtime/root/runtime.ts', 'export class CanonicalForgeRuntime');
231
451
  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
452
  requireText('src/runtime/root/runtime.ts', "startInProcessScheduler");
@@ -346,7 +566,14 @@ requireText('src/runtime/gateway/mcp/execution-tools.ts', 'isDurableWorkOperatio
346
566
  requireText('src/runtime/gateway/mcp/execution-tools.ts', "'work_execute'");
347
567
  requireText('src/runtime/gateway/mcp/execution-tools.ts', "'work_validate'");
348
568
  requireText('src/runtime/gateway/mcp/execution-tools.ts', "'work_finalize'");
349
- requireText('src/runtime/execution/workers/executor.ts', 'callExecutionTool(runtimeContext');
569
+ requireText('src/runtime/execution/workers/executor.ts', 'executeWork(runtimeContext');
570
+ requireText('src/runtime/execution/workers/executor.ts', 'validateWork(runtimeContext');
571
+ requireText('src/runtime/execution/workers/executor.ts', 'finalizeWork(runtimeContext');
572
+ forbid(
573
+ 'src/runtime/execution/workers/executor.ts',
574
+ /gateway\/mcp\/execution-tools|callExecutionTool\s*\(/,
575
+ 'Execution Worker must invoke control-plane Work application services directly, never MCP transport',
576
+ );
350
577
  requireText('src/runtime/execution/workers/executor.ts', '__from_durable_worker');
351
578
  requireText('src/runtime/gateway/mcp/runtime-tools.ts', 'managedProcessOperationDigest');
352
579
  forbid(
@@ -354,21 +581,11 @@ forbid(
354
581
  /\bcreateExecutionJob\b/,
355
582
  'Runtime MCP tools must not retain dormant ExecutionJob creation paths',
356
583
  );
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
584
  forbid(
363
585
  'src/runtime/execution/jobs/legacy-adapter.ts',
364
586
  /\bcreateExecutionJob\b|\bdispatchLegacyLocalJob\b/,
365
587
  'Legacy Local Bridge compatibility must be read-only and must not dispatch new ExecutionJobs',
366
588
  );
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
589
  forbid(
373
590
  'src/cli/local-bridge/server.ts',
374
591
  /\bsubmitLocalBridgeJob\b|\bdispatchLocalBridgeJob\b|\basyncExecute\b/,
@@ -425,16 +642,6 @@ forbid(
425
642
  /\bretryAgentJob\b/,
426
643
  'Legacy MCP must not call Agent Run retry',
427
644
  );
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
645
  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
646
  requireMatch(
440
647
  'src/runtime/gateway/mcp/router.ts',
@@ -446,12 +653,6 @@ requireText('src/runtime/gateway/mcp/runtime-tools.ts', "case 'local_bridge_stat
446
653
  requireText('src/runtime/gateway/mcp/runtime-tools.ts', 'readAgentExecutableReadinessSnapshot');
447
654
  requireText('src/runtime/gateway/mcp/runtime-tools.ts', 'connectorExposedTools');
448
655
  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
656
  forbid('src/runtime/gateway/mcp/runtime-tools.ts', /inspectAgentExecutableReadiness|resolveAgentExecutable|writeAgentExecutableReadinessSnapshot/, 'Gateway readiness must only read the Daemon-produced Agent executable snapshot');
456
657
  forbidBetween(
457
658
  'src/runtime/gateway/mcp/runtime-tools.ts',
@@ -491,15 +692,50 @@ requireText('src/runtime/execution/jobs/receipt-store.ts', "state: 'started' | '
491
692
  requireText('src/runtime/execution/thin-harness/execution-router.ts', "mode: 'fast'");
492
693
  requireText('src/runtime/execution/thin-harness/execution-router.ts', 'routeExecution');
493
694
  requireText('src/runtime/execution/thin-harness/types.ts', 'FastExecutionReceipt');
494
- requireText('docs/architecture/current/thin-harness-v1.md', 'Default to direct Fast Path execution');
695
+ requireText('docs/architecture/CURRENT.md', '### Ephemeral Direct — default');
495
696
  requireText('src/runtime/resources/leases/types.ts', 'fencingToken: number');
496
697
  requireText('src/runtime/resources/leases/store.ts', 'assertFencingToken');
497
698
  requireText('src/runtime/resources/leases/store.ts', 'expectedLeaseMap');
498
699
  requireText('src/runtime/resources/claims/conflicts.ts', "'repo-content:*'");
499
700
  requireText('src/runtime/control-plane/repo-actor/actor.ts', 'repo-actor-mailbox');
500
701
  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');
702
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'createSchedulerDispatchCapacity');
703
+ requireText('src/runtime/control-plane/global-scheduler/dispatch-capacity.ts', 'maxHeavyChecks');
704
+ requireText('src/runtime/control-plane/global-scheduler/dispatch-capacity.ts', 'maxAgentProcesses');
705
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'normalizeSchedulerConfig');
706
+ requireText('src/runtime/control-plane/global-scheduler/config.ts', 'normalizeSchedulerConfig');
707
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'writeSchedulerHealthSnapshot');
708
+ requireText('src/runtime/control-plane/global-scheduler/state.ts', 'writeSchedulerHealthSnapshot');
709
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'buildSchedulerWorkerLaunchDescriptor');
710
+ requireText('src/runtime/control-plane/global-scheduler/worker-launch.ts', 'buildSchedulerWorkerLaunchDescriptor');
711
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'refreshSchedulerRepositoryProjections');
712
+ requireText('src/runtime/control-plane/global-scheduler/projection-refresh.ts', 'refreshRepositoryProjectionForRepository');
713
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'buildSchedulerWorkerSpawnedLifecycle');
714
+ requireText('src/runtime/control-plane/global-scheduler/worker-lifecycle.ts', 'buildSchedulerWorkerExitFailure');
715
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'createSchedulerWorkerStderrCapture');
716
+ requireText('src/runtime/control-plane/global-scheduler/worker-stderr.ts', 'MAX_SCHEDULER_WORKER_STDERR_BYTES');
717
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'persistSchedulerWorkerAttachment');
718
+ requireText('src/runtime/control-plane/global-scheduler/worker-attachment.ts', 'attachExecutionWorker');
719
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'runSchedulerPeriodicCleanup');
720
+ requireText('src/runtime/control-plane/global-scheduler/maintenance.ts', 'runSchedulerValidationReconciliation');
721
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'planSchedulerSourceSampling');
722
+ requireText('src/runtime/control-plane/global-scheduler/source-scan.ts', 'selectSchedulerSourceScanRepositories');
723
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'runSchedulerDurableAdmission');
724
+ requireText('src/runtime/control-plane/global-scheduler/durable-admission.ts', 'markExecutionJobSchedulerObserved');
725
+ requireText('src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts', 'persistSchedulerTerminalWorkerLifecycle');
726
+ requireText('src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts', 'TERMINAL_JOB_STATUSES');
727
+ requireText('src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts', 'evaluateSchedulerWorkerExitCandidate');
728
+ requireText('src/runtime/control-plane/global-scheduler/worker-exit-decision.ts', 'TERMINAL_JOB_STATUSES');
729
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'reconcileSchedulerWorkerExit');
730
+ requireText('src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts', 'releaseExecutionLeases');
731
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'cleanupSchedulerWorkerProcesses');
732
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'registerSchedulerWorkerProcess');
733
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'spawnSchedulerWorkerProcess');
734
+ requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'wireSchedulerWorkerProcess');
735
+ requireText('src/runtime/control-plane/global-scheduler/worker-process.ts', 'cleanupSchedulerWorkerProcesses');
736
+ requireText('src/runtime/control-plane/global-scheduler/worker-process.ts', 'dependencies.spawnProcess');
737
+ requireText('src/runtime/control-plane/global-scheduler/worker-process.ts', 'terminateProcessTree');
738
+ requireText('src/runtime/control-plane/global-scheduler/worker-process.ts', "child.once('close'");
503
739
  requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'writeAgentExecutableReadinessSnapshot');
504
740
  requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'sampleRepositoryGitStatusForRepositories');
505
741
  requireText('src/cli/agent-jobs/executable-resolver.ts', 'revalidateAgentExecutable');
@@ -533,22 +769,55 @@ forbidBetween(
533
769
  requireText('src/runtime/control-plane/execution/session-store.ts', 'lastValidatedAt: now');
534
770
  requireText('src/runtime/control-plane/execution/validation.ts', 'warnings.push');
535
771
  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');
537
- requireText('src/runtime/gateway/mcp/execution-tools.ts', 'finalizationComplete');
538
- forbidBetween(
772
+ requireText('src/runtime/gateway/mcp/execution-tools.ts', "from '../../control-plane/execution/work-finalization-service'");
773
+ requireText('src/runtime/gateway/mcp/execution-tools.ts', "from '../../control-plane/execution/work-preparation-service'");
774
+ requireText('src/runtime/gateway/mcp/execution-tools.ts', "from '../../control-plane/execution/work-operation-service'");
775
+ requireText('src/runtime/gateway/mcp/execution-tools.ts', 'Compatibility exports: implementation authority lives in control-plane execution.');
776
+ requireText('src/runtime/gateway/mcp/execution-tools.ts', 'resetFinalizationStagesForRequest,');
777
+ requireText('src/runtime/gateway/mcp/execution-tools.ts', 'selectDefaultWorkValidationChecks');
778
+ requireText('src/runtime/gateway/mcp/runtime-tools.ts', "callExecutionTool(ctx, 'work_finalize'");
779
+ forbid(
780
+ 'src/runtime/gateway/mcp/runtime-tools.ts',
781
+ /repositoryGit(?:Commit|FinishWorkflow|MergeBranch|DeleteBranch|RebaseOnto)\s*\(/,
782
+ 'rh_work facade finalization must delegate to the canonical Work finalization application service instead of performing Git delivery itself',
783
+ );
784
+ forbid(
785
+ 'src/runtime/gateway/mcp/execution-tools.ts',
786
+ /function\s+finalizeWork\s*\(/,
787
+ 'MCP execution transport must delegate Work finalization to the control-plane application service',
788
+ );
789
+ forbid(
539
790
  'src/runtime/gateway/mcp/execution-tools.ts',
540
- 'function finalizeWork(',
541
- 'export async function callExecutionTool',
791
+ /function\s+(?:prepareWork|adoptExistingWorkHead)\s*\(/,
792
+ 'MCP execution transport must delegate Work preparation/adoption to the control-plane application service',
793
+ );
794
+ forbid(
795
+ 'src/runtime/gateway/mcp/execution-tools.ts',
796
+ /function\s+(?:executeWork|validateWork)\s*\(/,
797
+ 'MCP execution transport must delegate Work execute/validate operations to the control-plane application service',
798
+ );
799
+ forbid(
800
+ 'src/runtime/gateway/mcp/execution-tools.ts',
801
+ /(?:ensureManagedWorkspace|admitPreparedRepositoryWorkContract)\s*\(/,
802
+ 'MCP execution transport must not own managed-workspace or WorkContract preparation admission',
803
+ );
804
+ requireText('src/runtime/control-plane/execution/work-preparation-service.ts', 'export function prepareWork(');
805
+ requireText('src/runtime/control-plane/execution/work-preparation-service.ts', 'function adoptExistingWorkHead(');
806
+ requireText('src/runtime/control-plane/execution/work-operation-service.ts', 'export async function executeWork(');
807
+ requireText('src/runtime/control-plane/execution/work-operation-service.ts', 'export async function validateWork(');
808
+ requireText('src/runtime/control-plane/execution/work-finalization-service.ts', 'resetFinalizationStagesForRequest');
809
+ requireText('src/runtime/control-plane/execution/work-finalization-service.ts', 'finalizationComplete');
810
+ forbidBetween(
811
+ 'src/runtime/control-plane/execution/work-finalization-service.ts',
812
+ 'export async function finalizeWork(',
813
+ '// WORK_FINALIZATION_SERVICE_END',
542
814
  /withControllerLock\([\s\S]{0,900}?(?:repositoryGitCommit|repositoryGitFinishWorkflow|runCleanup|repositoryGitDeleteBranch)/,
543
- 'work_finalize must not hold the controller lock while committing, merging, deleting branches, or removing worktrees',
815
+ 'Work finalization must not hold the controller lock while committing, merging, deleting branches, or removing worktrees',
544
816
  );
545
817
  requireText('src/runtime/workflow/schedules/types.ts', "'repository-event'");
546
818
  requireText('src/runtime/workflow/schedules/types.ts', "'dependency-checkpoint'");
547
819
  requireText('src/runtime/workflow/schedules/store.ts', 'saveScheduleDecision');
548
820
  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
821
  requireText('src/runtime/release/release-gate.ts', 'releaseReady');
553
822
  requireText('src/cli/mcp/transports/http.ts', "'/ready'");
554
823
  requireText('src/cli/mcp/transports/http.ts', "'/repos/:repoId/health'");
@@ -568,12 +837,13 @@ for (const path of [
568
837
  forbid(path, /\b(?:spawnSync|execSync|execFileSync)\s*\(/, 'the non-blocking Gateway/Controller hot-path rule');
569
838
  }
570
839
 
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');
840
+ requireText('scripts/run-governed-gate.ts', "label: 'source duplication'");
841
+ requireText('scripts/run-governed-gate.ts', "args: ['scripts/check-source-duplication.mjs']");
842
+ requireText('scripts/run-governed-gate.ts', "label: 'controller UI bundle'");
843
+ requireText('scripts/run-governed-gate.ts', "args: ['run', 'check:controller-ui']");
844
+ requireText('docs/architecture/CURRENT.md', '## State ownership');
845
+ requireText('docs/architecture/CURRENT.md', '## Runtime and MCP boundary');
846
+ requireText('docs/architecture/CURRENT.md', '## Testing and verification');
577
847
  requireText('plans/README.md', 'not the runtime execution queue');
578
848
  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
849