@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
@@ -0,0 +1,38 @@
1
+ import type { ProcessCheckReceiptEvidence } from '../../../packages/kernel/work/api/index';
2
+ import type { ScopeRef } from '../../../packages/kernel/identity/api/index';
3
+ import { OPERATIONAL_TARGET_DEFINITIONS, type OperationalActionId, type OperationalMetricId, type OperationalObservation, type OperationalOutcomeClass, type OperationalTargetId } from '../../../packages/kernel/memory/api/index';
4
+ import type { ExecutionJob } from '../execution/jobs/types';
5
+
6
+ export interface OperationalExtractionIdentity {
7
+ targetId: OperationalTargetId;
8
+ actionId: OperationalActionId;
9
+ metricId: OperationalMetricId;
10
+ scope: ScopeRef;
11
+ consumerRequestId: string;
12
+ retainedUntil: string;
13
+ environmentFingerprint: string;
14
+ }
15
+ function elapsedMs(startedAt:string,finishedAt:string){const start=Date.parse(startedAt),finish=Date.parse(finishedAt);return Number.isFinite(start)&&Number.isFinite(finish)&&finish>=start?finish-start:0}
16
+ function jobOutcomeClass(job:ExecutionJob):OperationalOutcomeClass{
17
+ if(job.status==='waiting_for_approval')return'admission_wait';
18
+ if(job.status.startsWith('waiting_for_'))return'contention_wait';
19
+ if(job.status==='cancelled')return'cancelled';
20
+ if(job.status==='timed_out')return'timeout';
21
+ if(job.status==='failed'&&job.outcome?.policy?.decision==='rejected')return'policy_denied';
22
+ if(job.status==='failed'&&job.outcome?.failureClass==='infrastructure_failure')return'infrastructure_failure';
23
+ if(job.status==='failed')return'executed_failure';
24
+ if(job.status==='succeeded')return'executed_success';
25
+ return'unknown';
26
+ }
27
+ function checkOutcomeClass(receipt:ProcessCheckReceiptEvidence):OperationalOutcomeClass{
28
+ if(receipt.status==='cancelled')return'cancelled';if(receipt.status==='timed_out')return'timeout';if(receipt.status==='failed')return'unknown';if(receipt.status==='passed')return'executed_success';return'unknown';
29
+ }
30
+ function valueForMetric(metric:OperationalMetricId,outcome:OperationalOutcomeClass,elapsed:number){return metric==='latency_ms'?elapsed:outcome==='executed_success'?1:0}
31
+ export function extractExecutionJobShadowObservation(job:ExecutionJob,identity:OperationalExtractionIdentity):OperationalObservation{
32
+ const outcomeClass=jobOutcomeClass(job),observedAt=job.finishedAt??job.updatedAt,startAt=job.startedAt??job.queuedAt;
33
+ return{schemaVersion:1,observationId:`execution_job:${job.jobId}:${job.revision}:${identity.targetId}:${identity.actionId}:${identity.metricId}`,signalId:'execution_job.terminal_mechanical',targetId:identity.targetId,actionId:identity.actionId,metricId:identity.metricId,scope:identity.scope,source:{schema:'execution_job/v1',sourceId:job.jobId,eventKind:job.status,evidenceRef:`execution_job:${job.jobId}:${job.revision}`,requestId:job.requestId,observedAt,retainedUntil:identity.retainedUntil},attribution:{kind:identity.consumerRequestId===job.requestId?'exact':'ambiguous',consumerId:OPERATIONAL_TARGET_DEFINITIONS[identity.targetId].consumerId,requestId:identity.consumerRequestId,sourceId:job.jobId},outcomeClass,value:valueForMetric(identity.metricId,outcomeClass,elapsedMs(startAt,observedAt)),compatibility:{operation:job.payload.operation,environment:identity.environmentFingerprint}};
34
+ }
35
+ export function extractProcessCheckShadowObservation(receipt:ProcessCheckReceiptEvidence,identity:OperationalExtractionIdentity):OperationalObservation{
36
+ const outcomeClass=checkOutcomeClass(receipt),requestId=receipt.requestId??'';
37
+ return{schemaVersion:1,observationId:`process_check:${receipt.receiptId}:${identity.targetId}:${identity.actionId}:${identity.metricId}`,signalId:'process_check.terminal_mechanical',targetId:identity.targetId,actionId:identity.actionId,metricId:identity.metricId,scope:identity.scope,source:{schema:'process_check_receipt/v1',sourceId:receipt.receiptId,eventKind:receipt.status,evidenceRef:`process_check_receipt:${receipt.receiptId}`,requestId,observedAt:receipt.finishedAt,retainedUntil:identity.retainedUntil},attribution:{kind:requestId.length>0&&identity.consumerRequestId===requestId?'exact':'ambiguous',consumerId:OPERATIONAL_TARGET_DEFINITIONS[identity.targetId].consumerId,requestId:identity.consumerRequestId,sourceId:receipt.receiptId},outcomeClass,value:valueForMetric(identity.metricId,outcomeClass,elapsedMs(receipt.startedAt,receipt.finishedAt)),compatibility:{operation:`check:${receipt.checkId}`,environment:receipt.checkEnvironmentFingerprint??identity.environmentFingerprint}};
38
+ }
@@ -1,43 +1,5 @@
1
- export type ProcessCheckReceiptStatus = 'passed' | 'failed' | 'timed_out' | 'cancelled';
2
- export type ProcessCheckReceiptRuntimeStatus = 'succeeded' | 'failed' | 'timed_out' | 'cancelled';
3
-
4
- /**
5
- * Stable, persistence-safe evidence contract shared by Edit Sessions, Work and Tasks.
6
- * It deliberately contains no execution-runtime implementation types.
7
- */
8
- export interface ProcessCheckReceiptEvidence {
9
- schemaVersion: 1;
10
- receiptId: string;
11
- resultDigest: string;
12
- repoId: string;
13
- checkoutId?: string;
14
- workId?: string;
15
- executionSessionId?: string;
16
- editSessionId?: string;
17
- editRevision?: number;
18
- issueId?: string;
19
- taskId?: string;
20
- checkId: string;
21
- requestId?: string;
22
- processId: string;
23
- commandId?: string;
24
- /** Physical checkout that executed the Check; differs from checkoutId on safe cross-checkout reuse. */
25
- sourceCheckoutId?: string;
26
- /** Existing controller-check cache identity proving content/definition/environment equivalence. */
27
- checkCacheKey?: string;
28
- checkRevision?: string;
29
- checkDefinitionDigest?: string;
30
- checkEnvironmentFingerprint?: string;
31
- /** True when this consumer is bound to a physical Process originally launched by another consumer/checkout. */
32
- reusedExecution?: boolean;
33
- status: ProcessCheckReceiptStatus;
34
- runtimeStatus: ProcessCheckReceiptRuntimeStatus;
35
- ok: boolean;
36
- exitCode?: number;
37
- timedOut: boolean;
38
- cancelled: boolean;
39
- artifactPath: string;
40
- summary: string;
41
- startedAt: string;
42
- finishedAt: string;
43
- }
1
+ export type {
2
+ ProcessCheckReceiptEvidence,
3
+ ProcessCheckReceiptRuntimeStatus,
4
+ ProcessCheckReceiptStatus,
5
+ } from '../../../packages/kernel/work/api/index';
@@ -59,13 +59,13 @@ const SENSITIVE_PATTERNS: readonly SensitivePattern[] = [
59
59
  },
60
60
  {
61
61
  type: 'secret_assignment',
62
- pattern: /((?:^|[^\w]))([A-Za-z0-9_.-]*(?:api[_-]?key|access[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|password|passwd|secret|credentials?|auth[_-]?token|token|cookie)[A-Za-z0-9_.-]*)\s*(=>|:=|=|:)\s*(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\s,}\r\n]+)/gim,
63
- replacement: '$1$2$3[REDACTED]',
62
+ pattern: /((?:^|[^\w]))(["']?)([A-Za-z0-9_.-]*(?:api[_-]?key|access[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|password|passwd|secret|credentials?|auth[_-]?token|token|cookie)[A-Za-z0-9_.-]*)\2(\s*(?:=>|:=|=|:)\s*)(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\s,}\r\n]+)/gim,
63
+ replacement: '$1$2$3$2$4[REDACTED]',
64
64
  },
65
65
  {
66
66
  type: 'database_url_assignment',
67
- pattern: /((?:^|[^\w])(?:DATABASE_URL|POSTGRES_URL|MONGODB_URI|REDIS_URL)\s*(?:=>|:=|=|:)\s*)(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\s,}\r\n]+)/gim,
68
- replacement: '$1[REDACTED]',
67
+ pattern: /((?:^|[^\w]))(["']?)((?:DATABASE_URL|POSTGRES_URL|MONGODB_URI|REDIS_URL))\2(\s*(?:=>|:=|=|:)\s*)(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\s,}\r\n]+)/gim,
68
+ replacement: '$1$2$3$2$4[REDACTED]',
69
69
  },
70
70
  {
71
71
  type: 'url_userinfo',
@@ -1,4 +1,4 @@
1
- import { settleScheduledExecution } from '../../workflow/schedules/settlement';
1
+ import { settleScheduledExecution } from '../../../../packages/kernel/scheduler/api/index';
2
2
  import {
3
3
  buildDelegatedExecutionResult,
4
4
  childReferenceFromJob,
@@ -1,10 +1,10 @@
1
1
  import { createHash, randomUUID } from 'crypto';
2
- import { existsSync, readdirSync } from 'fs';
2
+ import { existsSync, opendirSync, readdirSync } from 'fs';
3
3
  import { join } from 'path';
4
4
  import { ensureControllerHome, ensureRepositoryControllerLayout, repositoryControllerRoot } from '../../../cli/repositories/controller-home';
5
5
  import { releaseControllerLock, tryAcquireControllerLock, withControllerLock } from '../../../cli/repositories/locks';
6
6
  import { appendJobEvent } from '../../evidence/event-ledger';
7
- import { writeExecutionArtifact } from '../../evidence/artifact-store';
7
+ import { cleanupExecutionArtifactsForJob, writeExecutionArtifact } from '../../evidence/artifact-store';
8
8
  import { markRepositoryProjectionDirty } from '../../projections/invalidation';
9
9
  import { touchSchedulerWakeSignal } from '../../control-plane/global-scheduler/wake-signal';
10
10
  import { readJsonFile, removeFile, sanitizeFileComponent, writeJsonAtomic } from '../../shared/json-files';
@@ -789,3 +789,122 @@ export function removeExecutionJobFromActiveIndex(controllerHome: string, job: E
789
789
  export function removeRequestIndex(controllerHome: string, requestId: string): void {
790
790
  removeFile(requestPath(controllerHome, requestId));
791
791
  }
792
+
793
+ export interface RetiredExecutionJobCleanupReport {
794
+ policyVersion: 'retired-execution-job-retention-v1';
795
+ inspected: number;
796
+ terminal: number;
797
+ protectedActive: number;
798
+ eligible: number;
799
+ removed: number;
800
+ retained: number;
801
+ scanTruncated: boolean;
802
+ budgetExhausted: boolean;
803
+ blockers: string[];
804
+ }
805
+
806
+ const DEFAULT_RETIRED_JOB_RETENTION_MS = 30 * 24 * 60 * 60_000;
807
+ const DEFAULT_MAX_RETAINED_TERMINAL_JOBS = 500;
808
+ const DEFAULT_RETIRED_JOB_SCAN = 5_000;
809
+ const DEFAULT_RETIRED_JOB_REMOVALS = 32;
810
+
811
+ /**
812
+ * Bounded compatibility cleanup for the retired ExecutionJob authority. New
813
+ * execution is Work + Process, so this only reclaims proven-terminal legacy
814
+ * bundles and never participates in execution admission or effect recovery.
815
+ */
816
+ export function cleanupRetiredExecutionJobs(
817
+ controllerHome: string,
818
+ repoId: string,
819
+ options: { nowMs?: number; retentionMs?: number; maxTerminalRecords?: number; maxScan?: number; maxRemovals?: number } = {},
820
+ ): RetiredExecutionJobCleanupReport {
821
+ assertRuntimeMayWriteOrThrow('cleanup', controllerHome);
822
+ if (!executionJobCreationRetired()) throw new Error('EXECUTION_JOB_RETENTION_REQUIRES_RETIRED_CREATION');
823
+ const nowMs = Number.isFinite(options.nowMs) ? Number(options.nowMs) : Date.now();
824
+ const retentionMs = Math.max(60_000, Math.trunc(options.retentionMs ?? DEFAULT_RETIRED_JOB_RETENTION_MS));
825
+ const maxTerminalRecords = Math.max(0, Math.min(Math.trunc(options.maxTerminalRecords ?? DEFAULT_MAX_RETAINED_TERMINAL_JOBS), 5_000));
826
+ const maxScan = Math.max(1, Math.min(Math.trunc(options.maxScan ?? DEFAULT_RETIRED_JOB_SCAN), 5_000));
827
+ const maxRemovals = Math.max(1, Math.min(Math.trunc(options.maxRemovals ?? DEFAULT_RETIRED_JOB_REMOVALS), 128));
828
+ const recordsRoot = join(executionJobRoot(controllerHome, repoId), 'records');
829
+ const scanned: Array<{ path: string; job: ExecutionJob; finishedAt: number }> = [];
830
+ let inspected = 0;
831
+ let protectedActive = 0;
832
+ let scanTruncated = false;
833
+ const blockers: string[] = [];
834
+
835
+ try {
836
+ const directory = opendirSync(recordsRoot);
837
+ try {
838
+ for (;;) {
839
+ const entry = directory.readSync();
840
+ if (!entry) break;
841
+ if (!entry.isFile() || !entry.name.endsWith('.json')) continue;
842
+ if (inspected >= maxScan) { scanTruncated = true; break; }
843
+ inspected += 1;
844
+ const path = join(recordsRoot, entry.name);
845
+ let job: ExecutionJob;
846
+ try { job = readJsonFile<ExecutionJob>(path); } catch { blockers.push(`invalid_record:${entry.name}`); continue; }
847
+ if (job.repoId !== repoId || !job.jobId || job.schemaVersion !== 1) { blockers.push(`identity_mismatch:${entry.name}`); continue; }
848
+ if (!TERMINAL_JOB_STATUSES.has(job.status)) { protectedActive += 1; continue; }
849
+ const finishedAt = Date.parse(job.finishedAt ?? job.updatedAt ?? job.createdAt);
850
+ scanned.push({ path, job, finishedAt: Number.isFinite(finishedAt) ? finishedAt : 0 });
851
+ }
852
+ } finally { directory.closeSync(); }
853
+ } catch {
854
+ return { policyVersion: 'retired-execution-job-retention-v1', inspected: 0, terminal: 0, protectedActive: 0, eligible: 0, removed: 0, retained: 0, scanTruncated: false, budgetExhausted: false, blockers: [] };
855
+ }
856
+
857
+ scanned.sort((a, b) => b.finishedAt - a.finishedAt);
858
+ const cutoff = nowMs - retentionMs;
859
+ const eligible = scanned.filter((entry, index) => index >= maxTerminalRecords || entry.finishedAt <= cutoff);
860
+ let removed = 0;
861
+ for (const candidate of eligible) {
862
+ if (removed >= maxRemovals) break;
863
+ const lockKey = { scope: 'task' as const, repoId, taskId: `execution-job-${candidate.job.jobId}` };
864
+ const acquired = tryAcquireControllerLock(controllerHome, lockKey, `retired-job-retention:${candidate.job.jobId}`);
865
+ if (!acquired.acquired) { blockers.push(`lock_contended:${candidate.job.jobId}`); continue; }
866
+ try {
867
+ let current: ExecutionJob;
868
+ try { current = getExecutionJob(controllerHome, repoId, candidate.job.jobId); } catch { continue; }
869
+ if (!TERMINAL_JOB_STATUSES.has(current.status)) { protectedActive += 1; continue; }
870
+ const currentFinishedAt = Date.parse(current.finishedAt ?? current.updatedAt ?? current.createdAt);
871
+ const expired = !Number.isFinite(currentFinishedAt) || currentFinishedAt <= cutoff;
872
+ const overCapacity = scanned.findIndex((entry) => entry.job.jobId === current.jobId) >= maxTerminalRecords;
873
+ if (!expired && !overCapacity) continue;
874
+
875
+ removeFile(candidate.path);
876
+ removeFile(join(executionJobRoot(controllerHome, repoId), 'receipts', `${sanitizeFileComponent(current.jobId)}.json`));
877
+ removeFile(join(repositoryControllerRoot(controllerHome, repoId), 'events', 'jobs', `${sanitizeFileComponent(current.jobId)}.jsonl`));
878
+ const artifactCleanup = cleanupExecutionArtifactsForJob(controllerHome, repoId, current.jobId);
879
+ blockers.push(...artifactCleanup.blockers.map((blocker) => `artifact:${current.jobId}:${blocker}`));
880
+ if (artifactCleanup.scanTruncated) blockers.push(`artifact_scan_truncated:${current.jobId}`);
881
+ if (current.requestId) removeFile(requestPath(controllerHome, current.requestId));
882
+ withControllerLock(controllerHome, { scope: 'global', resource: 'execution-index' }, `retired-job-index:${current.jobId}`, () => {
883
+ const active = readActiveIndex(controllerHome);
884
+ active.jobs = active.jobs.filter((entry) => entry.jobId !== current.jobId);
885
+ writeActiveIndex(controllerHome, active);
886
+ const recent = readRecentIndex(controllerHome);
887
+ recent.jobs = recent.jobs.filter((entry) => entry.jobId !== current.jobId);
888
+ writeRecentIndex(controllerHome, recent);
889
+ }, 10_000);
890
+ removed += 1;
891
+ } catch (error) {
892
+ blockers.push(error instanceof Error ? error.message : String(error));
893
+ } finally {
894
+ releaseControllerLock(controllerHome, lockKey, acquired.lock.lockId);
895
+ }
896
+ }
897
+
898
+ return {
899
+ policyVersion: 'retired-execution-job-retention-v1',
900
+ inspected,
901
+ terminal: scanned.length,
902
+ protectedActive,
903
+ eligible: eligible.length,
904
+ removed,
905
+ retained: Math.max(0, scanned.length - removed),
906
+ scanTruncated,
907
+ budgetExhausted: eligible.length > removed && removed >= maxRemovals,
908
+ blockers: blockers.slice(0, 16),
909
+ };
910
+ }
@@ -1,5 +1,5 @@
1
- import { createHash } from 'crypto';
2
- import { existsSync, mkdirSync, readFileSync, realpathSync, symlinkSync } from 'fs';
1
+ import { createHash, randomUUID } from 'crypto';
2
+ import { existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, symlinkSync } from 'fs';
3
3
  import { dirname, join, resolve } from 'path';
4
4
  import { repositoryControllerRoot } from '../../cli/repositories/controller-home';
5
5
  import type { RepositoryRecord } from '../../cli/repositories/types';
@@ -92,8 +92,8 @@ function assertBranch(root: string, branch: string): string {
92
92
  return normalized;
93
93
  }
94
94
 
95
- export function managedWorkspaceDependencyBootstrap(repoRoot: string): ManagedWorkspaceDependencyBootstrap | undefined {
96
- if (!existsSync(join(repoRoot, 'package.json')) || existsSync(join(repoRoot, 'node_modules'))) return undefined;
95
+ function detectManagedWorkspaceDependencyBootstrap(repoRoot: string): ManagedWorkspaceDependencyBootstrap | undefined {
96
+ if (!existsSync(join(repoRoot, 'package.json'))) return undefined;
97
97
  const lockCandidates = [
98
98
  ['bun', 'bun.lock', ['bun', 'install', '--frozen-lockfile']],
99
99
  ['bun', 'bun.lockb', ['bun', 'install', '--frozen-lockfile']],
@@ -106,6 +106,11 @@ export function managedWorkspaceDependencyBootstrap(repoRoot: string): ManagedWo
106
106
  return { packageManager: detected[0], lockfile: detected[1], command: [...detected[2]] };
107
107
  }
108
108
 
109
+ export function managedWorkspaceDependencyBootstrap(repoRoot: string): ManagedWorkspaceDependencyBootstrap | undefined {
110
+ if (existsSync(join(repoRoot, 'node_modules'))) return undefined;
111
+ return detectManagedWorkspaceDependencyBootstrap(repoRoot);
112
+ }
113
+
109
114
  const DEPENDENCY_REUSE_CONFIG_PATHS = [
110
115
  '.npmrc',
111
116
  'bunfig.toml',
@@ -151,7 +156,7 @@ export function resolveManagedWorkspaceCanonicalDependencies(repoRoot: string):
151
156
  canonicalRoot: string;
152
157
  nodeModulesRoot: string;
153
158
  } | undefined {
154
- const bootstrap = managedWorkspaceDependencyBootstrap(repoRoot);
159
+ const bootstrap = detectManagedWorkspaceDependencyBootstrap(repoRoot);
155
160
  if (!bootstrap) return undefined;
156
161
  const canonicalRoot = linkedWorkspaceCanonicalRoot(repoRoot);
157
162
  if (!canonicalRoot) return undefined;
@@ -162,6 +167,51 @@ export function resolveManagedWorkspaceCanonicalDependencies(repoRoot: string):
162
167
  return { canonicalRoot, nodeModulesRoot: realpathSync(nodeModulesRoot) };
163
168
  }
164
169
 
170
+ /**
171
+ * Replace a legacy physical dependency copy with the already-authoritative
172
+ * canonical dependency tree. The caller must hold repository maintenance
173
+ * ownership and prove there is no active workspace lease before invoking this
174
+ * filesystem mutation. A temporary rename gives the operation an exact rollback
175
+ * point; any link/removal failure restores the original physical directory.
176
+ */
177
+ export function migrateManagedWorkspacePhysicalDependenciesToCanonical(
178
+ repoRoot: string,
179
+ ): ManagedWorkspaceDependencyPreparation | undefined {
180
+ const nodeModulesRoot = join(repoRoot, 'node_modules');
181
+ if (!existsSync(nodeModulesRoot)) return undefined;
182
+ const stats = lstatSync(nodeModulesRoot);
183
+ if (stats.isSymbolicLink()) return undefined;
184
+ if (!stats.isDirectory()) throw new Error(`MANAGED_WORKSPACE_DEPENDENCY_PATH_INVALID: ${nodeModulesRoot}`);
185
+ const reusable = resolveManagedWorkspaceCanonicalDependencies(repoRoot);
186
+ if (!reusable) return undefined;
187
+
188
+ const backupRoot = join(repoRoot, `.forge-node-modules-migration-${process.pid}-${randomUUID().slice(0, 8)}`);
189
+ renameSync(nodeModulesRoot, backupRoot);
190
+ try {
191
+ symlinkSync(reusable.nodeModulesRoot, nodeModulesRoot, process.platform === 'win32' ? 'junction' : 'dir');
192
+ rmSync(backupRoot, { recursive: true, force: true });
193
+ } catch (error) {
194
+ let rollbackError: unknown;
195
+ try {
196
+ if (existsSync(nodeModulesRoot)) rmSync(nodeModulesRoot, { recursive: true, force: true });
197
+ if (existsSync(backupRoot)) renameSync(backupRoot, nodeModulesRoot);
198
+ } catch (rollback) {
199
+ rollbackError = rollback;
200
+ }
201
+ const detail = error instanceof Error ? error.message : String(error);
202
+ if (rollbackError) {
203
+ const rollbackDetail = rollbackError instanceof Error ? rollbackError.message : String(rollbackError);
204
+ throw new Error(`MANAGED_WORKSPACE_DEPENDENCY_MIGRATION_ROLLBACK_FAILED: ${detail}; rollback=${rollbackDetail}`);
205
+ }
206
+ throw new Error(`MANAGED_WORKSPACE_DEPENDENCY_MIGRATION_FAILED: ${detail}`);
207
+ }
208
+ return {
209
+ mode: 'canonical_reuse',
210
+ nodeModulesRoot: realpathSync(nodeModulesRoot),
211
+ canonicalRoot: reusable.canonicalRoot,
212
+ };
213
+ }
214
+
165
215
  function packageManifestRequiresDependencyMaterialization(repoRoot: string): boolean {
166
216
  const packagePath = join(repoRoot, 'package.json');
167
217
  if (!existsSync(packagePath)) return false;
@@ -1,26 +1,40 @@
1
1
  import { resolve } from 'path';
2
2
 
3
3
  /**
4
- * Private child mode used only by the immutable release execution canary.
4
+ * Private child mode used only by immutable Runtime execution canaries.
5
5
  *
6
6
  * The canary must not use the parent process' process.execPath: inside a
7
7
  * compiled immutable Forge release that path is the packaged Runtime executable,
8
8
  * so spawning it would start a second Supervisor and collide on its control
9
- * port. Reusing the candidate Process Runner with an explicit no-op child mode
10
- * keeps the probe self-contained and portable.
9
+ * port. Reusing the candidate Process/Check Runner with an explicit no-op child
10
+ * mode keeps the probe self-contained and portable.
11
11
  */
12
- export const PROCESS_RUNNER_RELEASE_CANARY_CHILD_ARG = '--forge-release-canary-child';
12
+ export const PROCESS_RUNTIME_RELEASE_CANARY_ARG = '--forge-release-canary-child';
13
+ /** Compatibility name retained for the Process Runner entrypoint and existing callers. */
14
+ export const PROCESS_RUNNER_RELEASE_CANARY_CHILD_ARG = PROCESS_RUNTIME_RELEASE_CANARY_ARG;
13
15
 
14
16
  export interface ProcessRunnerReleaseCanaryChildCommand {
15
17
  executable: string;
16
18
  args: string[];
17
19
  }
18
20
 
21
+ export interface ProcessRuntimeReleaseCanaryCommand extends ProcessRunnerReleaseCanaryChildCommand {
22
+ name: 'process_runner' | 'check_runner';
23
+ }
24
+
19
25
  export function processRunnerReleaseCanaryChildCommand(
20
26
  runnerPath: string,
21
27
  ): ProcessRunnerReleaseCanaryChildCommand {
22
28
  return {
23
29
  executable: resolve(runnerPath),
24
- args: [PROCESS_RUNNER_RELEASE_CANARY_CHILD_ARG],
30
+ args: [PROCESS_RUNTIME_RELEASE_CANARY_ARG],
25
31
  };
26
32
  }
33
+
34
+ export function processRuntimeReleaseCanaryCommands(releaseRoot: string): ProcessRuntimeReleaseCanaryCommand[] {
35
+ const root = resolve(releaseRoot);
36
+ return [
37
+ { name: 'process_runner', executable: resolve(root, 'process-runner.js'), args: [PROCESS_RUNTIME_RELEASE_CANARY_ARG] },
38
+ { name: 'check_runner', executable: resolve(root, 'forge-check-runner'), args: [PROCESS_RUNTIME_RELEASE_CANARY_ARG] },
39
+ ];
40
+ }
@@ -0,0 +1,48 @@
1
+ import {
2
+ controllerCheckSelection,
3
+ type ControllerCheck,
4
+ } from '../../../cli/controller/check-runner';
5
+
6
+ export type ControllerCheckExecutionClass = 'ordinary' | 'release' | 'live_controller_home';
7
+
8
+ export interface ControllerCheckExecutionClassification {
9
+ executionClass: ControllerCheckExecutionClass;
10
+ requiresDurableWorkflow: boolean;
11
+ reason: 'ordinary_process_check' | 'release_phase' | 'live_controller_home';
12
+ }
13
+
14
+ /**
15
+ * Single semantic authority for Check execution placement.
16
+ *
17
+ * A caller must supply a registered ControllerCheck. Human-readable ids and
18
+ * descriptions are not lifecycle authority here. Compatibility inference, when
19
+ * unavoidable at repository ingress, must already have been normalized into
20
+ * the ControllerCheck contract before classification reaches this layer.
21
+ */
22
+ export function classifyControllerCheckExecution(check: ControllerCheck): ControllerCheckExecutionClassification {
23
+ if (check.executionAuthority === 'live_controller_home') {
24
+ return {
25
+ executionClass: 'live_controller_home',
26
+ requiresDurableWorkflow: true,
27
+ reason: 'live_controller_home',
28
+ };
29
+ }
30
+
31
+ if (controllerCheckSelection(check).phases.includes('release')) {
32
+ return {
33
+ executionClass: 'release',
34
+ requiresDurableWorkflow: true,
35
+ reason: 'release_phase',
36
+ };
37
+ }
38
+
39
+ return {
40
+ executionClass: 'ordinary',
41
+ requiresDurableWorkflow: false,
42
+ reason: 'ordinary_process_check',
43
+ };
44
+ }
45
+
46
+ export function registeredCheckRequiresDurableWorkflow(check?: ControllerCheck): boolean {
47
+ return check ? classifyControllerCheckExecution(check).requiresDurableWorkflow : false;
48
+ }
@@ -8,6 +8,7 @@
8
8
  */
9
9
 
10
10
  import {
11
+ controllerCheckEnvironmentFingerprint,
11
12
  controllerCheckExecutionIdentity,
12
13
  listControllerChecks,
13
14
  snapshotControllerCheck,
@@ -15,6 +16,7 @@ import {
15
16
  type ControllerCheckSnapshot,
16
17
  } from '../../../cli/controller/check-runner';
17
18
  import { claimsForCheck, scopeResourceClaims, toProcessClaims } from './resource-claims';
19
+ import { resolveCheckCompletionGraceWaitMs } from '../../control-plane/persistence/operational-prior-store';
18
20
  import { spawnManagedProcess, waitForProcess, getProcessHandle } from './runtime';
19
21
  import {
20
22
  getLightweightProcessHandle,
@@ -26,6 +28,7 @@ import type { ProcessHandle } from './types';
26
28
  import { DEFAULT_INTERACTIVE_WAIT_MS } from './types';
27
29
  import { durationAwareInteractiveWaitMs } from './interactive-admission';
28
30
  import type { ResolvedExecutionIdentity } from '../../control-plane/execution/execution-identity';
31
+ import { registeredCheckRequiresDurableWorkflow } from './check-classification';
29
32
 
30
33
  export type CheckExecutionMode = 'direct' | 'managed' | 'durable';
31
34
 
@@ -99,15 +102,17 @@ export interface RunCheckFacadeResult {
99
102
  };
100
103
  }
101
104
 
102
- const DURABLE_CHECK_ID = /(?:^|:)(?:release|migration|integrate|public-export|deploy)(?:$|:)/i;
103
105
  /**
104
- * True when a check requires external Controller handling (multi-phase / release).
105
- * Ordinary typecheck / lint / package test / focused validation stay on Process Runtime.
106
+ * Compatibility entry point while older internal callers still pass
107
+ * (checkId, registeredCheck). The id is deliberately ignored: lifecycle
108
+ * authority comes only from the registered ControllerCheck contract.
106
109
  */
107
- export function checkRequiresDurableWorkflow(checkId: string, check?: ControllerCheck): boolean {
108
- if (DURABLE_CHECK_ID.test(checkId)) return true;
109
- if (check && /release|rollback|blue.?green|migrate/i.test(check.description)) return true;
110
- return false;
110
+ export function checkRequiresDurableWorkflow(
111
+ checkOrLegacyId: ControllerCheck | string | undefined,
112
+ registeredCheck?: ControllerCheck,
113
+ ): boolean {
114
+ const check = typeof checkOrLegacyId === 'string' ? registeredCheck : checkOrLegacyId;
115
+ return registeredCheckRequiresDurableWorkflow(check);
111
116
  }
112
117
 
113
118
  function resolveCheck(repoRoot: string, checkId: string): ControllerCheck | undefined {
@@ -141,7 +146,7 @@ export async function runCheckViaProcessRuntime(
141
146
  };
142
147
  }
143
148
 
144
- if (input.forceDurable || checkRequiresDurableWorkflow(input.checkId, check)) {
149
+ if (input.forceDurable || checkRequiresDurableWorkflow(check)) {
145
150
  return {
146
151
  mode: 'durable',
147
152
  checkId: input.checkId,
@@ -157,9 +162,17 @@ export async function runCheckViaProcessRuntime(
157
162
  // The wait budget is an interaction preference, not a persistence reason.
158
163
  // Ordinary checks stay in memory; only a real durable evidence consumer may
159
164
  // allocate Process/Lease state.
165
+ const learnedCompletionGraceMs = input.interactiveWaitMs === undefined
166
+ ? resolveCheckCompletionGraceWaitMs({
167
+ controllerHome: input.controllerHome,
168
+ repoId: input.repoId,
169
+ checkId: input.checkId,
170
+ environmentFingerprint: controllerCheckEnvironmentFingerprint(check),
171
+ })
172
+ : undefined;
160
173
  const interactiveWaitMs = durationAwareInteractiveWaitMs(
161
174
  check.command,
162
- input.interactiveWaitMs,
175
+ input.interactiveWaitMs ?? learnedCompletionGraceMs,
163
176
  Math.min(250, DEFAULT_INTERACTIVE_WAIT_MS),
164
177
  );
165
178
  const timeoutMs = Math.min(
@@ -218,6 +231,7 @@ export async function runCheckViaProcessRuntime(
218
231
  executionIdentity.repositoryId,
219
232
  executionIdentity.checkoutId,
220
233
  check.effects,
234
+ check.executionAuthority,
221
235
  ),
222
236
  executionIdentity.repositoryId,
223
237
  executionIdentity.checkoutId,
@@ -43,7 +43,7 @@ function artifactSlug(id: string): string {
43
43
  }
44
44
 
45
45
  export function processCheckArtifactPath(checkId: string): string {
46
- return `.ai/harness/checks/controller/latest-${artifactSlug(checkId)}.json`;
46
+ return `controller-home://checks/controller/latest-${artifactSlug(checkId)}.json`;
47
47
  }
48
48
 
49
49
  function receiptStatus(status: ProcessRuntimeStatus): ProcessCheckReceiptStatus {