@moretea-labs/forge 1.7.1 → 1.8.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 (685) hide show
  1. package/AGENTS.md +58 -62
  2. package/CHANGELOG.md +39 -0
  3. package/CLAUDE.md +42 -62
  4. package/README.md +2 -2
  5. package/SKILL.md +0 -1
  6. package/THIRD_PARTY_NOTICES.md +5 -2
  7. package/adapters/browser/index.ts +2 -0
  8. package/adapters/chatgpt/browser-delivery-host.ts +71 -0
  9. package/adapters/chatgpt/browser-delivery-runtime.ts +783 -0
  10. package/adapters/chatgpt/controller-binding-store.ts +55 -0
  11. package/adapters/chatgpt/controller-host.ts +119 -0
  12. package/adapters/chatgpt/controller-round-host.ts +78 -0
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +45 -0
  14. package/adapters/chatgpt/provider-delivery.ts +113 -0
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +192 -0
  16. package/adapters/chatgpt/wsl-bridge-delivery-host.ts +63 -0
  17. package/adapters/computer/desktop-operator-contract.ts +7 -0
  18. package/adapters/computer/desktop-operator-discovery.ts +201 -0
  19. package/adapters/computer/desktop-operator-negotiation.ts +174 -0
  20. package/adapters/computer/desktop-operator-provider.ts +312 -0
  21. package/adapters/computer/index.ts +1 -0
  22. package/adapters/computer/interaction-target-authority.ts +944 -0
  23. package/adapters/controller-process/binding-store.ts +34 -0
  24. package/adapters/controller-process/controller-host.ts +26 -0
  25. package/adapters/mcp/access-mode.ts +132 -0
  26. package/adapters/mcp/audit.ts +32 -0
  27. package/adapters/mcp/auth.ts +407 -0
  28. package/adapters/mcp/controller-round-compatibility.ts +184 -0
  29. package/adapters/mcp/frozen-client-semantic-compatibility.ts +292 -0
  30. package/adapters/mcp/instructions.ts +36 -0
  31. package/adapters/mcp/legacy-context.ts +18 -0
  32. package/adapters/mcp/multi-repository.ts +437 -0
  33. package/adapters/mcp/oauth.ts +391 -0
  34. package/adapters/mcp/paths.ts +140 -0
  35. package/adapters/mcp/policy.ts +232 -0
  36. package/adapters/mcp/proxy-env.ts +62 -0
  37. package/adapters/mcp/readiness-projection.ts +24 -0
  38. package/adapters/mcp/redaction.ts +21 -0
  39. package/adapters/mcp/repo.ts +24 -0
  40. package/adapters/mcp/runtime-gateway/artifact-adapter.ts +52 -0
  41. package/adapters/mcp/runtime-gateway/context-adapter.ts +829 -0
  42. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +191 -0
  43. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +147 -0
  44. package/adapters/mcp/runtime-gateway/execution-control-adapter.ts +28 -0
  45. package/adapters/mcp/runtime-gateway/execution-tools.ts +207 -0
  46. package/adapters/mcp/runtime-gateway/filesystem-adapter.ts +38 -0
  47. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +411 -0
  48. package/adapters/mcp/runtime-gateway/legacy-ios-tool-adapter.ts +105 -0
  49. package/adapters/mcp/runtime-gateway/maintenance-adapter.ts +44 -0
  50. package/adapters/mcp/runtime-gateway/model-adapter.ts +63 -0
  51. package/adapters/mcp/runtime-gateway/persisted-check-process.ts +3 -0
  52. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +308 -0
  53. package/adapters/mcp/runtime-gateway/process-tools.ts +289 -0
  54. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +76 -0
  55. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +268 -0
  56. package/adapters/mcp/runtime-gateway/recovery-client-adapter.ts +70 -0
  57. package/adapters/mcp/runtime-gateway/recovery-tool-contract.ts +99 -0
  58. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +110 -0
  59. package/adapters/mcp/runtime-gateway/result-adapter.ts +108 -0
  60. package/adapters/mcp/runtime-gateway/router.ts +728 -0
  61. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1251 -0
  62. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +634 -0
  63. package/adapters/mcp/runtime-gateway/runtime-tool-shared.ts +27 -0
  64. package/adapters/mcp/runtime-gateway/runtime-tools.ts +68 -0
  65. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +186 -0
  66. package/adapters/mcp/runtime-gateway/shared-adapter.ts +25 -0
  67. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +870 -0
  68. package/adapters/mcp/runtime-gateway/work-adapter.ts +3186 -0
  69. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +502 -0
  70. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +1 -0
  71. package/adapters/mcp/server.ts +1048 -0
  72. package/adapters/mcp/setup.ts +791 -0
  73. package/adapters/mcp/tool-capability-cache.ts +87 -0
  74. package/adapters/mcp/tool-mapping/access-tools.ts +387 -0
  75. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +5265 -0
  76. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +150 -0
  77. package/adapters/mcp/tool-mapping/repository-tools.ts +1691 -0
  78. package/adapters/mcp/tool-mapping/tools.ts +9 -0
  79. package/adapters/mcp/tool-mapping/umbrella-tools.ts +117 -0
  80. package/adapters/mcp/toolset-names.ts +74 -0
  81. package/adapters/mcp/toolset-selection.ts +41 -0
  82. package/adapters/mcp/toolset.ts +336 -0
  83. package/adapters/mcp/transports/http.ts +1456 -0
  84. package/adapters/mcp/transports/session-registry.ts +513 -0
  85. package/adapters/mcp/transports/stdio.ts +8 -0
  86. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +139 -0
  87. package/adapters/mcp/types.ts +41 -0
  88. package/assets/AGENTS.md +2 -16
  89. package/assets/CLAUDE.md +2 -16
  90. package/assets/hooks/AGENTS.md +3 -14
  91. package/assets/hooks/CLAUDE.md +3 -14
  92. package/assets/hooks/hook-input.sh +9 -2
  93. package/assets/hooks/lib/workflow-state.sh +28 -10
  94. package/assets/hooks/prompt-guard.sh +63 -37
  95. package/assets/hooks/security-sentinel.sh +2 -1
  96. package/assets/hooks/session-start-context.sh +7 -5
  97. package/assets/hooks/stop-orchestrator.sh +13 -3
  98. package/assets/initializer-question-pack.v4.json +11 -7
  99. package/assets/partials/05-workflow.partial.md +18 -73
  100. package/assets/partials/07-footer.partial.md +1 -1
  101. package/assets/partials-agents/02-operating-mode.partial.md +1 -2
  102. package/assets/partials-agents/04-task-protocol.partial.md +14 -59
  103. package/assets/partials-agents/06-quality-safety.partial.md +11 -16
  104. package/assets/partials-agents/08-deep-docs.partial.md +1 -2
  105. package/assets/plan-map.json +11 -11
  106. package/assets/plugin-registry.v1.json +9 -3
  107. package/assets/plugin-trust-policy.v1.json +6 -0
  108. package/assets/recovery/ForgeRecovery.ps1 +100 -0
  109. package/assets/recovery/forge-wsl-rescue +271 -0
  110. package/assets/reference-configs/development-protocol.md +11 -15
  111. package/assets/reference-configs/document-generation.md +1 -1
  112. package/assets/reference-configs/global-working-rules.md +9 -1
  113. package/assets/reference-configs/harness-overview.md +22 -112
  114. package/assets/reference-configs/hook-operations.md +1 -1
  115. package/assets/reference-configs/sprint-contracts.md +2 -2
  116. package/assets/skill-version.json +2 -2
  117. package/assets/templates/helpers/architecture-event.ts +3 -34
  118. package/assets/templates/helpers/architecture-queue.sh +61 -10
  119. package/assets/templates/helpers/archive-workflow.sh +90 -180
  120. package/assets/templates/helpers/capability-config.ts +8 -11
  121. package/assets/templates/helpers/capability-resolver.ts +37 -19
  122. package/assets/templates/helpers/capture-plan.sh +2 -2
  123. package/assets/templates/helpers/check-architecture-sync.sh +1 -9
  124. package/assets/templates/helpers/check-task-sync.sh +82 -11
  125. package/assets/templates/helpers/check-task-workflow.sh +1 -3
  126. package/assets/templates/helpers/context-contract-sync.sh +1 -12
  127. package/assets/templates/helpers/contract-worktree.sh +26 -24
  128. package/assets/templates/helpers/ensure-task-workflow.sh +6 -8
  129. package/assets/templates/helpers/inspect-project-state.ts +1 -1
  130. package/assets/templates/helpers/migrate-project-template.sh +1 -1
  131. package/assets/templates/helpers/migrate-workflow-docs.ts +53 -239
  132. package/assets/templates/helpers/new-plan.sh +2 -2
  133. package/assets/templates/helpers/plan-to-todo.sh +3 -31
  134. package/assets/templates/helpers/sprint-backlog.sh +1 -1
  135. package/assets/templates/helpers/switch-plan.sh +1 -1
  136. package/assets/templates/helpers/workflow-contract.ts +1 -0
  137. package/assets/workflow-contract.v1.json +63 -171
  138. package/assets/workflows/xiaohongshu/xiaohongshu.collect-metrics.v1.draft.json +118 -0
  139. package/assets/workflows/xiaohongshu/xiaohongshu.publish-image-note.v1.draft.json +316 -0
  140. package/assets/workflows/xiaohongshu/xiaohongshu.publish-long-text.v1.draft.json +324 -0
  141. package/docs/architecture/CURRENT.md +148 -13
  142. package/docs/architecture/EVOLUTION.md +13 -0
  143. package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +2 -1
  144. package/docs/architecture/decisions/20260831-independent-windows-wsl-host-rescue.md +59 -0
  145. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +120 -0
  146. package/docs/architecture/decisions/20260904-repository-runtime-data-boundary.md +42 -0
  147. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +35 -0
  148. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +296 -0
  149. package/docs/architecture/decisions/20260907-maintenance-diagnosis-bounded-read.md +39 -0
  150. package/docs/architecture/domains/verification.md +7 -0
  151. package/docs/architecture/domains/workflow-engine.md +1 -1
  152. package/docs/architecture/index.md +3 -3
  153. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +19 -8
  154. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +124 -0
  155. package/docs/forge-chatgpt-mcp-setup.md +5 -3
  156. package/docs/forge-plugin-management.md +20 -4
  157. package/docs/forge-runtime-self-healing-loop.md +2 -0
  158. package/docs/operations/benchmark-cross-version-freeze.md +38 -0
  159. package/docs/operations/controller-browser-plugin.md +3 -1
  160. package/docs/operations/homebrew.md +2 -2
  161. package/docs/operations/platform-support.md +16 -8
  162. package/docs/operations/platform-support.zh-CN.md +2 -2
  163. package/docs/operations/standalone-disaster-recovery.md +26 -1
  164. package/docs/operations/uu-remote-rescue.md +41 -0
  165. package/docs/operations/windows-wsl-host-rescue.md +133 -0
  166. package/docs/public-usage-guide.md +1 -1
  167. package/docs/public-usage-guide.zh-CN.md +1 -1
  168. package/docs/tutorials/01-install-and-start.md +1 -1
  169. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  170. package/docs/tutorials/02-connect-chatgpt.md +4 -4
  171. package/docs/tutorials/02-connect-chatgpt.zh-CN.md +4 -4
  172. package/docs/wiki/Implementation.md +1 -1
  173. package/package.json +23 -14
  174. package/packages/kernel/controller/api/index.ts +2 -0
  175. package/packages/kernel/controller/application/controller-round-service.ts +29 -0
  176. package/packages/kernel/controller/application/controller-service.ts +30 -0
  177. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +308 -0
  178. package/packages/kernel/controller/domain/controller-round.ts +107 -0
  179. package/packages/kernel/controller/domain/execution-quality.ts +133 -0
  180. package/packages/kernel/controller/domain/types.ts +56 -0
  181. package/packages/kernel/controller/index.ts +1 -0
  182. package/packages/kernel/controller/infrastructure/controller-binding-store.ts +84 -0
  183. package/packages/kernel/controller/infrastructure/controller-round-store.ts +1384 -0
  184. package/packages/kernel/controller/infrastructure/controller-session-store.ts +578 -0
  185. package/packages/kernel/controller/ports/controller-host.ts +16 -0
  186. package/packages/kernel/goal/api/index.ts +1 -0
  187. package/packages/kernel/goal/domain/types.ts +40 -0
  188. package/packages/kernel/goal/index.ts +1 -0
  189. package/packages/kernel/identity/api/index.ts +5 -0
  190. package/packages/kernel/identity/application/identity-service.ts +67 -0
  191. package/packages/kernel/identity/domain/scope.ts +63 -0
  192. package/packages/kernel/identity/domain/semantic-sync.ts +81 -0
  193. package/packages/kernel/identity/domain/types.ts +44 -0
  194. package/packages/kernel/identity/domain/workspace.ts +56 -0
  195. package/packages/kernel/identity/index.ts +1 -0
  196. package/packages/kernel/identity/infrastructure/identity-store.ts +75 -0
  197. package/packages/kernel/memory/api/index.ts +5 -0
  198. package/packages/kernel/memory/application/experience-service.ts +118 -0
  199. package/packages/kernel/memory/application/outcome-service.ts +77 -0
  200. package/packages/kernel/memory/domain/experience.ts +103 -0
  201. package/packages/kernel/memory/domain/operational-prior.ts +92 -0
  202. package/packages/kernel/memory/index.ts +1 -0
  203. package/packages/kernel/progression/api/index.ts +2 -0
  204. package/packages/kernel/progression/application/projector.ts +211 -0
  205. package/packages/kernel/progression/domain/types.ts +116 -0
  206. package/packages/kernel/progression/index.ts +1 -0
  207. package/packages/kernel/scheduler/api/index.ts +6 -0
  208. package/packages/kernel/scheduler/application/continuation-service.ts +212 -0
  209. package/packages/kernel/scheduler/application/eligibility.ts +252 -0
  210. package/packages/kernel/scheduler/application/schedule-service.ts +24 -0
  211. package/packages/kernel/scheduler/application/settlement.ts +197 -0
  212. package/packages/kernel/scheduler/domain/continuation.ts +38 -0
  213. package/packages/kernel/scheduler/domain/schedule.ts +149 -0
  214. package/packages/kernel/scheduler/index.ts +1 -0
  215. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +38 -0
  216. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +785 -0
  217. package/packages/kernel/work/api/index.ts +15 -0
  218. package/packages/kernel/work/application/work-service.ts +148 -0
  219. package/packages/kernel/work/domain/admission-policy.ts +34 -0
  220. package/packages/kernel/work/domain/check-receipt.ts +43 -0
  221. package/packages/kernel/work/domain/context-closure-receipt.ts +32 -0
  222. package/packages/kernel/work/domain/engineering-contracts.ts +157 -0
  223. package/packages/kernel/work/domain/engineering-design.ts +281 -0
  224. package/packages/kernel/work/domain/engineering-profile.ts +242 -0
  225. package/packages/kernel/work/domain/execution-concurrency.ts +254 -0
  226. package/packages/kernel/work/domain/execution-snapshot.ts +33 -0
  227. package/packages/kernel/work/domain/implementation-review.ts +510 -0
  228. package/packages/kernel/work/domain/project-engineering-contract.ts +202 -0
  229. package/packages/kernel/work/domain/repository-completion-receipt.ts +73 -0
  230. package/packages/kernel/work/domain/state-machine.ts +259 -0
  231. package/packages/kernel/work/domain/types.ts +528 -0
  232. package/packages/kernel/work/index.ts +1 -0
  233. package/packages/kernel/work/infrastructure/work-contract-store.ts +1876 -0
  234. package/packages/kernel/work/ports/work-contract-store.ts +18 -0
  235. package/packages/plugin-runtime/browser/index.ts +3 -0
  236. package/packages/plugin-runtime/browser/provider-registry.ts +110 -0
  237. package/packages/plugin-runtime/browser/runtime-contract.ts +150 -0
  238. package/packages/plugin-runtime/browser/session-authority.ts +61 -0
  239. package/packages/plugin-runtime/computer/index.ts +6 -0
  240. package/packages/plugin-runtime/computer/provider-error.ts +26 -0
  241. package/packages/plugin-runtime/computer/provider-registration.ts +52 -0
  242. package/packages/plugin-runtime/computer/provider-registry.ts +63 -0
  243. package/packages/plugin-runtime/computer/provider.ts +19 -0
  244. package/packages/plugin-runtime/computer/target-authority.ts +190 -0
  245. package/packages/plugin-runtime/computer/target-persistence.ts +54 -0
  246. package/packages/plugin-runtime/external/index.ts +1 -0
  247. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +457 -0
  248. package/packages/plugin-runtime/index.ts +3 -0
  249. package/packages/protocols/browser/index.ts +1 -0
  250. package/packages/protocols/browser/session.ts +98 -0
  251. package/packages/protocols/computer/contract.ts +199 -0
  252. package/packages/protocols/computer/index.ts +1 -0
  253. package/packages/protocols/failure/contract.ts +158 -0
  254. package/packages/protocols/failure/index.ts +1 -0
  255. package/packages/protocols/handoff/index.ts +1 -0
  256. package/packages/protocols/handoff/status.ts +22 -0
  257. package/packages/protocols/mcp/execution-context.ts +11 -0
  258. package/packages/protocols/mcp/index.ts +2 -0
  259. package/packages/protocols/mcp/tool-contract.ts +42 -0
  260. package/packages/workflow-runtime/api/index.ts +2 -0
  261. package/packages/workflow-runtime/application/interpreter.ts +342 -0
  262. package/packages/workflow-runtime/domain/workflow-asset.ts +223 -0
  263. package/packages/workflow-runtime/index.ts +1 -0
  264. package/scripts/assemble-template.ts +1 -1
  265. package/scripts/benchmark-computer-hotpath.ts +255 -0
  266. package/scripts/benchmark-controller-round2.ts +54 -2
  267. package/scripts/benchmark-ios-agent-device.ts +3 -6
  268. package/scripts/benchmark-mcp-transport.ts +3 -4
  269. package/scripts/benchmark-operational-memory-activation.ts +235 -0
  270. package/scripts/benchmark-operational-shadow.ts +28 -0
  271. package/scripts/bootstrap-runtime-maintenance-recovery.sh +4 -1
  272. package/scripts/canary-chatgpt-provider-delivery.ts +97 -0
  273. package/scripts/canary-controller-semantic-wait.ts +195 -0
  274. package/scripts/canary-global-hook.sh +2 -2
  275. package/scripts/check-mcp-compatibility.ts +173 -7
  276. package/scripts/check-platform-support.mjs +28 -2
  277. package/scripts/check-public-docs.sh +1 -1
  278. package/scripts/check-release-readiness.sh +1 -1
  279. package/scripts/check-repository-hygiene.mjs +92 -0
  280. package/scripts/check-runtime-architecture.mjs +1206 -95
  281. package/scripts/check-source-duplication.mjs +9 -1
  282. package/scripts/check-tarball-install-smoke.sh +98 -15
  283. package/scripts/controller-ngrok-rotation.sh +5 -4
  284. package/scripts/create-project-dirs.sh +10 -74
  285. package/scripts/forge-local-recovery-helper.mjs +204 -0
  286. package/scripts/forge-uu-remote-rescue-helper.d.mts +31 -0
  287. package/scripts/forge-uu-remote-rescue-helper.mjs +409 -0
  288. package/scripts/forge-windows-host-recovery-helper.mjs +136 -0
  289. package/scripts/hook-shim.sh +2 -2
  290. package/scripts/init-project.sh +12 -70
  291. package/scripts/install-desktop-operator-registration.ts +4 -2
  292. package/scripts/install-independent-windows-wsl-recovery.ts +125 -0
  293. package/scripts/install-standalone-recovery.ts +122 -10
  294. package/scripts/install-uu-remote-rescue-registration.ts +74 -0
  295. package/scripts/install-windows-host-recovery-registration.ts +22 -0
  296. package/scripts/lib/controller-home-env.sh +6 -3
  297. package/scripts/lib/project-init-lib.sh +39 -582
  298. package/scripts/migrate-chatgpt-automation-schedules.ts +2 -2
  299. package/scripts/migrate-windows-wsl-controller-home.ts +306 -0
  300. package/scripts/open-source-audit-allowlist.txt +12 -1
  301. package/scripts/portability-bindings.mjs +70 -0
  302. package/scripts/run-bounded-command.mjs +55 -0
  303. package/scripts/run-bun-test-file.ts +22 -6
  304. package/scripts/run-governed-gate.ts +4 -1
  305. package/scripts/smoke-mcp-http-runtime.ts +1 -1
  306. package/scripts/smoke-runtime-recovery.ts +34 -1
  307. package/scripts/smoke-schedule-engine.ts +1 -1
  308. package/scripts/stage-runtime-release.ts +6 -1
  309. package/scripts/test-governance.ts +51 -2
  310. package/src/cli/agent-jobs/job-manager.ts +10 -1
  311. package/src/cli/chatgpt-browser/bind-server.ts +2 -1
  312. package/src/cli/chatgpt-browser/binding.ts +20 -10
  313. package/src/cli/chatgpt-browser/bridge-extension.ts +75 -0
  314. package/src/cli/chatgpt-browser/bridge-provider.ts +376 -11
  315. package/src/cli/chatgpt-browser/engine.ts +10 -11
  316. package/src/cli/chatgpt-browser/native-provider.ts +24 -83
  317. package/src/cli/chatgpt-browser/oracle-provider.ts +5 -3
  318. package/src/cli/chatgpt-browser/types.ts +1 -0
  319. package/src/cli/commands/bootstrap-control.ts +334 -0
  320. package/src/cli/commands/brain-assistant.ts +38 -0
  321. package/src/cli/commands/brain.ts +193 -40
  322. package/src/cli/commands/chatgpt.ts +127 -0
  323. package/src/cli/commands/computer.ts +437 -0
  324. package/src/cli/commands/doctor.ts +18 -1
  325. package/src/cli/commands/init-hook.ts +71 -61
  326. package/src/cli/commands/init.ts +3 -1
  327. package/src/cli/commands/mcp.ts +16 -10
  328. package/src/cli/commands/plugin.ts +38 -12
  329. package/src/cli/commands/recovery.ts +493 -80
  330. package/src/cli/commands/runtime.ts +9 -4
  331. package/src/cli/commands/setup-profile.ts +89 -39
  332. package/src/cli/commands/status.ts +2 -1
  333. package/src/cli/controller/check-runner.ts +487 -98
  334. package/src/cli/controller/context/types.ts +7 -1
  335. package/src/cli/controller/context-pack.ts +23 -3
  336. package/src/cli/controller/issue-store.ts +1 -1
  337. package/src/cli/controller/systemd-user.ts +110 -0
  338. package/src/cli/controller/types.ts +10 -70
  339. package/src/cli/controller/worklog.ts +67 -13
  340. package/src/cli/editing/edit-operation-contract.ts +92 -0
  341. package/src/cli/editing/edit-session.ts +289 -13
  342. package/src/cli/github/plugin.ts +17 -12
  343. package/src/cli/hook/route-registry.ts +3 -5
  344. package/src/cli/hook/runtime.ts +49 -3
  345. package/src/cli/index.ts +3 -0
  346. package/src/cli/local-bridge/connector-freshness.ts +2 -2
  347. package/src/cli/local-bridge/console-automations.ts +2 -2
  348. package/src/cli/local-bridge/facade-api.ts +41 -14
  349. package/src/cli/local-bridge/job-store.ts +1 -1
  350. package/src/cli/local-bridge/server.ts +24 -27
  351. package/src/cli/mcp/access-mode.ts +2 -132
  352. package/src/cli/mcp/access-tools.ts +2 -387
  353. package/src/cli/mcp/audit.ts +2 -32
  354. package/src/cli/mcp/auth.ts +2 -404
  355. package/src/cli/mcp/instructions.ts +2 -34
  356. package/src/cli/mcp/legacy-context.ts +2 -16
  357. package/src/cli/mcp/legacy-tool-service.ts +2 -5308
  358. package/src/cli/mcp/multi-repository.ts +2 -436
  359. package/src/cli/mcp/oauth.ts +2 -375
  360. package/src/cli/mcp/openai-secure-tunnel.ts +2 -0
  361. package/src/cli/mcp/paths.ts +2 -140
  362. package/src/cli/mcp/policy.ts +2 -232
  363. package/src/cli/mcp/post-finalize-work-attribution.ts +2 -150
  364. package/src/cli/mcp/proxy-env.ts +2 -62
  365. package/src/cli/mcp/readiness-projection.ts +2 -24
  366. package/src/cli/mcp/redaction.ts +2 -21
  367. package/src/cli/mcp/repo.ts +2 -24
  368. package/src/cli/mcp/repository-tools.ts +2 -1585
  369. package/src/cli/mcp/server.ts +2 -951
  370. package/src/cli/mcp/setup.ts +2 -737
  371. package/src/cli/mcp/tool-capability-cache.ts +2 -87
  372. package/src/cli/mcp/tool-contract.ts +2 -14
  373. package/src/cli/mcp/tools.ts +2 -9
  374. package/src/cli/mcp/toolset-names.ts +2 -70
  375. package/src/cli/mcp/toolset-selection.ts +2 -41
  376. package/src/cli/mcp/toolset.ts +2 -336
  377. package/src/cli/mcp/transports/AGENTS.md +1 -10
  378. package/src/cli/mcp/transports/CLAUDE.md +1 -10
  379. package/src/cli/mcp/transports/http.ts +2 -1414
  380. package/src/cli/mcp/transports/session-registry.ts +2 -490
  381. package/src/cli/mcp/transports/stdio.ts +2 -8
  382. package/src/cli/mcp/types.ts +2 -41
  383. package/src/cli/mcp/umbrella-tools.ts +2 -117
  384. package/src/cli/repositories/command-executor.ts +64 -18
  385. package/src/cli/repositories/command-scope.ts +117 -1
  386. package/src/cli/repositories/controller-home.ts +119 -1
  387. package/src/cli/repositories/identity.ts +13 -0
  388. package/src/cli/repositories/registry.ts +68 -49
  389. package/src/cli/repositories/repository-snapshot.ts +53 -7
  390. package/src/cli/repositories/runtime-storage.ts +27 -2
  391. package/src/cli/repositories/safe-patch.ts +34 -38
  392. package/src/cli/repositories/selected-path-actions.ts +22 -2
  393. package/src/cli/repositories/structured-git.ts +105 -25
  394. package/src/cli/runtime/helper-runner.ts +7 -0
  395. package/src/cli/runtime-invocation.ts +8 -1
  396. package/src/cli/tools/codegraph.ts +44 -25
  397. package/src/core/adoption/manifest-templates.ts +1 -1
  398. package/src/core/adoption/plan.ts +3 -26
  399. package/src/core/adoption/workflow-contract-plan.ts +17 -9
  400. package/src/effects/process-runner.ts +8 -14
  401. package/src/runtime/context/assistant-context.ts +154 -0
  402. package/src/runtime/context/assistant-work-context.ts +147 -0
  403. package/src/runtime/context/codegraph-cache-boundary.ts +255 -0
  404. package/src/runtime/context/codegraph-read-provider.ts +55 -22
  405. package/src/runtime/context/codegraph-sidecar.cjs +8 -1
  406. package/src/runtime/context/context-closure.ts +268 -0
  407. package/src/runtime/context/context-plane.ts +211 -0
  408. package/src/runtime/context/project-engineering-contract.ts +60 -0
  409. package/src/runtime/control-plane/bootstrap/capability-provider.ts +74 -0
  410. package/src/runtime/control-plane/bootstrap/control-api.ts +57 -0
  411. package/src/runtime/control-plane/bootstrap/index.ts +5 -0
  412. package/src/runtime/control-plane/bootstrap/state-machine.ts +141 -0
  413. package/src/runtime/control-plane/bootstrap/store.ts +21 -0
  414. package/src/runtime/control-plane/bootstrap/types.ts +87 -0
  415. package/src/runtime/control-plane/cleanup-artifact-retention.ts +328 -0
  416. package/src/runtime/control-plane/codegraph-cache-retention.ts +164 -0
  417. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +320 -0
  418. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +169 -0
  419. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +350 -0
  420. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +85 -0
  421. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +417 -100
  422. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +103 -15
  423. package/src/runtime/control-plane/execution/implementation-review-content.ts +95 -0
  424. package/src/runtime/control-plane/execution/repository-work-attribution.ts +2 -2
  425. package/src/runtime/control-plane/execution/retained-work-resume.ts +336 -6
  426. package/src/runtime/control-plane/execution/validation.ts +28 -3
  427. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +116 -0
  428. package/src/runtime/control-plane/execution/work-completion-authority.ts +44 -2
  429. package/src/runtime/control-plane/execution/work-evidence-policy.ts +34 -3
  430. package/src/runtime/control-plane/execution/work-execution-support.ts +42 -22
  431. package/src/runtime/control-plane/execution/work-finalization-service.ts +1103 -166
  432. package/src/runtime/control-plane/execution/work-handle-authority.ts +267 -16
  433. package/src/runtime/control-plane/execution/work-handle-store.ts +77 -0
  434. package/src/runtime/control-plane/execution/work-head-settlement.ts +75 -0
  435. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +145 -23
  436. package/src/runtime/control-plane/execution/work-operation-service.ts +49 -13
  437. package/src/runtime/control-plane/execution/work-preparation-service.ts +31 -15
  438. package/src/runtime/control-plane/execution/work-remote-delivery.ts +1 -1
  439. package/src/runtime/control-plane/execution/work-task-receipt.ts +20 -1
  440. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +407 -76
  441. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +88 -18
  442. package/src/runtime/control-plane/execution/work-verification-context.ts +1 -1
  443. package/src/runtime/control-plane/execution/work-verification-service.ts +258 -4
  444. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +200 -15
  445. package/src/runtime/control-plane/facade/capability-registry.ts +21 -10
  446. package/src/runtime/control-plane/facade/controller-round-relay.ts +3 -1118
  447. package/src/runtime/control-plane/facade/controller-session-store.ts +2 -488
  448. package/src/runtime/control-plane/facade/goal-workloop-access.ts +6 -3
  449. package/src/runtime/control-plane/facade/goal-workloop.ts +972 -137
  450. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +158 -0
  451. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +10 -0
  452. package/src/runtime/control-plane/facade/index.ts +4 -2
  453. package/src/runtime/control-plane/facade/operation-digest.ts +22 -58
  454. package/src/runtime/control-plane/facade/plan-contract-store.ts +1004 -38
  455. package/src/runtime/control-plane/facade/repository-work-admission.ts +19 -1
  456. package/src/runtime/control-plane/facade/requirement-authority.ts +218 -0
  457. package/src/runtime/control-plane/facade/requirement-board.ts +6 -1
  458. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +48 -0
  459. package/src/runtime/control-plane/facade/semantic-admission.ts +8 -16
  460. package/src/runtime/control-plane/facade/suggested-actions.ts +4 -1
  461. package/src/runtime/control-plane/facade/types.ts +189 -532
  462. package/src/runtime/control-plane/facade/work-admission-policy.ts +84 -35
  463. package/src/runtime/control-plane/facade/work-contract-store.ts +2 -1043
  464. package/src/runtime/control-plane/facade/work-implementation-review.ts +2 -0
  465. package/src/runtime/control-plane/facade/work-state-machine.ts +2 -250
  466. package/src/runtime/control-plane/generated-cache-retention.ts +239 -18
  467. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +12 -1
  468. package/src/runtime/control-plane/global-scheduler/maintenance.ts +76 -13
  469. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-entry.ts +55 -0
  470. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-process.ts +98 -0
  471. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +1 -1
  472. package/src/runtime/control-plane/global-scheduler/scheduler-worker-entry.ts +10 -0
  473. package/src/runtime/control-plane/global-scheduler/scheduler.ts +173 -81
  474. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +18 -6
  475. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +397 -0
  476. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +2 -177
  477. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +301 -560
  478. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +20 -4
  479. package/src/runtime/control-plane/launcher/thin-launcher.ts +50 -4
  480. package/src/runtime/control-plane/lifecycle-retention-metrics.ts +60 -0
  481. package/src/runtime/control-plane/persistence/experience-store.ts +169 -0
  482. package/src/runtime/control-plane/persistence/operational-prior-store.ts +348 -0
  483. package/src/runtime/control-plane/persistence/requirement-store.ts +30 -22
  484. package/src/runtime/control-plane/persistence/sqlite-store.ts +545 -76
  485. package/src/runtime/control-plane/persistence/workflow-content-store.ts +98 -0
  486. package/src/runtime/control-plane/persistence/workflow-registry-store.ts +186 -0
  487. package/src/runtime/control-plane/persistence/workflow-run-store.ts +123 -0
  488. package/src/runtime/control-plane/release-retention.ts +56 -16
  489. package/src/runtime/control-plane/repository-namespace-retention.ts +208 -0
  490. package/src/runtime/control-plane/routing/route-policy.ts +19 -0
  491. package/src/runtime/control-plane/runtime-cleanup.ts +574 -37
  492. package/src/runtime/control-plane/runtime-generation.ts +6 -0
  493. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +465 -0
  494. package/src/runtime/control-plane/workspace/workspace-store.ts +80 -0
  495. package/src/runtime/diagnostics/incident-repair.ts +406 -0
  496. package/src/runtime/diagnostics/mcp-timing.ts +125 -6
  497. package/src/runtime/diagnostics/performance.ts +6 -14
  498. package/src/runtime/diagnostics/read-only-tool.ts +1 -1
  499. package/src/runtime/evidence/artifact-store.ts +65 -2
  500. package/src/runtime/evidence/operational-shadow.ts +38 -0
  501. package/src/runtime/evidence/process-check-receipt.ts +5 -43
  502. package/src/runtime/evidence/sensitive-output.ts +4 -4
  503. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -1
  504. package/src/runtime/execution/jobs/store.ts +121 -2
  505. package/src/runtime/execution/managed-workspace.ts +55 -5
  506. package/src/runtime/execution/process-runtime/canary.ts +19 -5
  507. package/src/runtime/execution/process-runtime/check-classification.ts +48 -0
  508. package/src/runtime/execution/process-runtime/check-facade.ts +23 -9
  509. package/src/runtime/execution/process-runtime/check-receipt.ts +1 -1
  510. package/src/runtime/execution/process-runtime/check-result-retention.ts +132 -0
  511. package/src/runtime/execution/process-runtime/check-result.ts +73 -2
  512. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +42 -3
  513. package/src/runtime/execution/process-runtime/check-storage.ts +187 -0
  514. package/src/runtime/execution/process-runtime/command-facade.ts +38 -87
  515. package/src/runtime/execution/process-runtime/index.ts +1 -0
  516. package/src/runtime/execution/process-runtime/interactive-admission.ts +2 -1
  517. package/src/runtime/execution/process-runtime/lightweight-managed.ts +32 -1
  518. package/src/runtime/execution/process-runtime/persisted-check.ts +128 -21
  519. package/src/runtime/execution/process-runtime/resource-claims.ts +60 -3
  520. package/src/runtime/execution/process-runtime/runtime.ts +132 -15
  521. package/src/runtime/execution/process-runtime/types.ts +22 -0
  522. package/src/runtime/execution/workers/executor.ts +16 -13
  523. package/src/runtime/execution/workers/worker-entry.ts +1 -1
  524. package/src/runtime/gateway/mcp/execution-tools.ts +2 -207
  525. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +2 -61
  526. package/src/runtime/gateway/mcp/persisted-check-process.ts +2 -3
  527. package/src/runtime/gateway/mcp/process-tools.ts +2 -289
  528. package/src/runtime/gateway/mcp/router.ts +2 -1125
  529. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +2 -565
  530. package/src/runtime/gateway/mcp/runtime-tools.ts +2 -6651
  531. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +2 -1
  532. package/src/runtime/maintenance/cleanup.ts +38 -24
  533. package/src/runtime/platform/browser-product-discovery.ts +174 -0
  534. package/src/runtime/platform/computer-platform.ts +14 -0
  535. package/src/runtime/platform/executable-discovery.ts +54 -0
  536. package/src/runtime/platform/fetch-http-server.ts +90 -0
  537. package/src/runtime/platform/service-manager.ts +138 -0
  538. package/src/runtime/platform/windows-host-discovery.ts +118 -0
  539. package/src/runtime/platform/windows-recovery-deployment.ts +67 -0
  540. package/src/runtime/plugins/action-application.ts +135 -0
  541. package/src/runtime/plugins/app-store-connect-adapter.ts +9 -21
  542. package/src/runtime/plugins/browser-adapter.ts +140 -100
  543. package/src/runtime/plugins/browser-automation-service.ts +15 -36
  544. package/src/runtime/plugins/browser-macos-bridge.ts +69 -21
  545. package/src/runtime/plugins/browser-manifest-surface.ts +30 -6
  546. package/src/runtime/plugins/browser-native-session-service.ts +1 -1
  547. package/src/runtime/plugins/browser-provider-registry.ts +2 -109
  548. package/src/runtime/plugins/browser-registration.ts +16 -0
  549. package/src/runtime/plugins/browser-runtime-contract.ts +2 -154
  550. package/src/runtime/plugins/browser-runtime.ts +41 -9
  551. package/src/runtime/plugins/browser-session-authority.ts +101 -291
  552. package/src/runtime/plugins/browser-session-legacy-migration.ts +203 -0
  553. package/src/runtime/plugins/browser-session-store.ts +229 -36
  554. package/src/runtime/plugins/browser-session-types.ts +2 -98
  555. package/src/runtime/plugins/capability-authorization-grants.ts +17 -0
  556. package/src/runtime/plugins/catalog-trust.ts +82 -0
  557. package/src/runtime/plugins/computer-registration.ts +839 -0
  558. package/src/runtime/plugins/config-store.ts +119 -0
  559. package/src/runtime/plugins/desktop-operator-external-policy.ts +932 -0
  560. package/src/runtime/plugins/desktop-operator-registration.ts +111 -8
  561. package/src/runtime/plugins/errors.ts +8 -1
  562. package/src/runtime/plugins/external-adapter.ts +45 -322
  563. package/src/runtime/plugins/external-provider-policy.ts +48 -0
  564. package/src/runtime/plugins/external-registration.ts +9 -1
  565. package/src/runtime/plugins/external-unix-socket-probe.cjs +9 -3
  566. package/src/runtime/plugins/external-unix-socket.ts +64 -193
  567. package/src/runtime/plugins/first-party-external-registration.ts +163 -0
  568. package/src/runtime/plugins/first-party-registry.ts +3 -1
  569. package/src/runtime/plugins/github-adapter.ts +1 -2
  570. package/src/runtime/plugins/gmail-adapter.ts +6 -6
  571. package/src/runtime/plugins/google-calendar-adapter.ts +6 -6
  572. package/src/runtime/plugins/google-shared.ts +31 -46
  573. package/src/runtime/plugins/google-tasks-adapter.ts +6 -6
  574. package/src/runtime/plugins/ios-adapter.ts +1 -2
  575. package/src/runtime/plugins/local-system-adapter.ts +180 -0
  576. package/src/runtime/plugins/macos-capability-broker.ts +15 -105
  577. package/src/runtime/plugins/resend-adapter.ts +15 -24
  578. package/src/runtime/plugins/store.ts +493 -51
  579. package/src/runtime/plugins/types.ts +8 -1
  580. package/src/runtime/plugins/uu-remote-rescue-registration.ts +155 -0
  581. package/src/runtime/plugins/windows-host-recovery-install.ts +68 -0
  582. package/src/runtime/plugins/windows-host-recovery-registration.ts +85 -0
  583. package/src/runtime/plugins/xiaohongshu-publish.ts +86 -430
  584. package/src/runtime/projections/controller-context.ts +12 -6
  585. package/src/runtime/projections/git-status-sampler.ts +73 -22
  586. package/src/runtime/projections/materialized-view.ts +14 -8
  587. package/src/runtime/recovery/capability-action-application.ts +228 -0
  588. package/src/runtime/recovery/index.ts +3 -0
  589. package/src/runtime/recovery/lifecycle-inventory.ts +338 -0
  590. package/src/runtime/recovery/local-jobs-repair.ts +14 -14
  591. package/src/runtime/recovery/maintenance-executor.ts +358 -76
  592. package/src/runtime/recovery/quarantine-retention.ts +256 -0
  593. package/src/runtime/release/identity.ts +6 -0
  594. package/src/runtime/resources/leases/store.ts +1 -1
  595. package/src/runtime/root/active-execution-power-assertion.ts +139 -0
  596. package/src/runtime/root/assistant-learning-loop.ts +45 -0
  597. package/src/runtime/root/browser-session-composition.ts +59 -0
  598. package/src/runtime/root/computer-composition.ts +191 -0
  599. package/src/runtime/root/computer-target-composition.ts +16 -0
  600. package/src/runtime/root/computer-target-persistence.ts +39 -0
  601. package/src/runtime/root/controller-round-composition.ts +107 -0
  602. package/src/runtime/root/controller-services.ts +2 -0
  603. package/src/runtime/root/entry.ts +4 -3
  604. package/src/runtime/root/gateway-adapter.ts +3 -3
  605. package/src/runtime/root/local-bridge.ts +5 -2
  606. package/src/runtime/root/mcp-transport.ts +5 -5
  607. package/src/runtime/root/package-connector-service.ts +108 -56
  608. package/src/runtime/root/package-runtime-release.ts +86 -18
  609. package/src/runtime/root/package-runtime-service.ts +63 -86
  610. package/src/runtime/root/release-execution-canary.ts +71 -0
  611. package/src/runtime/root/release-loader.ts +68 -0
  612. package/src/runtime/root/release-manifest.ts +106 -2
  613. package/src/runtime/root/release-materialize.ts +103 -4
  614. package/src/runtime/root/release-store.ts +31 -2
  615. package/src/runtime/root/runtime.ts +240 -25
  616. package/src/runtime/root/scheduled-controller-composition.ts +51 -0
  617. package/src/runtime/root/scheduler.ts +12 -4
  618. package/src/runtime/root/service-runner.ts +1 -1
  619. package/src/runtime/root/service.ts +41 -16
  620. package/src/runtime/root/status.ts +1 -0
  621. package/src/runtime/root/types.ts +24 -1
  622. package/src/runtime/shared/local-bridge-surface.ts +1 -1
  623. package/src/runtime/shared/process-environment.ts +19 -4
  624. package/src/runtime/shared/storage-capacity.ts +68 -0
  625. package/src/runtime/standalone-recovery/controller-home-migration.ts +1116 -0
  626. package/src/runtime/standalone-recovery/core.ts +984 -230
  627. package/src/runtime/standalone-recovery/entry.ts +182 -51
  628. package/src/runtime/standalone-recovery/independent-host-rescue.ts +172 -0
  629. package/src/runtime/standalone-recovery/installer.ts +212 -104
  630. package/src/runtime/standalone-recovery/mcp-server.ts +243 -0
  631. package/src/runtime/standalone-recovery/mutation-identity-contract.ts +21 -0
  632. package/src/runtime/standalone-recovery/operation-lock.ts +160 -0
  633. package/src/runtime/standalone-recovery/performance.ts +135 -0
  634. package/src/runtime/standalone-recovery/release.ts +5 -0
  635. package/src/runtime/watchdog/workflow-watchdog.ts +1 -1
  636. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +1 -1
  637. package/src/runtime/workflow/schedules/engine.ts +191 -343
  638. package/src/runtime/workflow/schedules/pending-activation.ts +1 -1
  639. package/src/runtime/workflow/schedules/settlement.ts +2 -191
  640. package/src/runtime/workflow/schedules/store.ts +2 -607
  641. package/src/runtime/workflow/schedules/types.ts +2 -127
  642. package/src/runtime/workflow/schedules/work-continuation.ts +180 -15
  643. package/src/runtime/workflows/first-party/xiaohongshu.ts +122 -0
  644. package/src/runtime/workflows/runtime.ts +486 -0
  645. package/src/testing/test-governance.ts +90 -29
  646. package/assets/templates/helpers/archive-architecture-request.sh +0 -244
  647. package/docs/architecture/history/README.md +0 -7
  648. package/docs/architecture/history/chatgpt-handoff-facade.md +0 -397
  649. package/docs/architecture/history/global-hook-runtime.md +0 -166
  650. package/docs/architecture/history/ios-semantic-automation-provider-v2.md +0 -170
  651. package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  652. package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +0 -59
  653. package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +0 -59
  654. package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +0 -59
  655. package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +0 -59
  656. package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  657. package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  658. package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  659. package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  660. package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +0 -59
  661. package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  662. package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  663. package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  664. package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  665. package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  666. package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  667. package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  668. package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  669. package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  670. package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +0 -59
  671. package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +0 -59
  672. package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +0 -63
  673. package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  674. package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  675. package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  676. package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  677. package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +0 -60
  678. package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +0 -60
  679. package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +0 -68
  680. package/docs/architecture/requests/archive/2026/root.md +0 -68
  681. package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +0 -76
  682. package/docs/architecture/requests/archive/2026/verification-evals-checks.md +0 -68
  683. package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +0 -69
  684. package/scripts/archive-architecture-request.sh +0 -4
  685. package/scripts/run-skill-evals.ts +0 -1022
@@ -9,7 +9,6 @@
9
9
  */
10
10
 
11
11
  import type { RepositoryRecord } from '../../../cli/repositories/types';
12
- import { repositoryGitStatus } from '../../../cli/repositories/structured-git';
13
12
  import { classifyRepositoryCommand, fixedShellWrapperCommand, shellSegments, shellWordsPreservingQuotes } from '../../../cli/repositories/command-classifier';
14
13
  import {
15
14
  executeRepositoryCommandAsync,
@@ -34,7 +33,7 @@ import { DEFAULT_INTERACTIVE_WAIT_MS } from './types';
34
33
  import { durationAwareInteractiveWaitMs } from './interactive-admission';
35
34
  import { isFocusedCheckCommand } from '../thin-harness/execution-router';
36
35
  import { assertExecutionIdentity, type ResolvedExecutionIdentity } from '../../control-plane/execution/execution-identity';
37
- import { readWorkHandle, transitionWorkHandle } from '../../control-plane/execution/work-handle-store';
36
+ import { settleWorkHandleExpectedHeadAfterRepositoryCommand } from '../../control-plane/execution/work-head-settlement';
38
37
  import {
39
38
  cancelLightweightProcess,
40
39
  getLightweightProcessHandle,
@@ -114,77 +113,6 @@ const emptyEffects = {
114
113
  projectionUpdateCount: 0,
115
114
  };
116
115
 
117
- export type WorkHeadSettlementReason =
118
- | 'settled'
119
- | 'no_work'
120
- | 'command_not_successful'
121
- | 'work_handle_missing'
122
- | 'identity_mismatch'
123
- | 'terminal_handle'
124
- | 'branch_changed'
125
- | 'head_unavailable'
126
- | 'head_unchanged'
127
- | 'concurrent_lifecycle_write';
128
-
129
- export interface WorkHeadSettlementResult {
130
- settled: boolean;
131
- reason: WorkHeadSettlementReason;
132
- previousHead?: string;
133
- currentHead?: string;
134
- }
135
-
136
- /**
137
- * Settle the one legitimate post-command Work HEAD transition without weakening
138
- * the pre-command execution identity fence. The command has already been
139
- * admitted only if repo/checkout/branch/expectedHead matched the WorkHandle.
140
- * After success, adopt the exact current HEAD only while the same checkout and
141
- * branch still own the Work. CAS failure is a bounded no-op: finalization keeps
142
- * failing closed instead of accepting a concurrent lifecycle writer.
143
- */
144
- export function settleWorkHandleExpectedHeadAfterRepositoryCommand(input: {
145
- controllerHome: string;
146
- repository: RepositoryRecord;
147
- executionIdentity: ResolvedExecutionIdentity;
148
- workId?: string;
149
- ok?: boolean;
150
- cancelled?: boolean;
151
- timedOut?: boolean;
152
- }): WorkHeadSettlementResult {
153
- const workId = input.workId?.trim();
154
- if (!workId) return { settled: false, reason: 'no_work' };
155
- if (input.ok !== true || input.cancelled === true || input.timedOut === true) {
156
- return { settled: false, reason: 'command_not_successful' };
157
- }
158
- const handle = readWorkHandle(input.controllerHome, input.repository.repoId, workId);
159
- if (!handle) return { settled: false, reason: 'work_handle_missing' };
160
- if (
161
- handle.repositoryId !== input.executionIdentity.repositoryId
162
- || handle.checkoutId !== input.executionIdentity.checkoutId
163
- || handle.workId !== input.executionIdentity.workId
164
- ) return { settled: false, reason: 'identity_mismatch' };
165
- if (handle.state === 'merged' || handle.state === 'cleaned' || handle.state === 'failed_terminal_cleanup') {
166
- return { settled: false, reason: 'terminal_handle' };
167
- }
168
- const status = repositoryGitStatus(input.repository);
169
- if (!status.branch || status.branch !== handle.branch) {
170
- return { settled: false, reason: 'branch_changed', previousHead: handle.expectedHead, currentHead: status.head ?? undefined };
171
- }
172
- const currentHead = status.head?.trim();
173
- if (!currentHead) return { settled: false, reason: 'head_unavailable', previousHead: handle.expectedHead };
174
- if (currentHead === handle.expectedHead) {
175
- return { settled: false, reason: 'head_unchanged', previousHead: handle.expectedHead, currentHead };
176
- }
177
- try {
178
- transitionWorkHandle(input.controllerHome, handle, handle.state, { expectedHead: currentHead });
179
- return { settled: true, reason: 'settled', previousHead: handle.expectedHead, currentHead };
180
- } catch (error) {
181
- if (error instanceof Error && error.message.includes('CONTROL_PLANE_REVISION_CONFLICT')) {
182
- return { settled: false, reason: 'concurrent_lifecycle_write', previousHead: handle.expectedHead, currentHead };
183
- }
184
- throw error;
185
- }
186
- }
187
-
188
116
  const STANDALONE_RECOVERY_LIFECYCLE_COMMANDS = new Set([
189
117
  'restart-runtime',
190
118
  'bootstrap-cutover',
@@ -237,9 +165,15 @@ function repositoryCommandRecoveryLifecycle(command: string | readonly string[])
237
165
  return wrapped ? recoveryLifecycleFromShell(wrapped) : undefined;
238
166
  }
239
167
 
240
- function gitCommitWordsRequireExplicitPathScope(words: readonly string[]): boolean | undefined {
168
+ export type RepositoryGitCommitCommandScope =
169
+ | { kind: 'not_commit' }
170
+ | { kind: 'explicit_paths'; paths: string[] }
171
+ | { kind: 'staged_index' }
172
+ | { kind: 'unsafe'; reason: 'scope_widening' | 'compound_unscoped_commit' };
173
+
174
+ function gitCommitWordsScope(words: readonly string[]): RepositoryGitCommitCommandScope {
241
175
  const executable = commandBasename(words[0] ?? '');
242
- if (executable !== 'git') return undefined;
176
+ if (executable !== 'git') return { kind: 'not_commit' };
243
177
  const args = words.slice(1);
244
178
  let index = 0;
245
179
  while (index < args.length && args[index]?.startsWith('-')) {
@@ -248,29 +182,45 @@ function gitCommitWordsRequireExplicitPathScope(words: readonly string[]): boole
248
182
  else if (['--git-dir=', '--work-tree=', '--namespace='].some((prefix) => option.startsWith(prefix))) index += 1;
249
183
  else index += 1;
250
184
  }
251
- if (args[index]?.toLowerCase() !== 'commit') return undefined;
185
+ if (args[index]?.toLowerCase() !== 'commit') return { kind: 'not_commit' };
252
186
  const commitArgs = args.slice(index + 1);
253
187
  const pathSeparator = commitArgs.indexOf('--');
254
188
  const paths = pathSeparator >= 0 ? commitArgs.slice(pathSeparator + 1).filter(Boolean) : [];
255
- const widensScope = commitArgs.some((arg) => ['-a', '--all', '-i', '--include', '--interactive', '-p', '--patch'].includes(arg));
256
- return paths.length === 0 || widensScope;
189
+ const wideningFlags = ['-a', '--all', '-i', '--include', '--interactive', '-p', '--patch', '--amend', '--pathspec-from-file'];
190
+ const widensScope = commitArgs.some((arg) => wideningFlags.some((flag) => arg === flag || arg.startsWith(`${flag}=`)));
191
+ if (widensScope) return { kind: 'unsafe', reason: 'scope_widening' };
192
+ return paths.length > 0 ? { kind: 'explicit_paths', paths } : { kind: 'staged_index' };
193
+ }
194
+
195
+ function aggregateShellCommitScope(shellCommand: string): RepositoryGitCommitCommandScope {
196
+ const segments = shellSegments(shellCommand);
197
+ const commits = segments
198
+ .map((segment) => gitCommitWordsScope(shellWordsPreservingQuotes(segment)))
199
+ .filter((scope) => scope.kind !== 'not_commit');
200
+ if (commits.length === 0) return { kind: 'not_commit' };
201
+ const unsafe = commits.find((scope): scope is Extract<RepositoryGitCommitCommandScope, { kind: 'unsafe' }> => scope.kind === 'unsafe');
202
+ if (unsafe) return unsafe;
203
+ if (segments.length > 1 && commits.some((scope) => scope.kind === 'staged_index')) {
204
+ return { kind: 'unsafe', reason: 'compound_unscoped_commit' };
205
+ }
206
+ const staged = commits.find((scope) => scope.kind === 'staged_index');
207
+ if (staged) return staged;
208
+ const paths = commits.flatMap((scope) => scope.kind === 'explicit_paths' ? scope.paths : []);
209
+ return { kind: 'explicit_paths', paths: [...new Set(paths)] };
257
210
  }
258
211
 
259
- function rawGitCommitRequiresExplicitPathScope(command: string | readonly string[]): boolean {
212
+ export function classifyRawGitCommitScope(command: string | readonly string[]): RepositoryGitCommitCommandScope {
260
213
  const normalized = normalizeRepositoryCommand(command);
261
214
  if (normalized.kind === 'argv') {
262
- const direct = gitCommitWordsRequireExplicitPathScope([
215
+ const direct = gitCommitWordsScope([
263
216
  normalized.executable ?? '',
264
217
  ...(normalized.args ?? []),
265
218
  ]);
266
- if (direct !== undefined) return direct;
219
+ if (direct.kind !== 'not_commit') return direct;
267
220
  const wrapped = fixedShellWrapperCommand(normalized.value as string[]);
268
- if (!wrapped) return false;
269
- return shellSegments(wrapped)
270
- .some((segment) => gitCommitWordsRequireExplicitPathScope(shellWordsPreservingQuotes(segment)) === true);
221
+ return wrapped ? aggregateShellCommitScope(wrapped) : { kind: 'not_commit' };
271
222
  }
272
- return shellSegments(normalized.shellCommand ?? '')
273
- .some((segment) => gitCommitWordsRequireExplicitPathScope(shellWordsPreservingQuotes(segment)) === true);
223
+ return aggregateShellCommitScope(normalized.shellCommand ?? '');
274
224
  }
275
225
 
276
226
  function toProcessCommand(command: string | readonly string[], cwd: string): ProcessCommandSpec {
@@ -305,7 +255,8 @@ export function classifyRepositoryCommandRoute(
305
255
  if (repositoryCommandRecoveryLifecycle(command)) {
306
256
  return { route: 'reject', reason: 'standalone_recovery_lifecycle_required' };
307
257
  }
308
- if (rawGitCommitRequiresExplicitPathScope(command)) {
258
+ const commitScope = classifyRawGitCommitScope(command);
259
+ if (commitScope.kind === 'unsafe') {
309
260
  return { route: 'reject', reason: 'git_commit_requires_explicit_path_scope' };
310
261
  }
311
262
  if (options.forceDurable) {
@@ -2,6 +2,7 @@ export * from './types';
2
2
  export * from './store';
3
3
  export * from './resource-claims';
4
4
  export * from './runtime';
5
+ export * from './check-classification';
5
6
  export * from './check-facade';
6
7
  export * from './check-receipt';
7
8
  export * from './command-facade';
@@ -28,5 +28,6 @@ export function durationAwareInteractiveWaitMs(
28
28
  const normalized = normalizeRepositoryCommand(command);
29
29
  if (normalized.kind !== 'argv') return DEFAULT_COMPLETION_GRACE_MS;
30
30
  const executable = normalized.executable?.split(/[\\/]/).at(-1)?.toLowerCase();
31
- return executable && SHORT_COMMANDS.has(executable) ? shortCommandWaitMs : DEFAULT_COMPLETION_GRACE_MS;
31
+ const shortGitMerge = executable === 'git' && normalized.args?.[0] === 'merge';
32
+ return executable && (SHORT_COMMANDS.has(executable) || shortGitMerge) ? shortCommandWaitMs : DEFAULT_COMPLETION_GRACE_MS;
32
33
  }
@@ -93,6 +93,12 @@ interface LightweightEntry {
93
93
 
94
94
  const entries = new Map<string, LightweightEntry>();
95
95
 
96
+ export function hasActiveLightweightProcesses(controllerHome: string): boolean {
97
+ return [...entries.values()].some((entry) => (
98
+ entry.controllerHome === controllerHome && entry.result === undefined
99
+ ));
100
+ }
101
+
96
102
  interface LightweightRunningReceipt {
97
103
  schemaVersion: 1;
98
104
  repoId: string;
@@ -740,7 +746,31 @@ export async function startLightweightRepositoryCommand(
740
746
  // degradation is represented by RepositoryCommandExecution.evidenceError;
741
747
  // this catch is the final fail-safe for any later post-processing exception.
742
748
  if (entry.exitObservation && entry.result) return entry.result;
743
- throw error;
749
+
750
+ // Command preparation can fail before spawn (for example a repository-scope
751
+ // or external-filesystem grant denial). In deferred-start mode that rejection
752
+ // must belong to this lightweight Process; allowing it to escape would become
753
+ // an unhandled Runtime rejection and could terminate unrelated in-flight work.
754
+ const message = error instanceof Error ? error.message : String(error);
755
+ const failed: LightweightExecutionResult = {
756
+ ok: false,
757
+ exitCode: 1,
758
+ timedOut: false,
759
+ cancelled: false,
760
+ stdout: visibleOutput(entry.stdout, maxOutputBytes),
761
+ stderr: visibleOutput([entry.stderr, message].filter(Boolean).join('\n'), maxOutputBytes),
762
+ };
763
+ entry.result = failed;
764
+ entry.finishedAtMs = Date.now();
765
+ input.execution.signal?.removeEventListener('abort', onCallerAbort);
766
+ try {
767
+ input.onCompleted?.(failed);
768
+ } catch (callbackError) {
769
+ const callbackMessage = callbackError instanceof Error ? callbackError.message : String(callbackError);
770
+ failed.stderr = visibleOutput([failed.stderr, callbackMessage].filter(Boolean).join('\n'), maxOutputBytes);
771
+ }
772
+ persistTerminalReceipt(input.controllerHome, entry);
773
+ return failed;
744
774
  });
745
775
  entry.promise = input.deferStart
746
776
  ? new Promise<LightweightExecutionResult>((resolve, reject) => {
@@ -974,6 +1004,7 @@ export async function startLightweightControllerCheck(
974
1004
  }, { once: true });
975
1005
  entry.promise = runControllerCheckAsync(input.repoRoot, input.checkId, {
976
1006
  requestedTimeoutMs: input.timeoutMs,
1007
+ storageAuthority: { controllerHome: input.controllerHome, repoId: input.repoId },
977
1008
  subscriberId: processId,
978
1009
  onSpawn: (pid) => {
979
1010
  entry.pid = pid;
@@ -4,6 +4,7 @@ import { dirname, resolve } from 'path';
4
4
  import { fileURLToPath } from 'url';
5
5
  import {
6
6
  controllerCheckExecutionIdentity,
7
+ controllerCheckLiveExecutionStateFingerprint,
7
8
  listControllerChecks,
8
9
  snapshotControllerCheck,
9
10
  } from '../../../cli/controller/check-runner';
@@ -16,6 +17,7 @@ import {
16
17
  } from '../../../cli/runtime-invocation';
17
18
  import { readRuntimeGeneration, resolveControllerRuntimeSourceRoot } from '../../control-plane/runtime-generation';
18
19
  import { cleanupWorkVerificationSnapshot, materializeWorkVerificationSnapshot } from '../../control-plane/execution/work-verification-snapshot';
20
+ import { resolveBunExecutable } from '../../shared/process-environment';
19
21
  import {
20
22
  checkRequiresDurableWorkflow,
21
23
  processCheckSemanticScopeKey,
@@ -37,6 +39,7 @@ import { durationAwareInteractiveWaitMs } from './interactive-admission';
37
39
  export const DEFAULT_WORK_CHECK_LEASE_WAIT_MS = 30_000;
38
40
 
39
41
  const PERSISTED_CHECK_SOURCE_ENTRY = 'src/runtime/execution/process-runtime/check-runner-sidecar.ts';
42
+ const PERSISTED_CHECK_NODE_LOADER = 'src/runtime/shared/node-ts-loader.mjs';
40
43
 
41
44
  export function resolvePersistedCheckCliInvocation(
42
45
  cliEntry: string,
@@ -78,6 +81,52 @@ export function resolveRuntimeCliEntry(controllerHome?: string): string {
78
81
  return resolveRuntimeCliTarget(controllerHome).entry;
79
82
  }
80
83
 
84
+ export function shouldUseCandidatePersistedCheckRunner(input: {
85
+ repoId: string;
86
+ runtimeSourceRepoId?: string;
87
+ verificationSnapshot: boolean;
88
+ liveCertification: boolean;
89
+ }): boolean {
90
+ return input.verificationSnapshot
91
+ && !input.liveCertification
92
+ && Boolean(input.runtimeSourceRepoId && input.runtimeSourceRepoId === input.repoId);
93
+ }
94
+
95
+ export function resolveCandidatePersistedCheckRunnerTarget(
96
+ candidateRoot: string,
97
+ sourceRevision: string,
98
+ options: { bunExecutable?: string; entryExists?: (path: string) => boolean } = {},
99
+ ): { cliTarget: CliRuntimeTarget; runtimeExecutable: string; executionStateFingerprint: string } {
100
+ const root = resolve(candidateRoot);
101
+ const revision = sourceRevision.trim();
102
+ if (!revision) throw new Error('PERSISTED_CHECK_CANDIDATE_REVISION_REQUIRED');
103
+ const entryExists = options.entryExists ?? existsSync;
104
+ const sourceEntry = resolve(root, PERSISTED_CHECK_SOURCE_ENTRY);
105
+ if (!entryExists(sourceEntry)) {
106
+ throw new Error(`PERSISTED_CHECK_CANDIDATE_RUNNER_MISSING: ${sourceEntry}`);
107
+ }
108
+ const runtimeExecutable = options.bunExecutable?.trim() || resolveBunExecutable();
109
+ const cliTarget: CliRuntimeTarget = {
110
+ entry: sourceEntry,
111
+ cwd: root,
112
+ runtimeKind: 'bun_source',
113
+ sourceRevision: revision,
114
+ immutable: false,
115
+ explanation: 'self-hosting Work verification snapshot candidate Check Runner',
116
+ };
117
+ const executionStateFingerprint = createHash('sha256')
118
+ .update(JSON.stringify({
119
+ schemaVersion: 1,
120
+ authority: 'self_hosting_work_verification_candidate',
121
+ runnerEntry: PERSISTED_CHECK_SOURCE_ENTRY,
122
+ runtimeKind: cliTarget.runtimeKind,
123
+ sourceRevision: revision,
124
+ }))
125
+ .digest('hex')
126
+ .slice(0, 24);
127
+ return { cliTarget, runtimeExecutable, executionStateFingerprint };
128
+ }
129
+
81
130
  export function persistedCheckSemanticScopeKey(
82
131
  input: Pick<RunCheckFacadeInput, 'workId' | 'verificationBinding' | 'checkoutId'>,
83
132
  reuseScope: 'repository' | 'checkout',
@@ -108,25 +157,35 @@ export function resolvePersistedCheckProcessInvocation(
108
157
  if (cliTarget.runtimeKind === 'compiled_bun_release') {
109
158
  return { executable, args };
110
159
  }
160
+ const entryExists = options.entryExists ?? existsSync;
111
161
  const sourceEntry = resolve(cliTarget.cwd, PERSISTED_CHECK_SOURCE_ENTRY);
112
- if (!(options.entryExists ?? existsSync)(sourceEntry)) {
162
+ if (!entryExists(sourceEntry)) {
113
163
  throw new Error(`PERSISTED_CHECK_SOURCE_RUNNER_MISSING: ${sourceEntry}`);
114
164
  }
165
+ let nodeSourceLoaderEntry: string | undefined;
166
+ if (cliTarget.runtimeKind === 'node_source') {
167
+ nodeSourceLoaderEntry = resolve(cliTarget.cwd, PERSISTED_CHECK_NODE_LOADER);
168
+ if (!entryExists(nodeSourceLoaderEntry)) {
169
+ throw new Error(`PERSISTED_CHECK_NODE_LOADER_MISSING: ${nodeSourceLoaderEntry}`);
170
+ }
171
+ }
115
172
  return resolvePersistedCheckCliInvocation(sourceEntry, args, {
116
173
  runtimeExecutable: executable,
117
174
  runtimeKind: cliTarget.runtimeKind,
118
175
  sourceRevision: cliTarget.sourceRevision,
119
176
  immutable: false,
177
+ ...(nodeSourceLoaderEntry ? { nodeSourceLoaderEntry } : {}),
120
178
  ...(cliTarget.runtimeKind === 'package_launcher' ? { launcherEntry: cliTarget.entry } : {}),
121
179
  });
122
180
  }
123
181
 
124
182
  /**
125
183
  * Run a registered check through Process Runtime while keeping check-runner
126
- * evidence authoritative. The managed OS process invokes the same immutable
127
- * forge CLI bundle with a hidden internal subcommand; that subcommand
128
- * executes runControllerCheck, writes the Artifact atomically, mirrors bounded
129
- * stdout/stderr, and exits with the exact check status.
184
+ * evidence authoritative. Ordinary repositories and live-runtime certification
185
+ * use the active immutable Runtime runner. Self-hosting Forge Work verification
186
+ * instead executes the exact candidate snapshot sidecar so pre-cutover evidence
187
+ * cannot be interpreted by an older Runtime release. Process/lease/receipt
188
+ * authority remains in the active Runtime in both cases.
130
189
  */
131
190
  export async function runPersistedCheckViaProcessRuntime(
132
191
  input: RunCheckFacadeInput,
@@ -169,6 +228,23 @@ export async function runPersistedCheckViaProcessRuntime(
169
228
  };
170
229
  }
171
230
  }
231
+ // Check-definition authority belongs to the canonical repository, while Work source
232
+ // verification may execute from an immutable snapshot that intentionally excludes
233
+ // machine-local registry files such as .forge/checks.json. Freeze the exact
234
+ // registered definition before materializing the source-under-test snapshot.
235
+ const check = listControllerChecks(input.repoRoot).find((entry) => entry.id === input.checkId);
236
+ if (!check) {
237
+ return {
238
+ mode: 'durable',
239
+ checkId: input.checkId,
240
+ durable: {
241
+ reason: 'check_not_found_or_requires_registry_lookup',
242
+ suggestedOperation: 'list_checks then run_check with a known check_id',
243
+ },
244
+ durableSideEffects: emptyEffects,
245
+ };
246
+ }
247
+ const checkSnapshot = snapshotControllerCheck(input.repoRoot, input.checkId);
172
248
  const verificationSnapshot = input.verificationSnapshot
173
249
  ? materializeWorkVerificationSnapshot({
174
250
  controllerHome: input.controllerHome,
@@ -181,18 +257,9 @@ export async function runPersistedCheckViaProcessRuntime(
181
257
  const cleanupVerificationSnapshot = () => {
182
258
  if (verificationSnapshot) cleanupWorkVerificationSnapshot(verificationSnapshot.root);
183
259
  };
184
- const check = listControllerChecks(executionRoot).find((entry) => entry.id === input.checkId);
185
- if (!check) {
260
+ if (check.id !== checkSnapshot.id) {
186
261
  cleanupVerificationSnapshot();
187
- return {
188
- mode: 'durable',
189
- checkId: input.checkId,
190
- durable: {
191
- reason: 'check_not_found_or_requires_registry_lookup',
192
- suggestedOperation: 'list_checks then run_check with a known check_id',
193
- },
194
- durableSideEffects: emptyEffects,
195
- };
262
+ throw new Error(`CHECK_DEFINITION_AUTHORITY_MISMATCH: ${input.checkId}`);
196
263
  }
197
264
  if (input.forceDurable || (checkRequiresDurableWorkflow(input.checkId, check) && input.allowDurableCheckExecution !== true)) {
198
265
  cleanupVerificationSnapshot();
@@ -237,17 +304,48 @@ export async function runPersistedCheckViaProcessRuntime(
237
304
  executionIdentity.repositoryId,
238
305
  executionIdentity.checkoutId,
239
306
  check.effects,
307
+ check.executionAuthority,
240
308
  );
241
- const checkSnapshot = snapshotControllerCheck(executionRoot, input.checkId);
242
309
  const checkFingerprint = createHash('sha256')
243
310
  .update(JSON.stringify(checkSnapshot))
244
311
  .digest('hex');
245
- const semanticCheck = controllerCheckExecutionIdentity(
312
+ const liveCertification = check.executionAuthority === 'live_controller_home';
313
+ if (liveCertification && input.allowDurableCheckExecution !== true) {
314
+ cleanupVerificationSnapshot();
315
+ throw new Error('LIVE_CHECK_CONTROLLER_OWNERSHIP_REQUIRED');
316
+ }
317
+ const liveExecutionStateFingerprint = liveCertification
318
+ ? controllerCheckLiveExecutionStateFingerprint(input.controllerHome)
319
+ : undefined;
320
+ const preliminarySemanticCheck = controllerCheckExecutionIdentity(
246
321
  executionRoot,
247
322
  input.checkId,
248
323
  timeoutMs,
249
324
  checkSnapshot,
325
+ liveExecutionStateFingerprint,
250
326
  );
327
+ const runtimeGeneration = verificationSnapshot && !liveCertification
328
+ ? readRuntimeGeneration(input.controllerHome)
329
+ : undefined;
330
+ const candidateRunner = shouldUseCandidatePersistedCheckRunner({
331
+ repoId: input.repoId,
332
+ runtimeSourceRepoId: runtimeGeneration?.source.sourceRepositoryId,
333
+ verificationSnapshot: Boolean(verificationSnapshot),
334
+ liveCertification,
335
+ })
336
+ ? resolveCandidatePersistedCheckRunnerTarget(executionRoot, preliminarySemanticCheck.revision)
337
+ : undefined;
338
+ const executionStateFingerprint = candidateRunner?.executionStateFingerprint
339
+ ?? liveExecutionStateFingerprint;
340
+ const semanticCheck = candidateRunner
341
+ ? controllerCheckExecutionIdentity(
342
+ executionRoot,
343
+ input.checkId,
344
+ timeoutMs,
345
+ checkSnapshot,
346
+ executionStateFingerprint,
347
+ )
348
+ : preliminarySemanticCheck;
251
349
  const processCheckExecution = {
252
350
  schemaVersion: 1 as const,
253
351
  checkId: semanticCheck.checkId,
@@ -259,7 +357,7 @@ export async function runPersistedCheckViaProcessRuntime(
259
357
  reuseScope: semanticCheck.reuseScope,
260
358
  scopeKey: persistedCheckSemanticScopeKey(input, semanticCheck.reuseScope),
261
359
  };
262
- const cliTarget = resolveRuntimeCliTarget(input.controllerHome);
360
+ const cliTarget = candidateRunner?.cliTarget ?? resolveRuntimeCliTarget(input.controllerHome);
263
361
  const checkResultReceiptPath = allocatePersistedCheckResultReceiptPath(
264
362
  input.controllerHome,
265
363
  input.repoId,
@@ -268,20 +366,29 @@ export async function runPersistedCheckViaProcessRuntime(
268
366
  const checkArgs = [
269
367
  '--repo',
270
368
  executionRoot,
369
+ '--controller-home',
370
+ input.controllerHome,
371
+ '--repo-id',
372
+ input.repoId,
271
373
  '--check-id',
272
374
  input.checkId,
273
375
  '--timeout-ms',
274
376
  String(timeoutMs),
275
377
  '--expected-check-fingerprint',
276
378
  checkFingerprint,
379
+ '--check-snapshot',
380
+ Buffer.from(JSON.stringify(checkSnapshot)).toString('base64url'),
277
381
  '--result-receipt',
278
382
  checkResultReceiptPath,
279
383
  ...(verificationSnapshot ? [
280
- '--isolated-controller-home', verificationSnapshot.isolatedControllerHome,
384
+ ...(liveCertification ? ['--live-controller-home'] : ['--isolated-controller-home', verificationSnapshot.isolatedControllerHome]),
385
+ ...(executionStateFingerprint ? ['--execution-state-fingerprint', executionStateFingerprint] : []),
281
386
  '--cleanup-root', verificationSnapshot.root,
282
387
  ] : []),
283
388
  ];
284
- const invocation = resolvePersistedCheckProcessInvocation(cliTarget, checkArgs);
389
+ const invocation = resolvePersistedCheckProcessInvocation(cliTarget, checkArgs, candidateRunner
390
+ ? { runtimeExecutable: candidateRunner.runtimeExecutable }
391
+ : {});
285
392
  let handle;
286
393
  try {
287
394
  handle = await spawnManagedProcess({
@@ -6,8 +6,13 @@
6
6
  import type { ResourceClaimSpec } from '../jobs/types';
7
7
  import { readFileSync } from 'fs';
8
8
  import { join } from 'path';
9
- import type { ControllerCheckEffects } from '../../../cli/controller/check-runner';
10
- import { classifyRepositoryCommand, fixedShellWrapperCommand } from '../../../cli/repositories/command-classifier';
9
+ import type { ControllerCheckEffects, ControllerCheckExecutionAuthority } from '../../../cli/controller/check-runner';
10
+ import {
11
+ classifyRepositoryCommand,
12
+ fixedShellWrapperCommand,
13
+ shellSegments,
14
+ shellWordsPreservingQuotes,
15
+ } from '../../../cli/repositories/command-classifier';
11
16
  import { normalizeRepositoryCommand } from '../../../cli/repositories/command-normalization';
12
17
  import { isFocusedCheckCommand } from '../thin-harness/execution-router';
13
18
  import type { ProcessResourceClaim } from './types';
@@ -235,6 +240,52 @@ function viteServiceClaims(
235
240
  ]);
236
241
  }
237
242
 
243
+ const HOMEBREW_HOST_MUTATION_SUBCOMMANDS = new Set([
244
+ 'install',
245
+ 'uninstall',
246
+ 'reinstall',
247
+ 'upgrade',
248
+ 'update',
249
+ 'cleanup',
250
+ 'autoremove',
251
+ 'tap',
252
+ 'untap',
253
+ ]);
254
+
255
+ function homebrewHostMutationClaims(command: string | readonly string[]): ResourceClaimSpec[] | undefined {
256
+ const canonical = normalizeRepositoryCommand(command);
257
+ let words: string[];
258
+
259
+ if (canonical.kind === 'argv') {
260
+ const argv = [canonical.executable ?? '', ...(canonical.args ?? [])];
261
+ const wrapped = fixedShellWrapperCommand(argv);
262
+ if (wrapped) {
263
+ const segments = shellSegments(wrapped);
264
+ if (segments.length !== 1) return undefined;
265
+ words = shellWordsPreservingQuotes(segments[0]!);
266
+ } else {
267
+ words = argv;
268
+ }
269
+ } else {
270
+ const segments = shellSegments(canonical.shellCommand ?? '');
271
+ if (segments.length !== 1) return undefined;
272
+ words = shellWordsPreservingQuotes(segments[0]!);
273
+ }
274
+
275
+ const program = words[0]?.split(/[\\/]/).at(-1)?.toLowerCase();
276
+ if (program !== 'brew') return undefined;
277
+ const subcommand = words[1]?.toLowerCase();
278
+ if (!subcommand || !HOMEBREW_HOST_MUTATION_SUBCOMMANDS.has(subcommand)) return undefined;
279
+
280
+ // Keep local formula files, Brewfiles, and other path-shaped operands under
281
+ // conservative repository workspace coordination. Formula/cask identifiers
282
+ // are deliberately narrow so an ambiguous command still fails closed.
283
+ const positional = words.slice(2).filter((arg) => arg && !arg.startsWith('-'));
284
+ if (positional.some((arg) => !/^[A-Za-z0-9@+_.-]+$/.test(arg))) return undefined;
285
+
286
+ return [claimHostService('package-manager:homebrew', 'write')];
287
+ }
288
+
238
289
  function hostOnlyCommandClaims(command: string | readonly string[], repoId: string, checkoutId?: string, repoRoot?: string): ResourceClaimSpec[] | undefined {
239
290
  const localServer = localHttpServerClaims(command);
240
291
  if (localServer) return localServer;
@@ -242,6 +293,8 @@ function hostOnlyCommandClaims(command: string | readonly string[], repoId: stri
242
293
  if (loopbackCurl) return loopbackCurl;
243
294
  const vite = viteServiceClaims(command, repoId, checkoutId, repoRoot);
244
295
  if (vite) return vite;
296
+ const homebrew = homebrewHostMutationClaims(command);
297
+ if (homebrew) return homebrew;
245
298
  const canonical = normalizeRepositoryCommand(command);
246
299
  if (canonical.kind === 'shell') {
247
300
  return browserAppleScriptHeredocClaims(canonical.shellCommand ?? '');
@@ -508,6 +561,7 @@ export function claimsForCheck(
508
561
  repoId: string,
509
562
  checkoutId?: string,
510
563
  effects?: ControllerCheckEffects,
564
+ executionAuthority?: ControllerCheckExecutionAuthority,
511
565
  ): ResourceClaimSpec[] {
512
566
  const heavy = /(?:^|:)(?:test(?::coverage)?|check:(?:ci|forge-runtime|public-export|release(?:-[a-z0-9-]+)?))$/.test(checkId)
513
567
  || /release|migration|integrate/i.test(checkId);
@@ -520,7 +574,10 @@ export function claimsForCheck(
520
574
  : [claimWorkspaceWrite(checkoutId)];
521
575
  // Heavy-check is an additional cross-check serialization fence, not a
522
576
  // substitute for the resources the check actually reads or writes.
523
- return heavy ? normalizeClaims([claimHeavyCheck(repoId), ...baseClaims]) : baseClaims;
577
+ const liveAuthorityClaims = executionAuthority === 'live_controller_home' ? [claimRelease(repoId)] : [];
578
+ return heavy
579
+ ? normalizeClaims([claimHeavyCheck(repoId), ...liveAuthorityClaims, ...baseClaims])
580
+ : normalizeClaims([...liveAuthorityClaims, ...baseClaims]);
524
581
  }
525
582
 
526
583
  export function scopeResourceClaims(