@moretea-labs/forge 1.7.2 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (900) hide show
  1. package/AGENTS.md +121 -62
  2. package/CHANGELOG.md +40 -0
  3. package/CLAUDE.md +57 -62
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.md +2 -2
  6. package/SKILL.md +0 -1
  7. package/THIRD_PARTY_NOTICES.md +5 -2
  8. package/adapters/browser/index.ts +2 -0
  9. package/adapters/chatgpt/browser-delivery-host.ts +77 -0
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +1256 -0
  11. package/adapters/chatgpt/controller-binding-store.ts +134 -0
  12. package/adapters/chatgpt/controller-round-host.ts +68 -0
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +99 -0
  14. package/adapters/chatgpt/provider-delivery.ts +340 -0
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +218 -0
  16. package/adapters/chatgpt/wsl-bridge-delivery-host.ts +63 -0
  17. package/adapters/computer/chatgpt-extension-target.ts +463 -0
  18. package/adapters/computer/chatgpt-target-router.ts +103 -0
  19. package/adapters/computer/chrome-extension/background.js +385 -0
  20. package/adapters/computer/chrome-extension/content.js +378 -0
  21. package/adapters/computer/chrome-extension/core.js +24 -0
  22. package/adapters/computer/chrome-extension/manifest.json +30 -0
  23. package/adapters/computer/desktop-operator-contract.ts +7 -0
  24. package/adapters/computer/desktop-operator-discovery.ts +181 -0
  25. package/adapters/computer/desktop-operator-negotiation.ts +174 -0
  26. package/adapters/computer/desktop-operator-provider.ts +312 -0
  27. package/adapters/computer/index.ts +1 -0
  28. package/adapters/computer/interaction-target-authority.ts +1068 -0
  29. package/adapters/controller-process/binding-store.ts +34 -0
  30. package/adapters/controller-process/controller-host.ts +26 -0
  31. package/adapters/mcp/access-mode.ts +132 -0
  32. package/adapters/mcp/audit.ts +32 -0
  33. package/adapters/mcp/auth.ts +406 -0
  34. package/adapters/mcp/instructions.ts +37 -0
  35. package/adapters/mcp/legacy-context.ts +18 -0
  36. package/adapters/mcp/multi-repository.ts +421 -0
  37. package/adapters/mcp/oauth.ts +464 -0
  38. package/adapters/mcp/paths.ts +143 -0
  39. package/adapters/mcp/policy.ts +232 -0
  40. package/adapters/mcp/proxy-env.ts +62 -0
  41. package/adapters/mcp/readiness-projection.ts +24 -0
  42. package/adapters/mcp/redaction.ts +21 -0
  43. package/adapters/mcp/repo.ts +24 -0
  44. package/adapters/mcp/runtime-gateway/artifact-adapter.ts +52 -0
  45. package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +87 -0
  46. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  47. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  48. package/adapters/mcp/runtime-gateway/context-adapter.ts +1167 -0
  49. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -0
  50. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +206 -0
  51. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  52. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +130 -0
  53. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  54. package/adapters/mcp/runtime-gateway/execution-control-adapter.ts +28 -0
  55. package/adapters/mcp/runtime-gateway/execution-tools.ts +173 -0
  56. package/adapters/mcp/runtime-gateway/filesystem-adapter.ts +38 -0
  57. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +412 -0
  58. package/adapters/mcp/runtime-gateway/legacy-ios-tool-adapter.ts +105 -0
  59. package/adapters/mcp/runtime-gateway/maintenance-adapter.ts +44 -0
  60. package/adapters/mcp/runtime-gateway/model-adapter.ts +63 -0
  61. package/adapters/mcp/runtime-gateway/persisted-check-process.ts +3 -0
  62. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +380 -0
  63. package/adapters/mcp/runtime-gateway/process-tools.ts +457 -0
  64. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +88 -0
  65. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +285 -0
  66. package/adapters/mcp/runtime-gateway/recovery-client-adapter.ts +70 -0
  67. package/adapters/mcp/runtime-gateway/recovery-tool-contract.ts +99 -0
  68. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +79 -0
  69. package/adapters/mcp/runtime-gateway/result-adapter.ts +114 -0
  70. package/adapters/mcp/runtime-gateway/router.ts +242 -0
  71. package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
  72. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1200 -0
  73. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  74. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +574 -0
  75. package/adapters/mcp/runtime-gateway/runtime-tool-shared.ts +27 -0
  76. package/adapters/mcp/runtime-gateway/runtime-tools.ts +78 -0
  77. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +187 -0
  78. package/adapters/mcp/runtime-gateway/shared-adapter.ts +45 -0
  79. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +962 -0
  80. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
  81. package/adapters/mcp/runtime-gateway/work-adapter.ts +325 -0
  82. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  83. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  84. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +246 -0
  85. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  86. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  87. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  88. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  89. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  90. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +263 -0
  91. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +1 -0
  92. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  93. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
  94. package/adapters/mcp/server.ts +1092 -0
  95. package/adapters/mcp/setup.ts +789 -0
  96. package/adapters/mcp/tool-capability-cache.ts +87 -0
  97. package/adapters/mcp/tool-mapping/access-tools.ts +387 -0
  98. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +5139 -0
  99. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +145 -0
  100. package/adapters/mcp/tool-mapping/repository-tools.ts +1682 -0
  101. package/adapters/mcp/tool-mapping/tools.ts +9 -0
  102. package/adapters/mcp/tool-mapping/umbrella-tools.ts +117 -0
  103. package/adapters/mcp/toolset-names.ts +79 -0
  104. package/adapters/mcp/toolset-selection.ts +41 -0
  105. package/adapters/mcp/toolset.ts +337 -0
  106. package/adapters/mcp/transports/http-observation.ts +365 -0
  107. package/adapters/mcp/transports/http.ts +933 -0
  108. package/adapters/mcp/transports/oauth-http.ts +322 -0
  109. package/adapters/mcp/transports/session-registry.ts +519 -0
  110. package/adapters/mcp/transports/stdio.ts +8 -0
  111. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +223 -0
  112. package/adapters/mcp/types.ts +41 -0
  113. package/assets/AGENTS.md +2 -16
  114. package/assets/CLAUDE.md +2 -16
  115. package/assets/hooks/AGENTS.md +3 -14
  116. package/assets/hooks/CLAUDE.md +3 -14
  117. package/assets/hooks/hook-input.sh +9 -2
  118. package/assets/hooks/lib/workflow-state.sh +28 -10
  119. package/assets/hooks/prompt-guard.sh +63 -37
  120. package/assets/hooks/security-sentinel.sh +2 -1
  121. package/assets/hooks/session-start-context.sh +7 -5
  122. package/assets/hooks/stop-orchestrator.sh +13 -3
  123. package/assets/initializer-question-pack.v4.json +11 -7
  124. package/assets/partials/05-workflow.partial.md +18 -73
  125. package/assets/partials/07-footer.partial.md +1 -1
  126. package/assets/partials-agents/02-operating-mode.partial.md +1 -2
  127. package/assets/partials-agents/04-task-protocol.partial.md +14 -59
  128. package/assets/partials-agents/06-quality-safety.partial.md +11 -16
  129. package/assets/partials-agents/08-deep-docs.partial.md +1 -2
  130. package/assets/plan-map.json +11 -11
  131. package/assets/plugin-registry.v1.json +11 -3
  132. package/assets/plugin-trust-policy.v1.json +6 -0
  133. package/assets/recovery/ForgeRecovery.ps1 +100 -0
  134. package/assets/recovery/forge-wsl-rescue +271 -0
  135. package/assets/reference-configs/agentic-development-flow.md +25 -0
  136. package/assets/reference-configs/development-protocol.md +11 -15
  137. package/assets/reference-configs/document-generation.md +1 -1
  138. package/assets/reference-configs/global-working-rules.md +28 -1
  139. package/assets/reference-configs/harness-overview.md +22 -112
  140. package/assets/reference-configs/hook-operations.md +1 -1
  141. package/assets/reference-configs/sprint-contracts.md +2 -2
  142. package/assets/skill-version.json +2 -2
  143. package/assets/templates/helpers/architecture-event.ts +3 -34
  144. package/assets/templates/helpers/architecture-queue.sh +61 -10
  145. package/assets/templates/helpers/archive-workflow.sh +90 -180
  146. package/assets/templates/helpers/capability-config.ts +8 -11
  147. package/assets/templates/helpers/capability-resolver.ts +37 -19
  148. package/assets/templates/helpers/capture-plan.sh +2 -2
  149. package/assets/templates/helpers/check-architecture-sync.sh +1 -9
  150. package/assets/templates/helpers/check-task-sync.sh +82 -11
  151. package/assets/templates/helpers/check-task-workflow.sh +1 -3
  152. package/assets/templates/helpers/context-contract-sync.sh +1 -12
  153. package/assets/templates/helpers/contract-worktree.sh +26 -24
  154. package/assets/templates/helpers/ensure-task-workflow.sh +6 -8
  155. package/assets/templates/helpers/inspect-project-state.ts +1 -1
  156. package/assets/templates/helpers/migrate-project-template.sh +1 -1
  157. package/assets/templates/helpers/migrate-workflow-docs.ts +53 -239
  158. package/assets/templates/helpers/new-plan.sh +2 -2
  159. package/assets/templates/helpers/plan-to-todo.sh +3 -31
  160. package/assets/templates/helpers/sprint-backlog.sh +1 -1
  161. package/assets/templates/helpers/switch-plan.sh +1 -1
  162. package/assets/templates/helpers/workflow-contract.ts +1 -0
  163. package/assets/workflow-contract.v1.json +63 -171
  164. package/assets/workflows/xiaohongshu/xiaohongshu.collect-metrics.v1.draft.json +118 -0
  165. package/assets/workflows/xiaohongshu/xiaohongshu.publish-image-note.v1.draft.json +316 -0
  166. package/assets/workflows/xiaohongshu/xiaohongshu.publish-long-text.v1.draft.json +324 -0
  167. package/docs/architecture/CURRENT.md +233 -28
  168. package/docs/architecture/EVOLUTION.md +13 -0
  169. package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +2 -1
  170. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  171. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  172. package/docs/architecture/decisions/20260831-independent-windows-wsl-host-rescue.md +59 -0
  173. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +120 -0
  174. package/docs/architecture/decisions/20260904-repository-runtime-data-boundary.md +42 -0
  175. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +37 -0
  176. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +311 -0
  177. package/docs/architecture/decisions/20260907-maintenance-diagnosis-bounded-read.md +39 -0
  178. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  179. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  180. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +221 -0
  181. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  182. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +72 -0
  183. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +237 -0
  184. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  185. package/docs/architecture/domains/verification.md +8 -0
  186. package/docs/architecture/domains/workflow-engine.md +7 -1
  187. package/docs/architecture/index.md +3 -3
  188. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +19 -8
  189. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +124 -0
  190. package/docs/forge-chatgpt-mcp-setup.md +5 -3
  191. package/docs/forge-plugin-management.md +20 -4
  192. package/docs/forge-runtime-self-healing-loop.md +2 -0
  193. package/docs/operations/benchmark-cross-version-freeze.md +38 -0
  194. package/docs/operations/controller-browser-plugin.md +3 -1
  195. package/docs/operations/controller-performance-and-502.md +17 -0
  196. package/docs/operations/controller-reliability-runbook.md +2 -2
  197. package/docs/operations/features.md +1 -1
  198. package/docs/operations/features.zh-CN.md +1 -1
  199. package/docs/operations/homebrew.md +2 -2
  200. package/docs/operations/mcp-tool-exposure.md +2 -0
  201. package/docs/operations/platform-support.md +16 -8
  202. package/docs/operations/platform-support.zh-CN.md +2 -2
  203. package/docs/operations/releasing.md +2 -0
  204. package/docs/operations/standalone-disaster-recovery.md +38 -5
  205. package/docs/operations/uu-remote-rescue.md +41 -0
  206. package/docs/operations/windows-wsl-host-rescue.md +133 -0
  207. package/docs/public-usage-guide.md +1 -1
  208. package/docs/public-usage-guide.zh-CN.md +1 -1
  209. package/docs/tutorials/01-install-and-start.md +1 -1
  210. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  211. package/docs/tutorials/02-connect-chatgpt.md +4 -4
  212. package/docs/tutorials/02-connect-chatgpt.zh-CN.md +4 -4
  213. package/docs/wiki/Implementation.md +1 -1
  214. package/package.json +46 -26
  215. package/packages/kernel/cognition/api/index.ts +6 -0
  216. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  217. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  218. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  219. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  220. package/packages/kernel/cognition/domain/learning.ts +106 -0
  221. package/packages/kernel/cognition/domain/memory.ts +254 -0
  222. package/packages/kernel/controller/api/index.ts +3 -0
  223. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  224. package/packages/kernel/controller/application/controller-round-service.ts +41 -0
  225. package/packages/kernel/controller/application/controller-service.ts +30 -0
  226. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +529 -0
  227. package/packages/kernel/controller/domain/controller-round.ts +110 -0
  228. package/packages/kernel/controller/domain/execution-quality.ts +135 -0
  229. package/packages/kernel/controller/domain/types.ts +56 -0
  230. package/packages/kernel/controller/index.ts +1 -0
  231. package/packages/kernel/controller/infrastructure/controller-binding-store.ts +84 -0
  232. package/packages/kernel/controller/infrastructure/controller-round-store.ts +1970 -0
  233. package/packages/kernel/controller/infrastructure/controller-session-store.ts +804 -0
  234. package/packages/kernel/controller/ports/controller-host.ts +18 -0
  235. package/packages/kernel/goal/api/index.ts +1 -0
  236. package/packages/kernel/goal/domain/types.ts +40 -0
  237. package/packages/kernel/goal/index.ts +1 -0
  238. package/packages/kernel/identity/api/index.ts +15 -0
  239. package/packages/kernel/identity/application/identity-service.ts +67 -0
  240. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  241. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  242. package/packages/kernel/identity/domain/grant.ts +72 -0
  243. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  244. package/packages/kernel/identity/domain/scope.ts +63 -0
  245. package/packages/kernel/identity/domain/semantic-sync.ts +81 -0
  246. package/packages/kernel/identity/domain/types.ts +44 -0
  247. package/packages/kernel/identity/domain/user-request.ts +93 -0
  248. package/packages/kernel/identity/domain/workspace.ts +56 -0
  249. package/packages/kernel/identity/index.ts +1 -0
  250. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +77 -0
  251. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  252. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  253. package/packages/kernel/identity/infrastructure/identity-store.ts +75 -0
  254. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  255. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  256. package/packages/kernel/memory/api/index.ts +5 -0
  257. package/packages/kernel/memory/application/experience-service.ts +118 -0
  258. package/packages/kernel/memory/application/outcome-service.ts +77 -0
  259. package/packages/kernel/memory/domain/experience.ts +103 -0
  260. package/packages/kernel/memory/domain/operational-prior.ts +92 -0
  261. package/packages/kernel/memory/index.ts +1 -0
  262. package/packages/kernel/scheduler/api/index.ts +4 -0
  263. package/packages/kernel/scheduler/application/eligibility.ts +252 -0
  264. package/packages/kernel/scheduler/application/schedule-service.ts +27 -0
  265. package/packages/kernel/scheduler/application/settlement.ts +182 -0
  266. package/packages/kernel/scheduler/domain/schedule.ts +236 -0
  267. package/packages/kernel/scheduler/index.ts +1 -0
  268. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +805 -0
  269. package/packages/kernel/work/api/index.ts +16 -0
  270. package/packages/kernel/work/application/work-service.ts +123 -0
  271. package/packages/kernel/work/domain/check-receipt.ts +43 -0
  272. package/packages/kernel/work/domain/context-closure-receipt.ts +32 -0
  273. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  274. package/packages/kernel/work/domain/engineering-contracts.ts +157 -0
  275. package/packages/kernel/work/domain/engineering-design.ts +286 -0
  276. package/packages/kernel/work/domain/engineering-profile.ts +238 -0
  277. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  278. package/packages/kernel/work/domain/execution-concurrency.ts +247 -0
  279. package/packages/kernel/work/domain/execution-snapshot.ts +2 -0
  280. package/packages/kernel/work/domain/implementation-review.ts +193 -0
  281. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  282. package/packages/kernel/work/domain/project-engineering-contract.ts +224 -0
  283. package/packages/kernel/work/domain/repository-completion-receipt.ts +73 -0
  284. package/{src/runtime/control-plane/facade/work-state-machine.ts → packages/kernel/work/domain/state-machine.ts} +37 -66
  285. package/packages/kernel/work/domain/types.ts +534 -0
  286. package/packages/kernel/work/index.ts +1 -0
  287. package/packages/kernel/work/infrastructure/work-contract-store.ts +1967 -0
  288. package/packages/kernel/work/ports/work-contract-store.ts +21 -0
  289. package/packages/plugin-runtime/browser/index.ts +3 -0
  290. package/packages/plugin-runtime/browser/provider-registry.ts +110 -0
  291. package/packages/plugin-runtime/browser/runtime-contract.ts +150 -0
  292. package/packages/plugin-runtime/browser/session-authority.ts +62 -0
  293. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  294. package/packages/plugin-runtime/computer/conversation-target.ts +143 -0
  295. package/packages/plugin-runtime/computer/index.ts +8 -0
  296. package/packages/plugin-runtime/computer/provider-error.ts +26 -0
  297. package/packages/plugin-runtime/computer/provider-registration.ts +52 -0
  298. package/packages/plugin-runtime/computer/provider-registry.ts +63 -0
  299. package/packages/plugin-runtime/computer/provider.ts +19 -0
  300. package/packages/plugin-runtime/computer/target-authority.ts +215 -0
  301. package/packages/plugin-runtime/computer/target-persistence.ts +54 -0
  302. package/packages/plugin-runtime/external/index.ts +1 -0
  303. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +581 -0
  304. package/packages/plugin-runtime/index.ts +3 -0
  305. package/packages/protocols/browser/index.ts +1 -0
  306. package/packages/protocols/browser/session.ts +98 -0
  307. package/packages/protocols/computer/contract.ts +225 -0
  308. package/packages/protocols/computer/index.ts +1 -0
  309. package/packages/protocols/failure/contract.ts +158 -0
  310. package/packages/protocols/failure/index.ts +1 -0
  311. package/packages/protocols/handoff/index.ts +1 -0
  312. package/packages/protocols/handoff/status.ts +22 -0
  313. package/packages/protocols/mcp/execution-context.ts +11 -0
  314. package/packages/protocols/mcp/index.ts +2 -0
  315. package/packages/protocols/mcp/tool-contract.ts +42 -0
  316. package/packages/workflow-runtime/api/index.ts +2 -0
  317. package/packages/workflow-runtime/application/interpreter.ts +342 -0
  318. package/packages/workflow-runtime/domain/workflow-asset.ts +223 -0
  319. package/packages/workflow-runtime/index.ts +1 -0
  320. package/scripts/activate-source-baseline.ts +7 -9
  321. package/scripts/assemble-template.ts +1 -1
  322. package/scripts/bootstrap-runtime-maintenance-recovery.sh +4 -1
  323. package/scripts/canary-chatgpt-provider-delivery.ts +97 -0
  324. package/scripts/canary-controller-semantic-wait.ts +183 -0
  325. package/scripts/canary-global-hook.sh +2 -2
  326. package/scripts/check-mcp-compatibility.ts +85 -7
  327. package/scripts/check-platform-support.mjs +28 -2
  328. package/scripts/check-public-docs.sh +1 -1
  329. package/scripts/check-repository-hygiene.mjs +92 -0
  330. package/scripts/check-runtime-architecture.mjs +1643 -127
  331. package/scripts/check-source-duplication.mjs +9 -1
  332. package/scripts/controller-ngrok-rotation.sh +5 -4
  333. package/scripts/create-project-dirs.sh +10 -74
  334. package/scripts/forge-local-recovery-helper.mjs +282 -0
  335. package/scripts/forge-uu-remote-rescue-helper.d.mts +31 -0
  336. package/scripts/forge-uu-remote-rescue-helper.mjs +409 -0
  337. package/scripts/forge-windows-host-recovery-helper.mjs +136 -0
  338. package/scripts/hook-shim.sh +2 -2
  339. package/scripts/init-project.sh +12 -70
  340. package/scripts/install-desktop-operator-registration.ts +4 -2
  341. package/scripts/install-independent-windows-wsl-recovery.ts +125 -0
  342. package/scripts/install-standalone-recovery.ts +122 -10
  343. package/scripts/install-uu-remote-rescue-registration.ts +74 -0
  344. package/scripts/install-windows-host-recovery-registration.ts +22 -0
  345. package/scripts/lib/controller-home-env.sh +6 -3
  346. package/scripts/lib/project-init-lib.sh +42 -582
  347. package/scripts/migrate-chatgpt-automation-schedules.ts +2 -2
  348. package/scripts/migrate-windows-wsl-controller-home.ts +306 -0
  349. package/scripts/open-source-audit-allowlist.txt +11 -1
  350. package/scripts/portability-bindings.mjs +70 -0
  351. package/scripts/run-bounded-command.mjs +60 -0
  352. package/scripts/run-bun-test-file.ts +22 -6
  353. package/scripts/run-governed-gate.ts +4 -2
  354. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  355. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  356. package/scripts/smoke-mcp-http-runtime.ts +6 -1
  357. package/scripts/smoke-runtime-recovery.ts +13 -11
  358. package/scripts/smoke-schedule-engine.ts +24 -16
  359. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  360. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  361. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +92 -0
  362. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  363. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  364. package/scripts/smoke-workflow-supervisor.ts +103 -0
  365. package/scripts/test-governance.ts +51 -2
  366. package/scripts/verify-forge-runtime.sh +2 -1
  367. package/src/cli/agent-jobs/executor-health.ts +11 -34
  368. package/src/cli/agent-jobs/integration.ts +18 -49
  369. package/src/cli/agent-jobs/job-manager.ts +17 -4
  370. package/src/cli/chatgpt-browser/bind-server.ts +2 -1
  371. package/src/cli/chatgpt-browser/binding.ts +20 -10
  372. package/src/cli/chatgpt-browser/bridge-extension.ts +75 -0
  373. package/src/cli/chatgpt-browser/bridge-provider.ts +376 -11
  374. package/src/cli/chatgpt-browser/engine.ts +10 -11
  375. package/src/cli/chatgpt-browser/native-provider.ts +24 -83
  376. package/src/cli/chatgpt-browser/oracle-provider.ts +5 -3
  377. package/src/cli/chatgpt-browser/types.ts +1 -0
  378. package/src/cli/commands/bootstrap-control.ts +334 -0
  379. package/src/cli/commands/brain-assistant.ts +52 -0
  380. package/src/cli/commands/brain.ts +191 -40
  381. package/src/cli/commands/chatgpt.ts +32 -67
  382. package/src/cli/commands/computer.ts +437 -0
  383. package/src/cli/commands/doctor.ts +18 -1
  384. package/src/cli/commands/init-hook.ts +71 -61
  385. package/src/cli/commands/init.ts +3 -1
  386. package/src/cli/commands/mcp.ts +16 -10
  387. package/src/cli/commands/plugin.ts +38 -12
  388. package/src/cli/commands/recovery.ts +507 -80
  389. package/src/cli/commands/runtime.ts +12 -7
  390. package/src/cli/commands/setup-profile.ts +97 -39
  391. package/src/cli/commands/status.ts +2 -1
  392. package/src/cli/controller/check-runner.ts +500 -100
  393. package/src/cli/controller/completion-backlog.ts +3 -3
  394. package/src/cli/controller/completion-orchestrator.ts +4 -43
  395. package/src/cli/controller/completion-target.ts +3 -72
  396. package/src/cli/controller/context/source-materializer.ts +81 -100
  397. package/src/cli/controller/context/types.ts +7 -1
  398. package/src/cli/controller/context-pack.ts +28 -6
  399. package/src/cli/controller/execution-completion.ts +4 -7
  400. package/src/cli/controller/execution-policy.ts +36 -153
  401. package/src/cli/controller/governance.ts +2 -3
  402. package/src/cli/controller/issue-store.ts +4 -99
  403. package/src/cli/controller/launch-agents.ts +59 -18
  404. package/src/cli/controller/operational-plan.ts +24 -51
  405. package/src/cli/controller/runtime-config.ts +5 -1
  406. package/src/cli/controller/stuck-state-migration.ts +2 -3
  407. package/src/cli/controller/systemd-user.ts +148 -0
  408. package/src/cli/controller/types.ts +10 -70
  409. package/src/cli/controller/worklog.ts +67 -13
  410. package/src/cli/editing/edit-operation-contract.ts +92 -0
  411. package/src/cli/editing/edit-session.ts +290 -20
  412. package/src/cli/github/plugin.ts +17 -12
  413. package/src/cli/hook/route-registry.ts +3 -5
  414. package/src/cli/hook/runtime.ts +49 -3
  415. package/src/cli/index.ts +3 -0
  416. package/src/cli/local-bridge/connector-freshness.ts +2 -2
  417. package/src/cli/local-bridge/console-automations.ts +20 -15
  418. package/src/cli/local-bridge/console-view-models.ts +3 -12
  419. package/src/cli/local-bridge/facade-api.ts +105 -205
  420. package/src/cli/local-bridge/job-store.ts +1 -1
  421. package/src/cli/local-bridge/server.ts +48 -174
  422. package/src/cli/local-bridge/types.ts +0 -1
  423. package/src/cli/mcp/access-mode.ts +2 -132
  424. package/src/cli/mcp/access-tools.ts +2 -387
  425. package/src/cli/mcp/audit.ts +2 -32
  426. package/src/cli/mcp/auth.ts +2 -404
  427. package/src/cli/mcp/instructions.ts +2 -34
  428. package/src/cli/mcp/legacy-context.ts +2 -16
  429. package/src/cli/mcp/legacy-tool-service.ts +2 -5308
  430. package/src/cli/mcp/multi-repository.ts +2 -436
  431. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  432. package/src/cli/mcp/oauth.ts +2 -375
  433. package/src/cli/mcp/openai-secure-tunnel.ts +2 -0
  434. package/src/cli/mcp/paths.ts +2 -140
  435. package/src/cli/mcp/policy.ts +2 -232
  436. package/src/cli/mcp/post-finalize-work-attribution.ts +2 -150
  437. package/src/cli/mcp/proxy-env.ts +2 -62
  438. package/src/cli/mcp/readiness-projection.ts +2 -24
  439. package/src/cli/mcp/redaction.ts +2 -21
  440. package/src/cli/mcp/repo.ts +2 -24
  441. package/src/cli/mcp/repository-tools.ts +2 -1613
  442. package/src/cli/mcp/server.ts +2 -951
  443. package/src/cli/mcp/setup.ts +2 -737
  444. package/src/cli/mcp/tool-capability-cache.ts +2 -87
  445. package/src/cli/mcp/tool-contract.ts +2 -14
  446. package/src/cli/mcp/tools.ts +2 -9
  447. package/src/cli/mcp/toolset-names.ts +2 -70
  448. package/src/cli/mcp/toolset-selection.ts +2 -41
  449. package/src/cli/mcp/toolset.ts +2 -336
  450. package/src/cli/mcp/transports/AGENTS.md +1 -10
  451. package/src/cli/mcp/transports/CLAUDE.md +1 -10
  452. package/src/cli/mcp/transports/http.ts +2 -1414
  453. package/src/cli/mcp/transports/session-registry.ts +2 -490
  454. package/src/cli/mcp/transports/stdio.ts +2 -8
  455. package/src/cli/mcp/types.ts +2 -41
  456. package/src/cli/mcp/umbrella-tools.ts +2 -117
  457. package/src/cli/repositories/command-executor.ts +91 -39
  458. package/src/cli/repositories/command-scope.ts +139 -4
  459. package/src/cli/repositories/controller-home.ts +167 -1
  460. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  461. package/src/cli/repositories/git-command-executor.ts +2 -2
  462. package/src/cli/repositories/identity.ts +13 -0
  463. package/src/cli/repositories/registry.ts +145 -60
  464. package/src/cli/repositories/repository-snapshot.ts +53 -7
  465. package/src/cli/repositories/runtime-storage.ts +27 -2
  466. package/src/cli/repositories/safe-patch.ts +34 -38
  467. package/src/cli/repositories/selected-path-actions.ts +22 -2
  468. package/src/cli/repositories/structured-git.ts +167 -27
  469. package/src/cli/repository/session-cache.ts +92 -6
  470. package/src/cli/runtime/helper-runner.ts +7 -0
  471. package/src/cli/runtime-invocation.ts +8 -1
  472. package/src/cli/tools/codegraph.ts +44 -25
  473. package/src/core/adoption/manifest-templates.ts +1 -1
  474. package/src/core/adoption/plan.ts +3 -26
  475. package/src/core/adoption/workflow-contract-plan.ts +17 -9
  476. package/src/effects/process-runner.ts +8 -14
  477. package/src/runtime/context/assistant-context.ts +167 -0
  478. package/src/runtime/context/assistant-work-context.ts +209 -0
  479. package/src/runtime/context/automatic-learning.ts +565 -0
  480. package/src/runtime/context/codegraph-cache-boundary.ts +255 -0
  481. package/src/runtime/context/codegraph-read-provider.ts +55 -22
  482. package/src/runtime/context/codegraph-sidecar.cjs +8 -1
  483. package/src/runtime/context/cognitive-attention.ts +173 -0
  484. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  485. package/src/runtime/context/context-closure.ts +305 -0
  486. package/src/runtime/context/context-pack-process.ts +103 -0
  487. package/src/runtime/context/context-plane.ts +203 -0
  488. package/src/runtime/context/direct-controller-learning.ts +298 -0
  489. package/src/runtime/context/project-engineering-contract.ts +60 -0
  490. package/src/runtime/context/semantic-navigation-contract.ts +9 -0
  491. package/src/runtime/context/semantic-navigation.ts +6 -34
  492. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  493. package/src/runtime/context/typescript-navigation.ts +89 -3
  494. package/src/runtime/control-plane/bootstrap/capability-provider.ts +74 -0
  495. package/src/runtime/control-plane/bootstrap/control-api.ts +57 -0
  496. package/src/runtime/control-plane/bootstrap/index.ts +5 -0
  497. package/src/runtime/control-plane/bootstrap/state-machine.ts +141 -0
  498. package/src/runtime/control-plane/bootstrap/store.ts +21 -0
  499. package/src/runtime/control-plane/bootstrap/types.ts +87 -0
  500. package/src/runtime/control-plane/cleanup-artifact-retention.ts +531 -0
  501. package/src/runtime/control-plane/codegraph-cache-retention.ts +164 -0
  502. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +282 -0
  503. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +380 -0
  504. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +113 -16
  505. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  506. package/src/runtime/control-plane/execution/implementation-review-content.ts +95 -0
  507. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  508. package/src/runtime/control-plane/execution/retained-work-resume.ts +439 -102
  509. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  510. package/src/runtime/control-plane/execution/validation.ts +34 -11
  511. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +87 -0
  512. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  513. package/src/runtime/control-plane/execution/work-completion-authority.ts +31 -44
  514. package/src/runtime/control-plane/execution/work-delivery-service.ts +497 -0
  515. package/src/runtime/control-plane/execution/work-evidence-policy.ts +46 -53
  516. package/src/runtime/control-plane/execution/work-execution-support.ts +85 -164
  517. package/src/runtime/control-plane/execution/work-handle-authority.ts +349 -73
  518. package/src/runtime/control-plane/execution/work-handle-store.ts +55 -2
  519. package/src/runtime/control-plane/execution/work-head-settlement.ts +108 -0
  520. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +173 -28
  521. package/src/runtime/control-plane/execution/work-operation-service.ts +92 -40
  522. package/src/runtime/control-plane/execution/work-preparation-service.ts +145 -269
  523. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  524. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  525. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +543 -225
  526. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +59 -45
  527. package/src/runtime/control-plane/execution/work-verification-context.ts +1 -1
  528. package/src/runtime/control-plane/execution/work-verification-service.ts +662 -52
  529. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +205 -16
  530. package/src/runtime/control-plane/facade/capability-registry.ts +380 -44
  531. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  532. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  533. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  534. package/src/runtime/control-plane/facade/controller-session-store.ts +2 -488
  535. package/src/runtime/control-plane/facade/goal-workloop-access.ts +6 -22
  536. package/src/runtime/control-plane/facade/goal-workloop.ts +565 -1202
  537. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +145 -0
  538. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +266 -52
  539. package/src/runtime/control-plane/facade/index.ts +4 -3
  540. package/src/runtime/control-plane/facade/operation-digest.ts +34 -73
  541. package/src/runtime/control-plane/facade/plan-contract-store.ts +671 -245
  542. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  543. package/src/runtime/control-plane/facade/repository-work-admission.ts +31 -23
  544. package/src/runtime/control-plane/facade/requirement-authority.ts +121 -0
  545. package/src/runtime/control-plane/facade/requirement-board.ts +9 -4
  546. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +85 -0
  547. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  548. package/src/runtime/control-plane/facade/semantic-admission.ts +8 -16
  549. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -15
  550. package/src/runtime/control-plane/facade/types.ts +218 -620
  551. package/src/runtime/control-plane/facade/work-continuation.ts +8 -8
  552. package/src/runtime/control-plane/facade/work-contract-store.ts +2 -1043
  553. package/src/runtime/control-plane/generated-cache-retention.ts +336 -19
  554. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  555. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +13 -2
  556. package/src/runtime/control-plane/global-scheduler/maintenance.ts +274 -84
  557. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-entry.ts +55 -0
  558. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-process.ts +98 -0
  559. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -2
  560. package/src/runtime/control-plane/global-scheduler/scheduler-worker-entry.ts +10 -0
  561. package/src/runtime/control-plane/global-scheduler/scheduler.ts +227 -109
  562. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  563. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +18 -6
  564. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  565. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  566. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +160 -0
  567. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +2 -177
  568. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +139 -670
  569. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  570. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +25 -6
  571. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -194
  572. package/src/runtime/control-plane/lifecycle-retention-metrics.ts +60 -0
  573. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  574. package/src/runtime/control-plane/persistence/experience-store.ts +302 -0
  575. package/src/runtime/control-plane/persistence/operational-prior-store.ts +348 -0
  576. package/src/runtime/control-plane/persistence/requirement-store.ts +230 -80
  577. package/src/runtime/control-plane/persistence/sqlite-store.ts +654 -78
  578. package/src/runtime/control-plane/persistence/workflow-content-store.ts +98 -0
  579. package/src/runtime/control-plane/persistence/workflow-registry-store.ts +186 -0
  580. package/src/runtime/control-plane/persistence/workflow-run-store.ts +123 -0
  581. package/src/runtime/control-plane/release-retention.ts +154 -26
  582. package/src/runtime/control-plane/repository-namespace-retention.ts +208 -0
  583. package/src/runtime/control-plane/runtime-cleanup.ts +844 -38
  584. package/src/runtime/control-plane/runtime-generation.ts +6 -0
  585. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  586. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +479 -0
  587. package/src/runtime/control-plane/workspace/workspace-store.ts +249 -0
  588. package/src/runtime/diagnostics/incident-repair.ts +573 -0
  589. package/src/runtime/diagnostics/mcp-timing.ts +239 -6
  590. package/src/runtime/diagnostics/performance.ts +6 -14
  591. package/src/runtime/diagnostics/read-only-tool.ts +1 -1
  592. package/src/runtime/evidence/artifact-store.ts +216 -35
  593. package/src/runtime/evidence/evidence-store.ts +112 -8
  594. package/src/runtime/evidence/operational-shadow.ts +38 -0
  595. package/src/runtime/evidence/output-handle-index.ts +225 -0
  596. package/src/runtime/evidence/process-check-receipt.ts +5 -43
  597. package/src/runtime/evidence/result-store.ts +158 -44
  598. package/src/runtime/evidence/sensitive-output.ts +4 -4
  599. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -1
  600. package/src/runtime/execution/jobs/store.ts +124 -6
  601. package/src/runtime/execution/managed-workspace.ts +112 -5
  602. package/src/runtime/execution/process-runtime/canary.ts +19 -5
  603. package/src/runtime/execution/process-runtime/check-classification.ts +48 -0
  604. package/src/runtime/execution/process-runtime/check-facade.ts +24 -10
  605. package/src/runtime/execution/process-runtime/check-receipt.ts +1 -1
  606. package/src/runtime/execution/process-runtime/check-result-retention.ts +132 -0
  607. package/src/runtime/execution/process-runtime/check-result.ts +177 -2
  608. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +58 -9
  609. package/src/runtime/execution/process-runtime/check-storage.ts +187 -0
  610. package/src/runtime/execution/process-runtime/command-facade.ts +117 -114
  611. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  612. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  613. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  614. package/src/runtime/execution/process-runtime/index.ts +4 -0
  615. package/src/runtime/execution/process-runtime/interactive-admission.ts +2 -1
  616. package/src/runtime/execution/process-runtime/lightweight-managed.ts +283 -73
  617. package/src/runtime/execution/process-runtime/persisted-check.ts +130 -23
  618. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  619. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  620. package/src/runtime/execution/process-runtime/resource-claims.ts +125 -64
  621. package/src/runtime/execution/process-runtime/runtime.ts +167 -17
  622. package/src/runtime/execution/process-runtime/store.ts +30 -2
  623. package/src/runtime/execution/process-runtime/types.ts +27 -0
  624. package/src/runtime/execution/workers/executor.ts +18 -19
  625. package/src/runtime/execution/workers/worker-entry.ts +1 -1
  626. package/src/runtime/gateway/mcp/execution-tools.ts +2 -207
  627. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +2 -61
  628. package/src/runtime/gateway/mcp/persisted-check-process.ts +2 -3
  629. package/src/runtime/gateway/mcp/process-tools.ts +2 -289
  630. package/src/runtime/gateway/mcp/router.ts +2 -1125
  631. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +2 -565
  632. package/src/runtime/gateway/mcp/runtime-tools.ts +2 -6655
  633. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +2 -1
  634. package/src/runtime/maintenance/cleanup.ts +38 -24
  635. package/src/runtime/platform/browser-product-discovery.ts +174 -0
  636. package/src/runtime/platform/computer-platform.ts +14 -0
  637. package/src/runtime/platform/executable-discovery.ts +54 -0
  638. package/src/runtime/platform/fetch-http-server.ts +90 -0
  639. package/src/runtime/platform/service-inventory.ts +130 -0
  640. package/src/runtime/platform/service-manager.ts +146 -0
  641. package/src/runtime/platform/windows-host-discovery.ts +118 -0
  642. package/src/runtime/platform/windows-recovery-deployment.ts +67 -0
  643. package/src/runtime/plugins/action-application.ts +192 -0
  644. package/src/runtime/plugins/app-store-connect-adapter.ts +47 -35
  645. package/src/runtime/plugins/browser-adapter.ts +898 -135
  646. package/src/runtime/plugins/browser-automation-service.ts +33 -34
  647. package/src/runtime/plugins/browser-macos-bridge.ts +386 -46
  648. package/src/runtime/plugins/browser-manifest-surface.ts +75 -17
  649. package/src/runtime/plugins/browser-native-session-service.ts +64 -14
  650. package/src/runtime/plugins/browser-provider-registry.ts +2 -109
  651. package/src/runtime/plugins/browser-registration.ts +32 -0
  652. package/src/runtime/plugins/browser-runtime-contract.ts +2 -154
  653. package/src/runtime/plugins/browser-runtime.ts +55 -10
  654. package/src/runtime/plugins/browser-session-authority.ts +101 -291
  655. package/src/runtime/plugins/browser-session-legacy-migration.ts +203 -0
  656. package/src/runtime/plugins/browser-session-store.ts +243 -80
  657. package/src/runtime/plugins/browser-session-types.ts +2 -98
  658. package/src/runtime/plugins/capability-authorization-grants.ts +272 -59
  659. package/src/runtime/plugins/catalog-trust.ts +82 -0
  660. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +219 -0
  661. package/src/runtime/plugins/computer-chatgpt-macos-target.ts +891 -0
  662. package/src/runtime/plugins/computer-registration.ts +1050 -0
  663. package/src/runtime/plugins/config-store.ts +119 -0
  664. package/src/runtime/plugins/desktop-operator-external-policy.ts +964 -0
  665. package/src/runtime/plugins/desktop-operator-registration.ts +123 -12
  666. package/src/runtime/plugins/errors.ts +8 -1
  667. package/src/runtime/plugins/external-adapter.ts +82 -323
  668. package/src/runtime/plugins/external-provider-policy.ts +48 -0
  669. package/src/runtime/plugins/external-registration.ts +30 -2
  670. package/src/runtime/plugins/external-unix-socket-probe.cjs +9 -3
  671. package/src/runtime/plugins/external-unix-socket.ts +64 -193
  672. package/src/runtime/plugins/first-party-external-registration.ts +163 -0
  673. package/src/runtime/plugins/first-party-registry.ts +3 -1
  674. package/src/runtime/plugins/github-adapter.ts +1 -2
  675. package/src/runtime/plugins/gmail-adapter.ts +29 -8
  676. package/src/runtime/plugins/google-calendar-adapter.ts +8 -8
  677. package/src/runtime/plugins/google-shared.ts +45 -53
  678. package/src/runtime/plugins/google-tasks-adapter.ts +8 -8
  679. package/src/runtime/plugins/ios-adapter.ts +2 -3
  680. package/src/runtime/plugins/lightweight-action.ts +208 -2
  681. package/src/runtime/plugins/local-system-adapter.ts +192 -2
  682. package/src/runtime/plugins/macos-capability-broker.ts +15 -105
  683. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  684. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  685. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  686. package/src/runtime/plugins/resend-adapter.ts +15 -24
  687. package/src/runtime/plugins/store.ts +1003 -387
  688. package/src/runtime/plugins/types.ts +28 -1
  689. package/src/runtime/plugins/uu-remote-rescue-registration.ts +155 -0
  690. package/src/runtime/plugins/windows-host-recovery-install.ts +68 -0
  691. package/src/runtime/plugins/windows-host-recovery-registration.ts +85 -0
  692. package/src/runtime/plugins/xiaohongshu-publish.ts +102 -430
  693. package/src/runtime/projections/controller-context.ts +12 -6
  694. package/src/runtime/projections/git-status-sampler.ts +73 -22
  695. package/src/runtime/projections/invalidation.ts +7 -3
  696. package/src/runtime/projections/materialized-view.ts +93 -43
  697. package/src/runtime/recovery/actions.ts +3 -3
  698. package/src/runtime/recovery/capability-action-application.ts +229 -0
  699. package/src/runtime/recovery/index.ts +3 -0
  700. package/src/runtime/recovery/lifecycle-inventory.ts +338 -0
  701. package/src/runtime/recovery/local-jobs-repair.ts +14 -14
  702. package/src/runtime/recovery/maintenance-executor.ts +701 -168
  703. package/src/runtime/recovery/quarantine-retention.ts +256 -0
  704. package/src/runtime/recovery/store.ts +29 -11
  705. package/src/runtime/release/identity.ts +6 -0
  706. package/src/runtime/release/release-coordinator.ts +296 -0
  707. package/src/runtime/release/release-session.ts +716 -0
  708. package/src/runtime/release/release-state-migration.ts +25 -0
  709. package/src/runtime/resources/leases/store.ts +56 -25
  710. package/src/runtime/root/active-execution-power-assertion.ts +139 -0
  711. package/src/runtime/root/assistant-learning-loop.ts +45 -0
  712. package/src/runtime/root/browser-session-composition.ts +59 -0
  713. package/src/runtime/root/computer-composition.ts +376 -0
  714. package/src/runtime/root/computer-target-composition.ts +16 -0
  715. package/src/runtime/root/computer-target-persistence.ts +39 -0
  716. package/src/runtime/root/controller-progression-composition.ts +192 -0
  717. package/src/runtime/root/controller-round-composition.ts +126 -0
  718. package/src/runtime/root/controller-services.ts +2 -0
  719. package/src/runtime/root/deployment-topology.ts +106 -0
  720. package/src/runtime/root/entry.ts +8 -6
  721. package/src/runtime/root/gateway-adapter.ts +3 -3
  722. package/src/runtime/root/known-good-recovery.ts +184 -0
  723. package/src/runtime/root/local-bridge.ts +5 -3
  724. package/src/runtime/root/mcp-transport.ts +116 -23
  725. package/src/runtime/root/ownership.ts +261 -9
  726. package/src/runtime/root/package-connector-service.ts +212 -74
  727. package/src/runtime/root/package-runtime-release.ts +199 -33
  728. package/src/runtime/root/package-runtime-service.ts +77 -108
  729. package/src/runtime/root/release-execution-canary.ts +103 -0
  730. package/src/runtime/root/release-loader.ts +150 -0
  731. package/src/runtime/root/release-manifest.ts +185 -7
  732. package/src/runtime/root/release-materialize.ts +474 -31
  733. package/src/runtime/root/release-store.ts +425 -37
  734. package/src/runtime/root/runtime-lane.ts +191 -0
  735. package/src/runtime/root/runtime.ts +379 -32
  736. package/src/runtime/root/scheduled-controller-composition.ts +76 -0
  737. package/src/runtime/root/scheduler.ts +12 -4
  738. package/src/runtime/root/service-runner.ts +3 -3
  739. package/src/runtime/root/service.ts +73 -45
  740. package/src/runtime/root/status.ts +49 -0
  741. package/src/runtime/root/types.ts +55 -3
  742. package/src/runtime/root/workflow-supervisor-composition.ts +493 -0
  743. package/src/runtime/root/workflow-supervisor-runtime.ts +209 -0
  744. package/src/runtime/root/write-fence.ts +50 -2
  745. package/src/runtime/safe-tooling/google-credential-store.ts +76 -21
  746. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  747. package/src/runtime/safe-tooling/workspace-auth.ts +1 -1
  748. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  749. package/src/runtime/shared/local-bridge-surface.ts +1 -1
  750. package/src/runtime/shared/process-environment.ts +36 -10
  751. package/src/runtime/shared/response-budget.ts +1 -3
  752. package/src/runtime/shared/storage-capacity.ts +68 -0
  753. package/src/runtime/standalone-recovery/controller-home-migration.ts +1108 -0
  754. package/src/runtime/standalone-recovery/core.ts +4609 -495
  755. package/src/runtime/standalone-recovery/entry.ts +642 -81
  756. package/src/runtime/standalone-recovery/independent-host-rescue.ts +172 -0
  757. package/src/runtime/standalone-recovery/installer.ts +399 -177
  758. package/src/runtime/standalone-recovery/mcp-server.ts +79 -0
  759. package/src/runtime/standalone-recovery/mutation-identity-contract.ts +21 -0
  760. package/src/runtime/standalone-recovery/operation-lock.ts +160 -0
  761. package/src/runtime/standalone-recovery/performance.ts +173 -0
  762. package/src/runtime/standalone-recovery/release.ts +58 -5
  763. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  764. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  765. package/src/runtime/watchdog/workflow-watchdog.ts +1 -1
  766. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  767. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -4
  768. package/src/runtime/workflow/schedules/engine.ts +298 -484
  769. package/src/runtime/workflow/schedules/pending-activation.ts +1 -1
  770. package/src/runtime/workflow/schedules/settlement.ts +2 -191
  771. package/src/runtime/workflow/schedules/store.ts +2 -607
  772. package/src/runtime/workflow/schedules/types.ts +2 -127
  773. package/src/runtime/workflow/schedules/work-continuation.ts +220 -16
  774. package/src/runtime/workflows/first-party/xiaohongshu.ts +122 -0
  775. package/src/runtime/workflows/runtime.ts +482 -0
  776. package/src/testing/test-governance.ts +95 -30
  777. package/supervisor/chatgpt-conversation.ts +23 -0
  778. package/supervisor/client.ts +201 -0
  779. package/supervisor/control-plane.ts +868 -0
  780. package/supervisor/entry.ts +15 -0
  781. package/supervisor/forge-validators.ts +80 -0
  782. package/supervisor/index.ts +5 -0
  783. package/supervisor/native-browser-adapter.ts +786 -0
  784. package/supervisor/native-messaging/host.ts +39 -0
  785. package/supervisor/native-messaging/manifest.ts +26 -0
  786. package/supervisor/native-messaging/protocol.ts +27 -0
  787. package/supervisor/paths.ts +18 -0
  788. package/supervisor/protocol.ts +202 -0
  789. package/supervisor/server.ts +404 -0
  790. package/supervisor/store.ts +1451 -0
  791. package/supervisor/tsconfig.json +8 -0
  792. package/supervisor/types.ts +255 -0
  793. package/assets/templates/helpers/archive-architecture-request.sh +0 -244
  794. package/docs/architecture/history/README.md +0 -7
  795. package/docs/architecture/history/chatgpt-handoff-facade.md +0 -397
  796. package/docs/architecture/history/global-hook-runtime.md +0 -166
  797. package/docs/architecture/history/ios-semantic-automation-provider-v2.md +0 -170
  798. package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  799. package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +0 -59
  800. package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +0 -59
  801. package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +0 -59
  802. package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +0 -59
  803. package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  804. package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  805. package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  806. package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  807. package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +0 -59
  808. package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  809. package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  810. package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  811. package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  812. package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  813. package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  814. package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  815. package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  816. package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  817. package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +0 -59
  818. package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +0 -59
  819. package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +0 -63
  820. package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  821. package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  822. package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  823. package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  824. package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +0 -60
  825. package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +0 -60
  826. package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +0 -68
  827. package/docs/architecture/requests/archive/2026/root.md +0 -68
  828. package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +0 -76
  829. package/docs/architecture/requests/archive/2026/verification-evals-checks.md +0 -68
  830. package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +0 -69
  831. package/scripts/archive-architecture-request.sh +0 -4
  832. package/scripts/benchmark-background-check-overlap.ts +0 -228
  833. package/scripts/benchmark-controller-hotpath.ts +0 -212
  834. package/scripts/benchmark-controller-round2.ts +0 -139
  835. package/scripts/benchmark-ios-agent-device.ts +0 -514
  836. package/scripts/benchmark-mcp-host.sh +0 -117
  837. package/scripts/benchmark-mcp-transport.ts +0 -170
  838. package/scripts/benchmark-quality-harness.ts +0 -146
  839. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  840. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  841. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  842. package/scripts/benchmark-thin-harness.ts +0 -251
  843. package/scripts/benchmark-typescript-navigation.ts +0 -186
  844. package/scripts/benchmark-work-efficiency.ts +0 -334
  845. package/scripts/build-controller-ui.ts +0 -28
  846. package/scripts/check-npm-release.sh +0 -32
  847. package/scripts/check-public-release-surface.sh +0 -19
  848. package/scripts/check-release-published.sh +0 -57
  849. package/scripts/check-release-readiness.sh +0 -37
  850. package/scripts/check-release-version.mjs +0 -74
  851. package/scripts/check-tarball-install-smoke.sh +0 -67
  852. package/scripts/package-source-archive.sh +0 -147
  853. package/scripts/public-release-files.txt +0 -39
  854. package/scripts/public-release.ts +0 -174
  855. package/scripts/publish-release-tarball.sh +0 -27
  856. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  857. package/scripts/run-skill-evals.ts +0 -1022
  858. package/scripts/stage-runtime-release.ts +0 -39
  859. package/src/cli/controller/progress.ts +0 -656
  860. package/src/cli/controller/work-mode.ts +0 -181
  861. package/src/cli/local-bridge/console-assets.ts +0 -17
  862. package/src/cli/local-bridge/dashboard.ts +0 -17
  863. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  864. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  865. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  866. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  867. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  868. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  869. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  870. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  871. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  872. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  873. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  874. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  875. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  876. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  877. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  878. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  879. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  880. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  881. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  882. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  883. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  884. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  885. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  886. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  887. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  888. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  889. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  890. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  891. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -385
  892. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -1913
  893. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  894. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -449
  895. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -1118
  896. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -93
  897. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  898. package/src/runtime/control-plane/routing/index.ts +0 -1
  899. package/src/runtime/control-plane/routing/route-policy.ts +0 -382
  900. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
@@ -1,22 +1,32 @@
1
- import { readLatestControllerCheckEvidence } from '../../../cli/controller/check-runner';
1
+ import { createHash } from 'crypto';
2
+ import { resolve } from 'path';
3
+ import { controllerCheckExecutionIdentity, listControllerChecks, readLatestControllerCheckEvidence } from '../../../cli/controller/check-runner';
2
4
  import { repositoryGitStatus } from '../../../cli/repositories/structured-git';
3
5
  import type { RepositoryRecord } from '../../../cli/repositories/types';
4
6
  import {
5
7
  DEFAULT_WORK_CHECK_LEASE_WAIT_MS,
6
8
  checkRequiresDurableWorkflow,
7
9
  getProcessRecord,
10
+ isManagedProcessActive,
11
+ listProcessRecords,
8
12
  processCheckCompletionReceipt,
9
13
  readPersistedCheckResultReceipt,
10
14
  runPersistedCheckViaProcessRuntime,
11
15
  } from '../../execution/process-runtime';
12
- import { classifyPersistedCheckTerminalEvidence } from '../../execution/process-runtime/check-result';
16
+ import { projectTerminalCheckVerification } from '../../execution/process-runtime/check-result';
17
+ import { buildCheckExecutionSchedule } from '../../execution/process-runtime/check-scheduling';
18
+ import { ingestCheckCompletionGraceProcess } from '../persistence/operational-prior-store';
13
19
  import { buildFacadeResult } from '../facade/facade-result';
14
20
  import { classifyVerificationOutcome, normalizeCheckIds } from '../facade/check-normalization';
15
- import { verifyGoalWorkloop } from '../facade/goal-workloop';
16
- import type { FacadeResult, WorkContract } from '../facade/types';
21
+ import { recordWorkCheckEvidence } from './work-check-evidence';
22
+ import type { FacadeResult, VerificationRecord, WorkContract } from '../facade/types';
23
+
17
24
  import { executionIdentityForRepository } from './execution-identity';
18
- import { commandFingerprint, verificationInputFingerprint, workspaceValidationFingerprint } from './verification-evidence';
25
+ import { commandFingerprint, effectiveVerificationEvidence, verificationInputFingerprint, workspaceValidationFingerprint } from './verification-evidence';
19
26
  import { resolveWorkVerificationContext } from './work-verification-context';
27
+ import { listWorkBoundRepositoryProcessEvidence } from './work-process-evidence';
28
+ import { changedPaths as workChangedPaths, changedPathsFromUnbornBase } from './work-revision-diff';
29
+ import { readWorkHandle, workDeliveryBaseRevision } from './work-handle-store';
20
30
 
21
31
  export interface ExecuteWorkVerificationInput {
22
32
  controllerHome: string;
@@ -27,13 +37,13 @@ export interface ExecuteWorkVerificationInput {
27
37
  timeoutMs?: number;
28
38
  interactiveWaitMs?: number;
29
39
  leaseWaitMs?: number;
40
+ /** Exact terminal generic Check Processes to reconcile into this Work. */
41
+ reconcileProcessIds?: readonly string[];
30
42
  simulate?: {
31
43
  infrastructureFailed?: boolean;
32
44
  checkFailed?: boolean;
33
45
  skipped?: boolean;
34
46
  };
35
- /** Caller-supplied exact ownership proof for durable-class checks. */
36
- allowDurableCheckExecution?: (input: { work: WorkContract; checkId: string }) => boolean;
37
47
  }
38
48
 
39
49
  export interface ExecuteWorkVerificationResult {
@@ -45,6 +55,530 @@ function result(facade: FacadeResult, isError = false): ExecuteWorkVerificationR
45
55
  return { facade, isError };
46
56
  }
47
57
 
58
+ /**
59
+ * Derive the exact current implementation paths for the canonical Work
60
+ * verifier. Review admission cannot rely on Work scope evidence alone: a
61
+ * committed candidate in a managed checkout has no dirty-path signal, while
62
+ * a target-only advance must not become part of the Work candidate.
63
+ */
64
+ function trustedWorkspaceChangedPaths(input: {
65
+ controllerHome: string;
66
+ repository: RepositoryRecord;
67
+ work: WorkContract;
68
+ verificationStatus: ReturnType<typeof repositoryGitStatus>;
69
+ }): string[] {
70
+ const sourceRevision = input.verificationStatus.head;
71
+ const handle = readWorkHandle(input.controllerHome, input.repository.repoId, input.work.workId);
72
+ const deliveryBaseRevision = workDeliveryBaseRevision(handle ?? {}) ?? input.work.baseRevision;
73
+ const committedPaths = deliveryBaseRevision && sourceRevision
74
+ ? input.work.repositoryBaseState === 'unborn'
75
+ ? changedPathsFromUnbornBase(input.repository.canonicalRoot, sourceRevision)
76
+ : workChangedPaths(input.repository.canonicalRoot, deliveryBaseRevision, sourceRevision)
77
+ : input.work.scopeEvidence?.actualChangedPaths ?? [];
78
+ return [...new Set([
79
+ ...committedPaths,
80
+ ...input.verificationStatus.staged,
81
+ ...input.verificationStatus.unstaged,
82
+ ...input.verificationStatus.untracked,
83
+ ])].map((path) => path.trim()).filter(Boolean).sort();
84
+ }
85
+
86
+ function currentReusableVerificationRecord(input: {
87
+ workContract?: WorkContract;
88
+ checkId: string;
89
+ sourceRevision?: string;
90
+ workspaceFingerprint: string;
91
+ requestedChecks: string[];
92
+ }): VerificationRecord | undefined {
93
+ if (!input.workContract || !input.sourceRevision) return undefined;
94
+ return effectiveVerificationEvidence(input.workContract.checkRefs, {
95
+ sourceRevision: input.sourceRevision,
96
+ workspaceFingerprint: input.workspaceFingerprint,
97
+ checkId: input.checkId,
98
+ requestedChecks: input.requestedChecks,
99
+ }).find((entry) =>
100
+ entry.current
101
+ && (entry.record.outcome === 'valid_pass' || entry.record.outcome === 'valid_fail')
102
+ && Boolean(entry.record.receipt)
103
+ )?.record;
104
+ }
105
+
106
+ function reusedVerificationResult(
107
+ record: VerificationRecord,
108
+ input: {
109
+ workContract?: WorkContract;
110
+ sourceRevision?: string;
111
+ workspaceFingerprint: string;
112
+ workspaceChangedPaths?: readonly string[];
113
+ } = { workspaceFingerprint: '' },
114
+ reconciledProcessIds: string[] = [],
115
+ ): ExecuteWorkVerificationResult {
116
+ const receipt = record.receipt!;
117
+ const passed = record.outcome === 'valid_pass';
118
+ // Reused verification is durable evidence only. It never derives a Work next step.
119
+ void input.workContract;
120
+ void input.sourceRevision;
121
+ void input.workspaceFingerprint;
122
+ void input.workspaceChangedPaths;
123
+ return result(buildFacadeResult({
124
+ status: passed ? 'ok' : 'failed',
125
+ summary: `Reused exact current verification receipt for ${record.checkId}; no Process was re-executed.`,
126
+ data: {
127
+ verification: {
128
+ checkId: record.checkId,
129
+ outcome: record.outcome,
130
+ isAcceptanceFailure: !passed,
131
+ isInfrastructureIssue: false,
132
+ executed: false,
133
+ completed: true,
134
+ reused: true,
135
+ processId: receipt.processId,
136
+ processStatus: receipt.runtimeStatus,
137
+ ok: passed,
138
+ evidenceReceiptId: receipt.receiptId,
139
+ reconciledProcessIds,
140
+ },
141
+ },
142
+ rawAvailable: false,
143
+ }), !passed);
144
+ }
145
+
146
+ export interface ContentEquivalentWorkVerificationTransferPlan {
147
+ transferredRecords: VerificationRecord[];
148
+ reusableCheckIds: string[];
149
+ invalidatedCheckIds: string[];
150
+ }
151
+
152
+ /**
153
+ * Pure verification-transfer planner for a Forge-owned representation-only
154
+ * commit. It never mutates Work authority. The caller must persist the complete
155
+ * verification + derived-review + lifecycle transfer atomically.
156
+ */
157
+ export function planWorkVerificationAcrossContentEquivalentCommit(input: {
158
+ controllerHome: string;
159
+ repository: RepositoryRecord;
160
+ workId: string;
161
+ preCommitSourceRevision: string;
162
+ preCommitWorkspaceFingerprint: string;
163
+ postCommitSourceRevision: string;
164
+ postCommitWorkspaceFingerprint: string;
165
+ recordedAt?: string;
166
+ }): ContentEquivalentWorkVerificationTransferPlan {
167
+ const resolved = resolveWorkVerificationContext({
168
+ controllerHome: input.controllerHome,
169
+ repository: input.repository,
170
+ workId: input.workId,
171
+ });
172
+ if (!resolved.ok || !resolved.context.workContract) {
173
+ throw new Error(`WORK_VERIFICATION_TRANSFER_CONTEXT_REQUIRED: ${input.workId}`);
174
+ }
175
+ const { workContract, repository, checks } = resolved.context;
176
+ if (workContract.completionReceipt) throw new Error(`WORK_VERIFICATION_TRANSFER_WORK_TERMINAL: ${input.workId}`);
177
+ const requestedChecks = workContract.checks;
178
+ const checkById = new Map(listControllerChecks(repository.canonicalRoot).map((check) => [check.id, check] as const));
179
+ const transferredRecords: VerificationRecord[] = [];
180
+ const reusableCheckIds: string[] = [];
181
+ const invalidatedCheckIds: string[] = [];
182
+ const recordedAt = input.recordedAt ?? new Date().toISOString();
183
+
184
+ for (const checkId of requestedChecks) {
185
+ const check = checkById.get(checkId) ?? checks.find((entry) => entry.id === checkId);
186
+ const sourcePass = effectiveVerificationEvidence(workContract.checkRefs, {
187
+ sourceRevision: input.preCommitSourceRevision,
188
+ workspaceFingerprint: input.preCommitWorkspaceFingerprint,
189
+ checkId,
190
+ requestedChecks,
191
+ }).find((entry) => entry.current && entry.record.outcome === 'valid_pass' && Boolean(entry.record.receipt))?.record;
192
+ if (!check || !sourcePass?.receipt || check.effects?.git !== undefined) {
193
+ invalidatedCheckIds.push(checkId);
194
+ continue;
195
+ }
196
+ let currentExecutionIdentity;
197
+ try {
198
+ currentExecutionIdentity = controllerCheckExecutionIdentity(repository.canonicalRoot, checkId);
199
+ } catch {
200
+ invalidatedCheckIds.push(checkId);
201
+ continue;
202
+ }
203
+ const receipt = sourcePass.receipt;
204
+ const definitionUnchanged = Boolean(receipt.checkDefinitionDigest)
205
+ && receipt.checkDefinitionDigest === currentExecutionIdentity.definitionDigest;
206
+ const contentInputsUnchanged = Boolean(receipt.checkRevision)
207
+ && receipt.checkRevision === currentExecutionIdentity.revision;
208
+ const environmentUnchanged = Boolean(receipt.checkEnvironmentFingerprint)
209
+ && receipt.checkEnvironmentFingerprint === currentExecutionIdentity.environmentFingerprint;
210
+ if (!definitionUnchanged || !contentInputsUnchanged || !environmentUnchanged) {
211
+ invalidatedCheckIds.push(checkId);
212
+ continue;
213
+ }
214
+ const transferred: VerificationRecord = {
215
+ ...sourcePass,
216
+ summary: `Verification authority transferred across a content-equivalent Forge commit for ${checkId}.`,
217
+ recordedAt,
218
+ sourceRevision: input.postCommitSourceRevision,
219
+ workspaceFingerprint: input.postCommitWorkspaceFingerprint,
220
+ verificationInputFingerprint: verificationInputFingerprint({
221
+ sourceRevision: input.postCommitSourceRevision,
222
+ workspaceFingerprint: input.postCommitWorkspaceFingerprint,
223
+ checkId,
224
+ requestedChecks,
225
+ }),
226
+ evidenceRef: {
227
+ title: checkId,
228
+ summary: 'Reused the exact persisted Process receipt after proving check definition, content inputs, environment, and non-Git read semantics are unchanged across the commit.',
229
+ detailLevel: 'summary',
230
+ },
231
+ };
232
+ transferredRecords.push(transferred);
233
+ reusableCheckIds.push(checkId);
234
+ }
235
+
236
+ return { transferredRecords, reusableCheckIds, invalidatedCheckIds };
237
+ }
238
+
239
+ const MAX_WORK_VERIFY_BATCH_CHECKS = 32;
240
+
241
+ export interface ExecuteWorkVerificationBatchInput extends Omit<ExecuteWorkVerificationInput, 'checkId'> {
242
+ checkIds: string[];
243
+ }
244
+
245
+ function boundedCheckSchedulingPayload(schedule: ReturnType<typeof buildCheckExecutionSchedule>) {
246
+ return {
247
+ waveCount: schedule.waves.length,
248
+ maxParallel: schedule.maxParallel,
249
+ waves: schedule.waves,
250
+ conflicts: schedule.conflicts,
251
+ invalidCheckIds: schedule.invalidCheckIds,
252
+ guidance: schedule.guidance,
253
+ };
254
+ }
255
+
256
+ /**
257
+ * Canonical batch wrapper for rh_work verification. Scheduling remains advisory
258
+ * and Process Runtime resource claims remain the execution/lease authority.
259
+ * Every member still executes through executeWorkVerification so Work snapshot,
260
+ * Failure Contract, VerificationRecord, and lifecycle semantics stay singular.
261
+ */
262
+ export interface ReconcileTerminalWorkVerificationsResult {
263
+ repository?: RepositoryRecord;
264
+ verificationStatus?: ReturnType<typeof repositoryGitStatus>;
265
+ sourceRevision?: string;
266
+ workspaceFingerprint?: string;
267
+ reconciledProcessIds: string[];
268
+ workBoundProcessEvidenceIds: string[];
269
+ }
270
+
271
+ /**
272
+ * Reconcile terminal Work-bound verification Processes into canonical Work
273
+ * verification authority. MCP/other adapters may consume the resulting exact
274
+ * repository/content identity, but Process scanning, semantic fingerprint
275
+ * matching, receipt construction, terminal projection, and Work verification
276
+ * mutation remain owned here.
277
+ */
278
+ export function reconcileTerminalWorkVerifications(input: {
279
+ controllerHome: string;
280
+ repository: RepositoryRecord;
281
+ workId: string;
282
+ /** Explicit Process ids are required for generic run_check evidence. */
283
+ reconcileProcessIds?: readonly string[];
284
+ }): ReconcileTerminalWorkVerificationsResult {
285
+ const resolved = resolveWorkVerificationContext({
286
+ controllerHome: input.controllerHome,
287
+ repository: input.repository,
288
+ workId: input.workId,
289
+ });
290
+ if (!resolved.ok) return { reconciledProcessIds: [], workBoundProcessEvidenceIds: [] };
291
+ const { store, workContract, repository, checks: availableChecks } = resolved.context;
292
+ if (!workContract || workContract.completionReceipt) return { reconciledProcessIds: [], workBoundProcessEvidenceIds: [] };
293
+
294
+ const verificationStatus = repositoryGitStatus(repository);
295
+ const sourceRevision = verificationStatus.head ?? undefined;
296
+ if (!sourceRevision) return { repository, verificationStatus, reconciledProcessIds: [], workBoundProcessEvidenceIds: [] };
297
+ const workspaceFingerprint = workspaceValidationFingerprint(repository.canonicalRoot, verificationStatus);
298
+ const workspaceChangedPaths = trustedWorkspaceChangedPaths({
299
+ controllerHome: input.controllerHome,
300
+ repository,
301
+ work: workContract,
302
+ verificationStatus,
303
+ });
304
+ const workBoundProcessEvidenceIds = (
305
+ workContract.workKind === 'local_effect'
306
+ || (workContract.workKind === 'repository_change' && workContract.checks.length === 0)
307
+ )
308
+ ? listWorkBoundRepositoryProcessEvidence({
309
+ controllerHome: input.controllerHome,
310
+ repoId: input.repository.repoId,
311
+ checkoutId: repository.activeCheckoutId,
312
+ workId: input.workId,
313
+ }).map((evidence) => evidence.processId)
314
+ : [];
315
+ const seenChecks = new Set<string>();
316
+ const reconciledProcessIds: string[] = [];
317
+ const explicitProcessIds = new Set(
318
+ (input.reconcileProcessIds ?? [])
319
+ .map((processId) => processId.trim())
320
+ .filter(Boolean)
321
+ .slice(0, 32),
322
+ );
323
+ const recordsById = new Map(
324
+ listProcessRecords(input.controllerHome, input.repository.repoId, 500).map((record) => [record.processId, record] as const),
325
+ );
326
+ // An explicitly named Process may be older than the bounded recent scan.
327
+ // Fetching that one exact id preserves bounded reads without treating an
328
+ // arbitrary caller-supplied receipt as authority.
329
+ for (const processId of explicitProcessIds) {
330
+ if (!recordsById.has(processId)) {
331
+ const record = getProcessRecord(input.controllerHome, input.repository.repoId, processId);
332
+ if (record) recordsById.set(processId, record);
333
+ }
334
+ }
335
+ const candidates = [...recordsById.values()].filter((record) => {
336
+ const workSnapshot = (
337
+ record.workId === input.workId
338
+ && record.checkoutId === repository.activeCheckoutId
339
+ && !isManagedProcessActive(record)
340
+ && record.origin?.workVerificationSnapshot === true
341
+ && typeof record.origin?.checkId === 'string'
342
+ && typeof record.origin?.requestSemanticFingerprint === 'string'
343
+ );
344
+ if (workSnapshot) return true;
345
+ if (!explicitProcessIds.has(record.processId)) return false;
346
+
347
+ // Generic run_check records have no Work owner. They are eligible only
348
+ // when the caller names the exact terminal Process and the record proves
349
+ // the same repository/checkout, canonical checkout root, checkout-scoped
350
+ // Check execution, and check surface. The persisted semantic result is
351
+ // validated below before any Work mutation.
352
+ const executionIdentity = record.executionIdentity;
353
+ return (
354
+ record.repoId === repository.repoId
355
+ && record.checkoutId === repository.activeCheckoutId
356
+ && record.workId == null
357
+ && !isManagedProcessActive(record)
358
+ && record.origin?.surface === 'check'
359
+ && typeof record.origin?.checkId === 'string'
360
+ && executionIdentity?.repositoryId === repository.repoId
361
+ && executionIdentity.checkoutId === repository.activeCheckoutId
362
+ && resolve(executionIdentity.canonicalRoot) === resolve(repository.canonicalRoot)
363
+ && record.checkExecution?.reuseScope === 'checkout'
364
+ && record.checkExecution.scopeKey === `checkout:${repository.activeCheckoutId}`
365
+ );
366
+ });
367
+
368
+ for (const record of candidates) {
369
+ const checkId = record.origin?.checkId?.trim() ?? '';
370
+ if (!checkId || seenChecks.has(checkId)) continue;
371
+ seenChecks.add(checkId);
372
+ const classified = classifyVerificationOutcome({ checkId, available: availableChecks });
373
+ if (classified.outcome === 'invalid_check_id' || !classified.normalizedCheckId) continue;
374
+ const normalizedCheckId = classified.normalizedCheckId;
375
+ const requestedChecks = workContract.checks.length ? workContract.checks : [normalizedCheckId];
376
+ const currentFingerprint = verificationInputFingerprint({
377
+ sourceRevision,
378
+ workspaceFingerprint,
379
+ checkId: normalizedCheckId,
380
+ requestedChecks,
381
+ });
382
+ const workSnapshot = record.workId === input.workId && record.origin?.workVerificationSnapshot === true;
383
+ if (workSnapshot && (record.origin?.requestSemanticFingerprint !== currentFingerprint || !record.checkExecution)) continue;
384
+ if (!workSnapshot) {
385
+ const recordedExecution = record.checkExecution;
386
+ if (!recordedExecution) continue;
387
+ const currentExecution = controllerCheckExecutionIdentity(repository.canonicalRoot, normalizedCheckId);
388
+ if (
389
+ currentExecution.cacheKey !== recordedExecution.cacheKey
390
+ || currentExecution.revision !== recordedExecution.revision
391
+ || currentExecution.definitionDigest !== recordedExecution.definitionDigest
392
+ || currentExecution.environmentFingerprint !== recordedExecution.environmentFingerprint
393
+ || currentExecution.timeoutMs !== recordedExecution.timeoutMs
394
+ || currentExecution.reuseScope !== recordedExecution.reuseScope
395
+ ) continue;
396
+ const structuredReceipt = readPersistedCheckResultReceipt(record.origin?.checkResultReceiptPath);
397
+ if (
398
+ !structuredReceipt
399
+ || structuredReceipt.checkId !== normalizedCheckId
400
+ || structuredReceipt.cacheKey !== recordedExecution.cacheKey
401
+ || structuredReceipt.validatedRevision !== recordedExecution.revision
402
+ ) continue;
403
+ }
404
+ const checkExecution = record.checkExecution;
405
+ if (!checkExecution) continue;
406
+
407
+ try {
408
+ const receipt = processCheckCompletionReceipt(record, {
409
+ repoId: repository.repoId,
410
+ checkoutId: repository.activeCheckoutId,
411
+ workId: input.workId,
412
+ checkId: normalizedCheckId,
413
+ processId: record.processId,
414
+ requestId: record.origin?.requestId,
415
+ checkExecution: {
416
+ cacheKey: checkExecution.cacheKey,
417
+ revision: checkExecution.revision,
418
+ definitionDigest: checkExecution.definitionDigest,
419
+ environmentFingerprint: checkExecution.environmentFingerprint,
420
+ timeoutMs: checkExecution.timeoutMs,
421
+ scopeKey: checkExecution.scopeKey,
422
+ },
423
+ });
424
+ if (workContract.checkRefs.some((entry) => entry.receipt?.receiptId === receipt.receiptId)) continue;
425
+
426
+ const legacyEvidence = record.origin?.checkResultReceiptPath
427
+ ? undefined
428
+ : readLatestControllerCheckEvidence(repository.canonicalRoot, normalizedCheckId);
429
+ const projection = projectTerminalCheckVerification(record, normalizedCheckId, receipt, { legacyEvidence });
430
+ recordWorkCheckEvidence({
431
+ store,
432
+ workId: input.workId,
433
+ checkId: normalizedCheckId,
434
+ availableChecks,
435
+ sourceRevision,
436
+ workspaceFingerprint,
437
+ verificationInputFingerprint: currentFingerprint,
438
+ commandFingerprint: commandFingerprint(normalizedCheckId, receipt.commandId),
439
+ receipt,
440
+ infrastructureFailed: projection.isInfrastructureIssue,
441
+ checkFailed: projection.isAcceptanceFailure,
442
+ });
443
+ reconciledProcessIds.push(record.processId);
444
+ } catch {
445
+ // Exact receipt/process identity is mandatory. Any malformed, stale, or
446
+ // mismatched terminal Process remains non-authoritative and is ignored.
447
+ }
448
+ }
449
+
450
+ return {
451
+ repository,
452
+ verificationStatus,
453
+ sourceRevision,
454
+ workspaceFingerprint,
455
+ reconciledProcessIds,
456
+ workBoundProcessEvidenceIds,
457
+ };
458
+ }
459
+
460
+ export async function executeWorkVerificationBatch(input: ExecuteWorkVerificationBatchInput): Promise<ExecuteWorkVerificationResult> {
461
+ const workId = input.workId?.trim() ?? '';
462
+ const requestedCheckIds = [...new Set(input.checkIds.map((value) => value.trim()).filter(Boolean))];
463
+ if (requestedCheckIds.length === 0) {
464
+ return result(buildFacadeResult({
465
+ status: 'blocked',
466
+ summary: 'Work batch verification requires a non-empty check_ids array.',
467
+ data: { batch: true, checkIds: [], verificationStarted: false },
468
+ warnings: ['CHECK_IDS_REQUIRED: pass between 1 and 32 registered check ids.'],
469
+ }), true);
470
+ }
471
+ if (requestedCheckIds.length > MAX_WORK_VERIFY_BATCH_CHECKS) {
472
+ return result(buildFacadeResult({
473
+ status: 'blocked',
474
+ summary: `Work batch verification accepts at most ${MAX_WORK_VERIFY_BATCH_CHECKS} distinct check ids.`,
475
+ data: { batch: true, checkIds: requestedCheckIds.slice(0, MAX_WORK_VERIFY_BATCH_CHECKS), verificationStarted: false },
476
+ warnings: ['CHECK_IDS_LIMIT_EXCEEDED'],
477
+ }), true);
478
+ }
479
+
480
+ const resolvedVerification = resolveWorkVerificationContext({
481
+ controllerHome: input.controllerHome,
482
+ repository: input.repository,
483
+ workId,
484
+ });
485
+ if (!resolvedVerification.ok) {
486
+ return result(buildFacadeResult({
487
+ status: 'blocked',
488
+ summary: `${resolvedVerification.code}: ${resolvedVerification.detail}`,
489
+ data: { batch: true, checkIds: requestedCheckIds, verificationStarted: false },
490
+ warnings: ['Work batch verification never falls back to a different checkout or check registry.'],
491
+ }), true);
492
+ }
493
+
494
+ const { repository: verificationRepository, checks } = resolvedVerification.context;
495
+ const checksById = new Map(checks.map((check) => [check.id, check] as const));
496
+ const schedule = buildCheckExecutionSchedule({
497
+ checks,
498
+ requestedCheckIds,
499
+ repoId: verificationRepository.repoId,
500
+ checkoutId: verificationRepository.activeCheckoutId,
501
+ });
502
+ const checkScheduling = boundedCheckSchedulingPayload(schedule);
503
+ if (schedule.invalidCheckIds.length > 0) {
504
+ return result(buildFacadeResult({
505
+ status: 'blocked',
506
+ summary: `Work batch verification contains unregistered checks: ${schedule.invalidCheckIds.join(', ')}`,
507
+ data: { batch: true, checkIds: requestedCheckIds, checkScheduling, verificationStarted: false },
508
+ warnings: ['INVALID_CHECK_IDS'],
509
+ }), true);
510
+ }
511
+ const durableCheckIds = requestedCheckIds.filter((checkId) => checkRequiresDurableWorkflow(checksById.get(checkId)));
512
+ if (durableCheckIds.length > 0) {
513
+ return result(buildFacadeResult({
514
+ status: 'blocked',
515
+ summary: 'Work batch verification only launches ordinary focused checks; durable release or multi-phase checks must be verified individually.',
516
+ data: { batch: true, checkIds: requestedCheckIds, durableCheckIds, checkScheduling, verificationStarted: false },
517
+ warnings: ['BATCH_CONTAINS_DURABLE_CHECK'],
518
+ }), true);
519
+ }
520
+ if (schedule.waves.length !== 1 || schedule.waves[0]?.checkIds.length !== requestedCheckIds.length) {
521
+ return result(buildFacadeResult({
522
+ status: 'blocked',
523
+ summary: 'Requested Work checks span multiple resource-conflicting waves; submit one returned wave per verify call.',
524
+ data: { batch: true, checkIds: requestedCheckIds, checkScheduling, verificationStarted: false },
525
+ warnings: ['BATCH_SPANS_MULTIPLE_CHECK_WAVES'],
526
+ }), true);
527
+ }
528
+
529
+ const baseRequestId = input.requestId?.trim() ?? '';
530
+ const batchDigest = createHash('sha256').update(JSON.stringify(requestedCheckIds)).digest('hex').slice(0, 8);
531
+ const executions = await Promise.all(requestedCheckIds.map((checkId, index) => executeWorkVerification({
532
+ ...input,
533
+ checkId,
534
+ requestId: baseRequestId ? `${baseRequestId}:batch:${index + 1}:${batchDigest}` : undefined,
535
+ })));
536
+ const verifications: Array<Record<string, unknown> & { checkId: string; facadeStatus: FacadeResult['status']; isError: boolean }> = executions.map((execution, index) => {
537
+ const data = execution.facade.data as Record<string, unknown>;
538
+ const verification = data.verification && typeof data.verification === 'object' && !Array.isArray(data.verification)
539
+ ? data.verification as Record<string, unknown>
540
+ : {};
541
+ return {
542
+ checkId: requestedCheckIds[index],
543
+ ...verification,
544
+ facadeStatus: execution.facade.status,
545
+ isError: execution.isError,
546
+ };
547
+ });
548
+ const completed = verifications.every((verification) => verification.completed === true);
549
+ const allPassed = completed && verifications.every((verification) => verification.outcome === 'valid_pass');
550
+ const anyAcceptanceFailure = verifications.some((verification) => verification.outcome === 'valid_fail');
551
+ const anyInfrastructureFailure = verifications.some((verification) => verification.outcome === 'infrastructure_failure');
552
+ const anyBlocked = executions.some((execution) => execution.facade.status === 'blocked');
553
+ const processIds = verifications
554
+ .map((verification) => typeof verification.processId === 'string' ? verification.processId : '')
555
+ .filter(Boolean);
556
+ const facade = buildFacadeResult({
557
+ status: anyAcceptanceFailure ? 'failed' : anyBlocked ? 'blocked' : 'ok',
558
+ summary: completed
559
+ ? allPassed
560
+ ? `Work verification batch passed ${requestedCheckIds.length} checks.`
561
+ : anyAcceptanceFailure
562
+ ? 'Work verification batch completed with an acceptance failure.'
563
+ : anyInfrastructureFailure
564
+ ? 'Work verification batch completed with an infrastructure failure.'
565
+ : 'Work verification batch completed.'
566
+ : `Work verification batch launched ${requestedCheckIds.length} resource-compatible checks through Process Runtime.`,
567
+ data: {
568
+ batch: true,
569
+ checkIds: requestedCheckIds,
570
+ checkScheduling,
571
+ verifications,
572
+ processIds,
573
+ completed,
574
+ ...(completed ? { ok: allPassed } : {}),
575
+ },
576
+ warnings: anyInfrastructureFailure ? ['infrastructure_failure is distinct from acceptance failure'] : [],
577
+ rawAvailable: false,
578
+ });
579
+ return result(facade, anyAcceptanceFailure || executions.some((execution) => execution.isError && execution.facade.status !== 'ok'));
580
+ }
581
+
48
582
  /**
49
583
  * Canonical Work verification application service.
50
584
  *
@@ -96,20 +630,14 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
96
630
  }), true);
97
631
  }
98
632
 
99
- const workloopCtx = {
100
- workStore: store,
101
- handoffStore: store,
102
- repoId: input.repository.repoId,
103
- availableChecks: checks,
104
- };
105
- if (workId && (!workContract || workContract.status === 'completed' || workContract.status === 'cancelled' || workContract.status === 'failed')) {
106
- const facade = verifyGoalWorkloop(workloopCtx, { workId, checkId });
633
+ if (workId && (!workContract || workContract.semanticState !== 'open')) {
634
+ const facade = recordWorkCheckEvidence({ store, workId, checkId, availableChecks: checks });
107
635
  return result(facade, facade.status === 'failed');
108
636
  }
109
637
 
110
638
  const classified = classifyVerificationOutcome({ checkId, available: checks });
111
639
  if (classified.outcome === 'invalid_check_id') {
112
- if (workId) return result(verifyGoalWorkloop(workloopCtx, { workId, checkId }));
640
+ if (workId) return result(recordWorkCheckEvidence({ store, workId, checkId, availableChecks: checks }));
113
641
  return result(buildFacadeResult({
114
642
  status: 'ok',
115
643
  summary: classified.summary,
@@ -143,9 +671,11 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
143
671
  },
144
672
  }), input.simulate.checkFailed === true);
145
673
  }
146
- const facade = verifyGoalWorkloop(workloopCtx, {
674
+ const facade = recordWorkCheckEvidence({
675
+ store,
147
676
  workId,
148
677
  checkId: classified.normalizedCheckId ?? checkId,
678
+ availableChecks: checks,
149
679
  infrastructureFailed: input.simulate.infrastructureFailed === true,
150
680
  checkFailed: input.simulate.checkFailed === true,
151
681
  skipped: input.simulate.skipped === true,
@@ -158,6 +688,14 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
158
688
  const verificationStatus = repositoryGitStatus(verificationRepository);
159
689
  const observedGitHead = verificationStatus.head;
160
690
  const workspaceFingerprint = workspaceValidationFingerprint(verificationRepository.canonicalRoot, verificationStatus);
691
+ const workspaceChangedPaths = workContract
692
+ ? trustedWorkspaceChangedPaths({
693
+ controllerHome: input.controllerHome,
694
+ repository: verificationRepository,
695
+ work: workContract,
696
+ verificationStatus,
697
+ })
698
+ : undefined;
161
699
  const requestedChecks = workContract?.checks.length ? workContract.checks : [normalizedCheckId];
162
700
  const verificationRequestFingerprint = observedGitHead ? verificationInputFingerprint({
163
701
  sourceRevision: observedGitHead,
@@ -165,15 +703,83 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
165
703
  checkId: normalizedCheckId,
166
704
  requestedChecks,
167
705
  }) : undefined;
706
+
707
+ const explicitReconciliationRequested = (input.reconcileProcessIds?.length ?? 0) > 0;
708
+ const currentReceipt = currentReusableVerificationRecord({
709
+ workContract: explicitReconciliationRequested ? undefined : workContract,
710
+ checkId: normalizedCheckId,
711
+ sourceRevision: observedGitHead ?? undefined,
712
+ workspaceFingerprint,
713
+ requestedChecks,
714
+ });
715
+ if (currentReceipt) {
716
+ return reusedVerificationResult(currentReceipt, {
717
+ workContract,
718
+ sourceRevision: observedGitHead ?? undefined,
719
+ workspaceFingerprint,
720
+ workspaceChangedPaths,
721
+ });
722
+ }
723
+
724
+ let reconciledProcessIds: string[] = [];
725
+ if (workContract && observedGitHead) {
726
+ const reconciled = reconcileTerminalWorkVerifications({
727
+ controllerHome: input.controllerHome,
728
+ repository: input.repository,
729
+ workId: workContract.workId,
730
+ reconcileProcessIds: input.reconcileProcessIds,
731
+ });
732
+ reconciledProcessIds = reconciled.reconciledProcessIds;
733
+ if (reconciled.reconciledProcessIds.length > 0) {
734
+ const refreshed = resolveWorkVerificationContext({
735
+ controllerHome: input.controllerHome,
736
+ repository: input.repository,
737
+ workId: workContract.workId,
738
+ });
739
+ if (refreshed.ok) {
740
+ const reconciledReceipt = currentReusableVerificationRecord({
741
+ workContract: refreshed.context.workContract,
742
+ checkId: normalizedCheckId,
743
+ sourceRevision: observedGitHead,
744
+ workspaceFingerprint,
745
+ requestedChecks,
746
+ });
747
+ if (reconciledReceipt) {
748
+ return reusedVerificationResult(reconciledReceipt, {
749
+ workContract: refreshed.context.workContract,
750
+ sourceRevision: observedGitHead,
751
+ workspaceFingerprint,
752
+ workspaceChangedPaths,
753
+ }, reconciled.reconciledProcessIds);
754
+ }
755
+ }
756
+ }
757
+ }
758
+ if (explicitReconciliationRequested) {
759
+ return result(buildFacadeResult({
760
+ status: 'blocked',
761
+ summary: 'No explicitly requested terminal Process could be reconciled into the exact Work verification authority.',
762
+ data: {
763
+ verification: {
764
+ checkId: normalizedCheckId,
765
+ outcome: 'reconciliation_not_authoritative',
766
+ isAcceptanceFailure: false,
767
+ isInfrastructureIssue: true,
768
+ reconciledProcessIds,
769
+ },
770
+ },
771
+ warnings: ['WORK_VERIFY_RECONCILIATION_NOT_AUTHORIZED: Forge did not re-execute the Check after explicit reconciliation failed.'],
772
+ }), true);
773
+ }
774
+
168
775
  const registeredCheck = checks.find((entry) => entry.id === normalizedCheckId);
169
- const durableClassCheck = checkRequiresDurableWorkflow(normalizedCheckId, registeredCheck);
776
+ const durableClassCheck = checkRequiresDurableWorkflow(registeredCheck);
170
777
  const allowDurableCheckExecution = Boolean(
171
778
  durableClassCheck
172
779
  && workContract
173
780
  && workContract.checks.includes(normalizedCheckId)
174
781
  && !workContract.completionReceipt
175
- && workContract.status === 'running'
176
- && input.allowDurableCheckExecution?.({ work: workContract, checkId: normalizedCheckId }),
782
+ && workContract.dispatchState === 'running',
177
783
  );
178
784
 
179
785
  const executed = await runPersistedCheckViaProcessRuntime({
@@ -190,11 +796,8 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
190
796
  requestSemanticFingerprint: verificationRequestFingerprint,
191
797
  workId: workId || undefined,
192
798
  commandId: input.requestId,
193
- verificationSnapshot: workContract ? {
194
- workId: workContract.workId,
195
- allowedPaths: workContract.allowedPaths,
196
- forbiddenPaths: workContract.forbiddenPaths,
197
- } : undefined,
799
+ // A Work has semantic scope and evidence, not a mutable path fence.
800
+ // Candidate snapshot ownership is supplied only by a bound EditSession.
198
801
  allowDurableCheckExecution,
199
802
  });
200
803
 
@@ -212,14 +815,7 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
212
815
  observedGitHead,
213
816
  },
214
817
  },
215
- suggestedNextActions: workId ? [{
216
- label: 'Continue Work with the durable check requirement',
217
- tool: 'rh_work',
218
- operation: 'continue',
219
- payload: { work_id: workId },
220
- risk: 'workspace_write',
221
- confidence: 'high',
222
- }] : [],
818
+ suggestedNextActions: [],
223
819
  }), true);
224
820
  }
225
821
 
@@ -276,26 +872,35 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
276
872
  const legacyEvidence = record.origin?.checkResultReceiptPath
277
873
  ? undefined
278
874
  : readLatestControllerCheckEvidence(verificationRepository.canonicalRoot, normalizedCheckId);
279
- const evidenceState = classifyPersistedCheckTerminalEvidence(record, normalizedCheckId, { legacyEvidence });
280
- const failureClass = evidenceState.failureClass;
281
- const infrastructureFailed = receipt.timedOut
282
- || receipt.cancelled
283
- || evidenceState.state !== 'matched'
284
- || (!receipt.ok && failureClass !== 'acceptance_failure');
285
- const checkFailed = !receipt.ok && !infrastructureFailed;
875
+ const projection = projectTerminalCheckVerification(record, normalizedCheckId, receipt, { legacyEvidence });
876
+ const infrastructureFailed = projection.isInfrastructureIssue;
877
+ const checkFailed = projection.isAcceptanceFailure;
878
+ if (projection.outcome === 'valid_pass') {
879
+ try {
880
+ ingestCheckCompletionGraceProcess({
881
+ controllerHome: input.controllerHome,
882
+ repoId: verificationRepository.repoId,
883
+ processId: receipt.processId,
884
+ });
885
+ } catch {
886
+ // Operational Memory is a disposable derived optimization. Its failure
887
+ // must never change Check/Work correctness or lifecycle truth.
888
+ }
889
+ }
286
890
  const commonVerification = {
287
891
  checkId: normalizedCheckId,
288
- outcome: infrastructureFailed ? 'infrastructure_failure' : receipt.ok ? 'valid_pass' : 'valid_fail',
289
- isAcceptanceFailure: checkFailed,
290
- isInfrastructureIssue: infrastructureFailed,
892
+ outcome: projection.outcome,
893
+ isAcceptanceFailure: projection.isAcceptanceFailure,
894
+ isInfrastructureIssue: projection.isInfrastructureIssue,
291
895
  executed: true,
292
896
  completed: true,
293
897
  processId: receipt.processId,
294
898
  processStatus: receipt.runtimeStatus,
295
- ok: receipt.ok,
899
+ ok: projection.outcome === 'valid_pass',
900
+ processOk: receipt.ok,
296
901
  timedOut: receipt.timedOut,
297
902
  cancelled: receipt.cancelled,
298
- failureClass: infrastructureFailed ? 'infrastructure_failure' : failureClass,
903
+ failureClass: projection.failureClass,
299
904
  deduplicated: handle.deduplicated === true,
300
905
  semanticDeduplicated: handle.semanticDeduplicated === true,
301
906
  checkContentRevision: receipt.checkRevision,
@@ -304,18 +909,21 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
304
909
  evidenceArtifactPath: record.origin?.workVerificationSnapshot ? undefined : receipt.artifactPath,
305
910
  evidenceReceiptId: receipt.receiptId,
306
911
  checkResultReceiptId: structuredCheckResult?.receiptId,
912
+ ...(projection.evidence.failureEvidence ? { failureEvidence: projection.evidence.failureEvidence } : {}),
307
913
  verificationIsolation: record.origin?.workVerificationSnapshot ? 'work_snapshot' : 'shared_checkout',
308
- boundedStatus: receipt.ok ? 'pass' : infrastructureFailed ? 'infrastructure_failure' : 'fail',
309
- evidenceState: evidenceState.state,
310
- ...(evidenceState.infrastructureReason ? { infrastructureReason: evidenceState.infrastructureReason } : {}),
914
+ boundedStatus: projection.boundedStatus,
915
+ evidenceState: projection.evidence.state,
916
+ ...(projection.infrastructureReason ? { infrastructureReason: projection.infrastructureReason } : {}),
311
917
  ...(record.error?.code ? { processErrorCode: record.error.code } : {}),
312
918
  };
313
919
 
314
920
  if (workId) {
315
921
  const sourceRevision = observedGitHead ?? undefined;
316
- const facade = verifyGoalWorkloop(workloopCtx, {
922
+ const facade = recordWorkCheckEvidence({
923
+ store,
317
924
  workId,
318
925
  checkId: normalizedCheckId,
926
+ availableChecks: checks,
319
927
  sourceRevision,
320
928
  workspaceFingerprint,
321
929
  verificationInputFingerprint: sourceRevision ? verificationRequestFingerprint : undefined,
@@ -334,7 +942,7 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
334
942
  },
335
943
  },
336
944
  warnings: infrastructureFailed
337
- ? [...facade.warnings, evidenceState.warning ?? 'infrastructure_failure is distinct from acceptance failure']
945
+ ? [...facade.warnings, projection.evidence.warning ?? 'infrastructure_failure is distinct from acceptance failure']
338
946
  : facade.warnings,
339
947
  }, facade.status === 'failed');
340
948
  }
@@ -347,15 +955,17 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
347
955
  ? `Check ${normalizedCheckId} passed with persisted Process evidence.`
348
956
  : `Check ${normalizedCheckId} failed acceptance.`,
349
957
  data: { verification: commonVerification },
350
- warnings: infrastructureFailed ? [evidenceState.warning ?? 'infrastructure_failure is distinct from acceptance failure'] : [],
958
+ warnings: infrastructureFailed ? [projection.evidence.warning ?? 'infrastructure_failure is distinct from acceptance failure'] : [],
351
959
  rawAvailable: false,
352
960
  }), checkFailed);
353
961
  } catch (error) {
354
962
  const message = error instanceof Error ? error.message : String(error);
355
963
  if (workId) {
356
- const facade = verifyGoalWorkloop(workloopCtx, {
964
+ const facade = recordWorkCheckEvidence({
965
+ store,
357
966
  workId,
358
967
  checkId: classified.normalizedCheckId ?? checkId,
968
+ availableChecks: checks,
359
969
  infrastructureFailed: true,
360
970
  });
361
971
  return result({