@moretea-labs/forge 1.7.1 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (685) hide show
  1. package/AGENTS.md +58 -62
  2. package/CHANGELOG.md +39 -0
  3. package/CLAUDE.md +42 -62
  4. package/README.md +2 -2
  5. package/SKILL.md +0 -1
  6. package/THIRD_PARTY_NOTICES.md +5 -2
  7. package/adapters/browser/index.ts +2 -0
  8. package/adapters/chatgpt/browser-delivery-host.ts +71 -0
  9. package/adapters/chatgpt/browser-delivery-runtime.ts +783 -0
  10. package/adapters/chatgpt/controller-binding-store.ts +55 -0
  11. package/adapters/chatgpt/controller-host.ts +119 -0
  12. package/adapters/chatgpt/controller-round-host.ts +78 -0
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +45 -0
  14. package/adapters/chatgpt/provider-delivery.ts +113 -0
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +192 -0
  16. package/adapters/chatgpt/wsl-bridge-delivery-host.ts +63 -0
  17. package/adapters/computer/desktop-operator-contract.ts +7 -0
  18. package/adapters/computer/desktop-operator-discovery.ts +201 -0
  19. package/adapters/computer/desktop-operator-negotiation.ts +174 -0
  20. package/adapters/computer/desktop-operator-provider.ts +312 -0
  21. package/adapters/computer/index.ts +1 -0
  22. package/adapters/computer/interaction-target-authority.ts +944 -0
  23. package/adapters/controller-process/binding-store.ts +34 -0
  24. package/adapters/controller-process/controller-host.ts +26 -0
  25. package/adapters/mcp/access-mode.ts +132 -0
  26. package/adapters/mcp/audit.ts +32 -0
  27. package/adapters/mcp/auth.ts +407 -0
  28. package/adapters/mcp/controller-round-compatibility.ts +184 -0
  29. package/adapters/mcp/frozen-client-semantic-compatibility.ts +292 -0
  30. package/adapters/mcp/instructions.ts +36 -0
  31. package/adapters/mcp/legacy-context.ts +18 -0
  32. package/adapters/mcp/multi-repository.ts +437 -0
  33. package/adapters/mcp/oauth.ts +391 -0
  34. package/adapters/mcp/paths.ts +140 -0
  35. package/adapters/mcp/policy.ts +232 -0
  36. package/adapters/mcp/proxy-env.ts +62 -0
  37. package/adapters/mcp/readiness-projection.ts +24 -0
  38. package/adapters/mcp/redaction.ts +21 -0
  39. package/adapters/mcp/repo.ts +24 -0
  40. package/adapters/mcp/runtime-gateway/artifact-adapter.ts +52 -0
  41. package/adapters/mcp/runtime-gateway/context-adapter.ts +829 -0
  42. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +191 -0
  43. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +147 -0
  44. package/adapters/mcp/runtime-gateway/execution-control-adapter.ts +28 -0
  45. package/adapters/mcp/runtime-gateway/execution-tools.ts +207 -0
  46. package/adapters/mcp/runtime-gateway/filesystem-adapter.ts +38 -0
  47. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +411 -0
  48. package/adapters/mcp/runtime-gateway/legacy-ios-tool-adapter.ts +105 -0
  49. package/adapters/mcp/runtime-gateway/maintenance-adapter.ts +44 -0
  50. package/adapters/mcp/runtime-gateway/model-adapter.ts +63 -0
  51. package/adapters/mcp/runtime-gateway/persisted-check-process.ts +3 -0
  52. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +308 -0
  53. package/adapters/mcp/runtime-gateway/process-tools.ts +289 -0
  54. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +76 -0
  55. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +268 -0
  56. package/adapters/mcp/runtime-gateway/recovery-client-adapter.ts +70 -0
  57. package/adapters/mcp/runtime-gateway/recovery-tool-contract.ts +99 -0
  58. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +110 -0
  59. package/adapters/mcp/runtime-gateway/result-adapter.ts +108 -0
  60. package/adapters/mcp/runtime-gateway/router.ts +728 -0
  61. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1251 -0
  62. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +634 -0
  63. package/adapters/mcp/runtime-gateway/runtime-tool-shared.ts +27 -0
  64. package/adapters/mcp/runtime-gateway/runtime-tools.ts +68 -0
  65. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +186 -0
  66. package/adapters/mcp/runtime-gateway/shared-adapter.ts +25 -0
  67. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +870 -0
  68. package/adapters/mcp/runtime-gateway/work-adapter.ts +3186 -0
  69. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +502 -0
  70. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +1 -0
  71. package/adapters/mcp/server.ts +1048 -0
  72. package/adapters/mcp/setup.ts +791 -0
  73. package/adapters/mcp/tool-capability-cache.ts +87 -0
  74. package/adapters/mcp/tool-mapping/access-tools.ts +387 -0
  75. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +5265 -0
  76. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +150 -0
  77. package/adapters/mcp/tool-mapping/repository-tools.ts +1691 -0
  78. package/adapters/mcp/tool-mapping/tools.ts +9 -0
  79. package/adapters/mcp/tool-mapping/umbrella-tools.ts +117 -0
  80. package/adapters/mcp/toolset-names.ts +74 -0
  81. package/adapters/mcp/toolset-selection.ts +41 -0
  82. package/adapters/mcp/toolset.ts +336 -0
  83. package/adapters/mcp/transports/http.ts +1456 -0
  84. package/adapters/mcp/transports/session-registry.ts +513 -0
  85. package/adapters/mcp/transports/stdio.ts +8 -0
  86. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +139 -0
  87. package/adapters/mcp/types.ts +41 -0
  88. package/assets/AGENTS.md +2 -16
  89. package/assets/CLAUDE.md +2 -16
  90. package/assets/hooks/AGENTS.md +3 -14
  91. package/assets/hooks/CLAUDE.md +3 -14
  92. package/assets/hooks/hook-input.sh +9 -2
  93. package/assets/hooks/lib/workflow-state.sh +28 -10
  94. package/assets/hooks/prompt-guard.sh +63 -37
  95. package/assets/hooks/security-sentinel.sh +2 -1
  96. package/assets/hooks/session-start-context.sh +7 -5
  97. package/assets/hooks/stop-orchestrator.sh +13 -3
  98. package/assets/initializer-question-pack.v4.json +11 -7
  99. package/assets/partials/05-workflow.partial.md +18 -73
  100. package/assets/partials/07-footer.partial.md +1 -1
  101. package/assets/partials-agents/02-operating-mode.partial.md +1 -2
  102. package/assets/partials-agents/04-task-protocol.partial.md +14 -59
  103. package/assets/partials-agents/06-quality-safety.partial.md +11 -16
  104. package/assets/partials-agents/08-deep-docs.partial.md +1 -2
  105. package/assets/plan-map.json +11 -11
  106. package/assets/plugin-registry.v1.json +9 -3
  107. package/assets/plugin-trust-policy.v1.json +6 -0
  108. package/assets/recovery/ForgeRecovery.ps1 +100 -0
  109. package/assets/recovery/forge-wsl-rescue +271 -0
  110. package/assets/reference-configs/development-protocol.md +11 -15
  111. package/assets/reference-configs/document-generation.md +1 -1
  112. package/assets/reference-configs/global-working-rules.md +9 -1
  113. package/assets/reference-configs/harness-overview.md +22 -112
  114. package/assets/reference-configs/hook-operations.md +1 -1
  115. package/assets/reference-configs/sprint-contracts.md +2 -2
  116. package/assets/skill-version.json +2 -2
  117. package/assets/templates/helpers/architecture-event.ts +3 -34
  118. package/assets/templates/helpers/architecture-queue.sh +61 -10
  119. package/assets/templates/helpers/archive-workflow.sh +90 -180
  120. package/assets/templates/helpers/capability-config.ts +8 -11
  121. package/assets/templates/helpers/capability-resolver.ts +37 -19
  122. package/assets/templates/helpers/capture-plan.sh +2 -2
  123. package/assets/templates/helpers/check-architecture-sync.sh +1 -9
  124. package/assets/templates/helpers/check-task-sync.sh +82 -11
  125. package/assets/templates/helpers/check-task-workflow.sh +1 -3
  126. package/assets/templates/helpers/context-contract-sync.sh +1 -12
  127. package/assets/templates/helpers/contract-worktree.sh +26 -24
  128. package/assets/templates/helpers/ensure-task-workflow.sh +6 -8
  129. package/assets/templates/helpers/inspect-project-state.ts +1 -1
  130. package/assets/templates/helpers/migrate-project-template.sh +1 -1
  131. package/assets/templates/helpers/migrate-workflow-docs.ts +53 -239
  132. package/assets/templates/helpers/new-plan.sh +2 -2
  133. package/assets/templates/helpers/plan-to-todo.sh +3 -31
  134. package/assets/templates/helpers/sprint-backlog.sh +1 -1
  135. package/assets/templates/helpers/switch-plan.sh +1 -1
  136. package/assets/templates/helpers/workflow-contract.ts +1 -0
  137. package/assets/workflow-contract.v1.json +63 -171
  138. package/assets/workflows/xiaohongshu/xiaohongshu.collect-metrics.v1.draft.json +118 -0
  139. package/assets/workflows/xiaohongshu/xiaohongshu.publish-image-note.v1.draft.json +316 -0
  140. package/assets/workflows/xiaohongshu/xiaohongshu.publish-long-text.v1.draft.json +324 -0
  141. package/docs/architecture/CURRENT.md +148 -13
  142. package/docs/architecture/EVOLUTION.md +13 -0
  143. package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +2 -1
  144. package/docs/architecture/decisions/20260831-independent-windows-wsl-host-rescue.md +59 -0
  145. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +120 -0
  146. package/docs/architecture/decisions/20260904-repository-runtime-data-boundary.md +42 -0
  147. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +35 -0
  148. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +296 -0
  149. package/docs/architecture/decisions/20260907-maintenance-diagnosis-bounded-read.md +39 -0
  150. package/docs/architecture/domains/verification.md +7 -0
  151. package/docs/architecture/domains/workflow-engine.md +1 -1
  152. package/docs/architecture/index.md +3 -3
  153. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +19 -8
  154. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +124 -0
  155. package/docs/forge-chatgpt-mcp-setup.md +5 -3
  156. package/docs/forge-plugin-management.md +20 -4
  157. package/docs/forge-runtime-self-healing-loop.md +2 -0
  158. package/docs/operations/benchmark-cross-version-freeze.md +38 -0
  159. package/docs/operations/controller-browser-plugin.md +3 -1
  160. package/docs/operations/homebrew.md +2 -2
  161. package/docs/operations/platform-support.md +16 -8
  162. package/docs/operations/platform-support.zh-CN.md +2 -2
  163. package/docs/operations/standalone-disaster-recovery.md +26 -1
  164. package/docs/operations/uu-remote-rescue.md +41 -0
  165. package/docs/operations/windows-wsl-host-rescue.md +133 -0
  166. package/docs/public-usage-guide.md +1 -1
  167. package/docs/public-usage-guide.zh-CN.md +1 -1
  168. package/docs/tutorials/01-install-and-start.md +1 -1
  169. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  170. package/docs/tutorials/02-connect-chatgpt.md +4 -4
  171. package/docs/tutorials/02-connect-chatgpt.zh-CN.md +4 -4
  172. package/docs/wiki/Implementation.md +1 -1
  173. package/package.json +23 -14
  174. package/packages/kernel/controller/api/index.ts +2 -0
  175. package/packages/kernel/controller/application/controller-round-service.ts +29 -0
  176. package/packages/kernel/controller/application/controller-service.ts +30 -0
  177. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +308 -0
  178. package/packages/kernel/controller/domain/controller-round.ts +107 -0
  179. package/packages/kernel/controller/domain/execution-quality.ts +133 -0
  180. package/packages/kernel/controller/domain/types.ts +56 -0
  181. package/packages/kernel/controller/index.ts +1 -0
  182. package/packages/kernel/controller/infrastructure/controller-binding-store.ts +84 -0
  183. package/packages/kernel/controller/infrastructure/controller-round-store.ts +1384 -0
  184. package/packages/kernel/controller/infrastructure/controller-session-store.ts +578 -0
  185. package/packages/kernel/controller/ports/controller-host.ts +16 -0
  186. package/packages/kernel/goal/api/index.ts +1 -0
  187. package/packages/kernel/goal/domain/types.ts +40 -0
  188. package/packages/kernel/goal/index.ts +1 -0
  189. package/packages/kernel/identity/api/index.ts +5 -0
  190. package/packages/kernel/identity/application/identity-service.ts +67 -0
  191. package/packages/kernel/identity/domain/scope.ts +63 -0
  192. package/packages/kernel/identity/domain/semantic-sync.ts +81 -0
  193. package/packages/kernel/identity/domain/types.ts +44 -0
  194. package/packages/kernel/identity/domain/workspace.ts +56 -0
  195. package/packages/kernel/identity/index.ts +1 -0
  196. package/packages/kernel/identity/infrastructure/identity-store.ts +75 -0
  197. package/packages/kernel/memory/api/index.ts +5 -0
  198. package/packages/kernel/memory/application/experience-service.ts +118 -0
  199. package/packages/kernel/memory/application/outcome-service.ts +77 -0
  200. package/packages/kernel/memory/domain/experience.ts +103 -0
  201. package/packages/kernel/memory/domain/operational-prior.ts +92 -0
  202. package/packages/kernel/memory/index.ts +1 -0
  203. package/packages/kernel/progression/api/index.ts +2 -0
  204. package/packages/kernel/progression/application/projector.ts +211 -0
  205. package/packages/kernel/progression/domain/types.ts +116 -0
  206. package/packages/kernel/progression/index.ts +1 -0
  207. package/packages/kernel/scheduler/api/index.ts +6 -0
  208. package/packages/kernel/scheduler/application/continuation-service.ts +212 -0
  209. package/packages/kernel/scheduler/application/eligibility.ts +252 -0
  210. package/packages/kernel/scheduler/application/schedule-service.ts +24 -0
  211. package/packages/kernel/scheduler/application/settlement.ts +197 -0
  212. package/packages/kernel/scheduler/domain/continuation.ts +38 -0
  213. package/packages/kernel/scheduler/domain/schedule.ts +149 -0
  214. package/packages/kernel/scheduler/index.ts +1 -0
  215. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +38 -0
  216. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +785 -0
  217. package/packages/kernel/work/api/index.ts +15 -0
  218. package/packages/kernel/work/application/work-service.ts +148 -0
  219. package/packages/kernel/work/domain/admission-policy.ts +34 -0
  220. package/packages/kernel/work/domain/check-receipt.ts +43 -0
  221. package/packages/kernel/work/domain/context-closure-receipt.ts +32 -0
  222. package/packages/kernel/work/domain/engineering-contracts.ts +157 -0
  223. package/packages/kernel/work/domain/engineering-design.ts +281 -0
  224. package/packages/kernel/work/domain/engineering-profile.ts +242 -0
  225. package/packages/kernel/work/domain/execution-concurrency.ts +254 -0
  226. package/packages/kernel/work/domain/execution-snapshot.ts +33 -0
  227. package/packages/kernel/work/domain/implementation-review.ts +510 -0
  228. package/packages/kernel/work/domain/project-engineering-contract.ts +202 -0
  229. package/packages/kernel/work/domain/repository-completion-receipt.ts +73 -0
  230. package/packages/kernel/work/domain/state-machine.ts +259 -0
  231. package/packages/kernel/work/domain/types.ts +528 -0
  232. package/packages/kernel/work/index.ts +1 -0
  233. package/packages/kernel/work/infrastructure/work-contract-store.ts +1876 -0
  234. package/packages/kernel/work/ports/work-contract-store.ts +18 -0
  235. package/packages/plugin-runtime/browser/index.ts +3 -0
  236. package/packages/plugin-runtime/browser/provider-registry.ts +110 -0
  237. package/packages/plugin-runtime/browser/runtime-contract.ts +150 -0
  238. package/packages/plugin-runtime/browser/session-authority.ts +61 -0
  239. package/packages/plugin-runtime/computer/index.ts +6 -0
  240. package/packages/plugin-runtime/computer/provider-error.ts +26 -0
  241. package/packages/plugin-runtime/computer/provider-registration.ts +52 -0
  242. package/packages/plugin-runtime/computer/provider-registry.ts +63 -0
  243. package/packages/plugin-runtime/computer/provider.ts +19 -0
  244. package/packages/plugin-runtime/computer/target-authority.ts +190 -0
  245. package/packages/plugin-runtime/computer/target-persistence.ts +54 -0
  246. package/packages/plugin-runtime/external/index.ts +1 -0
  247. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +457 -0
  248. package/packages/plugin-runtime/index.ts +3 -0
  249. package/packages/protocols/browser/index.ts +1 -0
  250. package/packages/protocols/browser/session.ts +98 -0
  251. package/packages/protocols/computer/contract.ts +199 -0
  252. package/packages/protocols/computer/index.ts +1 -0
  253. package/packages/protocols/failure/contract.ts +158 -0
  254. package/packages/protocols/failure/index.ts +1 -0
  255. package/packages/protocols/handoff/index.ts +1 -0
  256. package/packages/protocols/handoff/status.ts +22 -0
  257. package/packages/protocols/mcp/execution-context.ts +11 -0
  258. package/packages/protocols/mcp/index.ts +2 -0
  259. package/packages/protocols/mcp/tool-contract.ts +42 -0
  260. package/packages/workflow-runtime/api/index.ts +2 -0
  261. package/packages/workflow-runtime/application/interpreter.ts +342 -0
  262. package/packages/workflow-runtime/domain/workflow-asset.ts +223 -0
  263. package/packages/workflow-runtime/index.ts +1 -0
  264. package/scripts/assemble-template.ts +1 -1
  265. package/scripts/benchmark-computer-hotpath.ts +255 -0
  266. package/scripts/benchmark-controller-round2.ts +54 -2
  267. package/scripts/benchmark-ios-agent-device.ts +3 -6
  268. package/scripts/benchmark-mcp-transport.ts +3 -4
  269. package/scripts/benchmark-operational-memory-activation.ts +235 -0
  270. package/scripts/benchmark-operational-shadow.ts +28 -0
  271. package/scripts/bootstrap-runtime-maintenance-recovery.sh +4 -1
  272. package/scripts/canary-chatgpt-provider-delivery.ts +97 -0
  273. package/scripts/canary-controller-semantic-wait.ts +195 -0
  274. package/scripts/canary-global-hook.sh +2 -2
  275. package/scripts/check-mcp-compatibility.ts +173 -7
  276. package/scripts/check-platform-support.mjs +28 -2
  277. package/scripts/check-public-docs.sh +1 -1
  278. package/scripts/check-release-readiness.sh +1 -1
  279. package/scripts/check-repository-hygiene.mjs +92 -0
  280. package/scripts/check-runtime-architecture.mjs +1206 -95
  281. package/scripts/check-source-duplication.mjs +9 -1
  282. package/scripts/check-tarball-install-smoke.sh +98 -15
  283. package/scripts/controller-ngrok-rotation.sh +5 -4
  284. package/scripts/create-project-dirs.sh +10 -74
  285. package/scripts/forge-local-recovery-helper.mjs +204 -0
  286. package/scripts/forge-uu-remote-rescue-helper.d.mts +31 -0
  287. package/scripts/forge-uu-remote-rescue-helper.mjs +409 -0
  288. package/scripts/forge-windows-host-recovery-helper.mjs +136 -0
  289. package/scripts/hook-shim.sh +2 -2
  290. package/scripts/init-project.sh +12 -70
  291. package/scripts/install-desktop-operator-registration.ts +4 -2
  292. package/scripts/install-independent-windows-wsl-recovery.ts +125 -0
  293. package/scripts/install-standalone-recovery.ts +122 -10
  294. package/scripts/install-uu-remote-rescue-registration.ts +74 -0
  295. package/scripts/install-windows-host-recovery-registration.ts +22 -0
  296. package/scripts/lib/controller-home-env.sh +6 -3
  297. package/scripts/lib/project-init-lib.sh +39 -582
  298. package/scripts/migrate-chatgpt-automation-schedules.ts +2 -2
  299. package/scripts/migrate-windows-wsl-controller-home.ts +306 -0
  300. package/scripts/open-source-audit-allowlist.txt +12 -1
  301. package/scripts/portability-bindings.mjs +70 -0
  302. package/scripts/run-bounded-command.mjs +55 -0
  303. package/scripts/run-bun-test-file.ts +22 -6
  304. package/scripts/run-governed-gate.ts +4 -1
  305. package/scripts/smoke-mcp-http-runtime.ts +1 -1
  306. package/scripts/smoke-runtime-recovery.ts +34 -1
  307. package/scripts/smoke-schedule-engine.ts +1 -1
  308. package/scripts/stage-runtime-release.ts +6 -1
  309. package/scripts/test-governance.ts +51 -2
  310. package/src/cli/agent-jobs/job-manager.ts +10 -1
  311. package/src/cli/chatgpt-browser/bind-server.ts +2 -1
  312. package/src/cli/chatgpt-browser/binding.ts +20 -10
  313. package/src/cli/chatgpt-browser/bridge-extension.ts +75 -0
  314. package/src/cli/chatgpt-browser/bridge-provider.ts +376 -11
  315. package/src/cli/chatgpt-browser/engine.ts +10 -11
  316. package/src/cli/chatgpt-browser/native-provider.ts +24 -83
  317. package/src/cli/chatgpt-browser/oracle-provider.ts +5 -3
  318. package/src/cli/chatgpt-browser/types.ts +1 -0
  319. package/src/cli/commands/bootstrap-control.ts +334 -0
  320. package/src/cli/commands/brain-assistant.ts +38 -0
  321. package/src/cli/commands/brain.ts +193 -40
  322. package/src/cli/commands/chatgpt.ts +127 -0
  323. package/src/cli/commands/computer.ts +437 -0
  324. package/src/cli/commands/doctor.ts +18 -1
  325. package/src/cli/commands/init-hook.ts +71 -61
  326. package/src/cli/commands/init.ts +3 -1
  327. package/src/cli/commands/mcp.ts +16 -10
  328. package/src/cli/commands/plugin.ts +38 -12
  329. package/src/cli/commands/recovery.ts +493 -80
  330. package/src/cli/commands/runtime.ts +9 -4
  331. package/src/cli/commands/setup-profile.ts +89 -39
  332. package/src/cli/commands/status.ts +2 -1
  333. package/src/cli/controller/check-runner.ts +487 -98
  334. package/src/cli/controller/context/types.ts +7 -1
  335. package/src/cli/controller/context-pack.ts +23 -3
  336. package/src/cli/controller/issue-store.ts +1 -1
  337. package/src/cli/controller/systemd-user.ts +110 -0
  338. package/src/cli/controller/types.ts +10 -70
  339. package/src/cli/controller/worklog.ts +67 -13
  340. package/src/cli/editing/edit-operation-contract.ts +92 -0
  341. package/src/cli/editing/edit-session.ts +289 -13
  342. package/src/cli/github/plugin.ts +17 -12
  343. package/src/cli/hook/route-registry.ts +3 -5
  344. package/src/cli/hook/runtime.ts +49 -3
  345. package/src/cli/index.ts +3 -0
  346. package/src/cli/local-bridge/connector-freshness.ts +2 -2
  347. package/src/cli/local-bridge/console-automations.ts +2 -2
  348. package/src/cli/local-bridge/facade-api.ts +41 -14
  349. package/src/cli/local-bridge/job-store.ts +1 -1
  350. package/src/cli/local-bridge/server.ts +24 -27
  351. package/src/cli/mcp/access-mode.ts +2 -132
  352. package/src/cli/mcp/access-tools.ts +2 -387
  353. package/src/cli/mcp/audit.ts +2 -32
  354. package/src/cli/mcp/auth.ts +2 -404
  355. package/src/cli/mcp/instructions.ts +2 -34
  356. package/src/cli/mcp/legacy-context.ts +2 -16
  357. package/src/cli/mcp/legacy-tool-service.ts +2 -5308
  358. package/src/cli/mcp/multi-repository.ts +2 -436
  359. package/src/cli/mcp/oauth.ts +2 -375
  360. package/src/cli/mcp/openai-secure-tunnel.ts +2 -0
  361. package/src/cli/mcp/paths.ts +2 -140
  362. package/src/cli/mcp/policy.ts +2 -232
  363. package/src/cli/mcp/post-finalize-work-attribution.ts +2 -150
  364. package/src/cli/mcp/proxy-env.ts +2 -62
  365. package/src/cli/mcp/readiness-projection.ts +2 -24
  366. package/src/cli/mcp/redaction.ts +2 -21
  367. package/src/cli/mcp/repo.ts +2 -24
  368. package/src/cli/mcp/repository-tools.ts +2 -1585
  369. package/src/cli/mcp/server.ts +2 -951
  370. package/src/cli/mcp/setup.ts +2 -737
  371. package/src/cli/mcp/tool-capability-cache.ts +2 -87
  372. package/src/cli/mcp/tool-contract.ts +2 -14
  373. package/src/cli/mcp/tools.ts +2 -9
  374. package/src/cli/mcp/toolset-names.ts +2 -70
  375. package/src/cli/mcp/toolset-selection.ts +2 -41
  376. package/src/cli/mcp/toolset.ts +2 -336
  377. package/src/cli/mcp/transports/AGENTS.md +1 -10
  378. package/src/cli/mcp/transports/CLAUDE.md +1 -10
  379. package/src/cli/mcp/transports/http.ts +2 -1414
  380. package/src/cli/mcp/transports/session-registry.ts +2 -490
  381. package/src/cli/mcp/transports/stdio.ts +2 -8
  382. package/src/cli/mcp/types.ts +2 -41
  383. package/src/cli/mcp/umbrella-tools.ts +2 -117
  384. package/src/cli/repositories/command-executor.ts +64 -18
  385. package/src/cli/repositories/command-scope.ts +117 -1
  386. package/src/cli/repositories/controller-home.ts +119 -1
  387. package/src/cli/repositories/identity.ts +13 -0
  388. package/src/cli/repositories/registry.ts +68 -49
  389. package/src/cli/repositories/repository-snapshot.ts +53 -7
  390. package/src/cli/repositories/runtime-storage.ts +27 -2
  391. package/src/cli/repositories/safe-patch.ts +34 -38
  392. package/src/cli/repositories/selected-path-actions.ts +22 -2
  393. package/src/cli/repositories/structured-git.ts +105 -25
  394. package/src/cli/runtime/helper-runner.ts +7 -0
  395. package/src/cli/runtime-invocation.ts +8 -1
  396. package/src/cli/tools/codegraph.ts +44 -25
  397. package/src/core/adoption/manifest-templates.ts +1 -1
  398. package/src/core/adoption/plan.ts +3 -26
  399. package/src/core/adoption/workflow-contract-plan.ts +17 -9
  400. package/src/effects/process-runner.ts +8 -14
  401. package/src/runtime/context/assistant-context.ts +154 -0
  402. package/src/runtime/context/assistant-work-context.ts +147 -0
  403. package/src/runtime/context/codegraph-cache-boundary.ts +255 -0
  404. package/src/runtime/context/codegraph-read-provider.ts +55 -22
  405. package/src/runtime/context/codegraph-sidecar.cjs +8 -1
  406. package/src/runtime/context/context-closure.ts +268 -0
  407. package/src/runtime/context/context-plane.ts +211 -0
  408. package/src/runtime/context/project-engineering-contract.ts +60 -0
  409. package/src/runtime/control-plane/bootstrap/capability-provider.ts +74 -0
  410. package/src/runtime/control-plane/bootstrap/control-api.ts +57 -0
  411. package/src/runtime/control-plane/bootstrap/index.ts +5 -0
  412. package/src/runtime/control-plane/bootstrap/state-machine.ts +141 -0
  413. package/src/runtime/control-plane/bootstrap/store.ts +21 -0
  414. package/src/runtime/control-plane/bootstrap/types.ts +87 -0
  415. package/src/runtime/control-plane/cleanup-artifact-retention.ts +328 -0
  416. package/src/runtime/control-plane/codegraph-cache-retention.ts +164 -0
  417. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +320 -0
  418. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +169 -0
  419. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +350 -0
  420. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +85 -0
  421. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +417 -100
  422. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +103 -15
  423. package/src/runtime/control-plane/execution/implementation-review-content.ts +95 -0
  424. package/src/runtime/control-plane/execution/repository-work-attribution.ts +2 -2
  425. package/src/runtime/control-plane/execution/retained-work-resume.ts +336 -6
  426. package/src/runtime/control-plane/execution/validation.ts +28 -3
  427. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +116 -0
  428. package/src/runtime/control-plane/execution/work-completion-authority.ts +44 -2
  429. package/src/runtime/control-plane/execution/work-evidence-policy.ts +34 -3
  430. package/src/runtime/control-plane/execution/work-execution-support.ts +42 -22
  431. package/src/runtime/control-plane/execution/work-finalization-service.ts +1103 -166
  432. package/src/runtime/control-plane/execution/work-handle-authority.ts +267 -16
  433. package/src/runtime/control-plane/execution/work-handle-store.ts +77 -0
  434. package/src/runtime/control-plane/execution/work-head-settlement.ts +75 -0
  435. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +145 -23
  436. package/src/runtime/control-plane/execution/work-operation-service.ts +49 -13
  437. package/src/runtime/control-plane/execution/work-preparation-service.ts +31 -15
  438. package/src/runtime/control-plane/execution/work-remote-delivery.ts +1 -1
  439. package/src/runtime/control-plane/execution/work-task-receipt.ts +20 -1
  440. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +407 -76
  441. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +88 -18
  442. package/src/runtime/control-plane/execution/work-verification-context.ts +1 -1
  443. package/src/runtime/control-plane/execution/work-verification-service.ts +258 -4
  444. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +200 -15
  445. package/src/runtime/control-plane/facade/capability-registry.ts +21 -10
  446. package/src/runtime/control-plane/facade/controller-round-relay.ts +3 -1118
  447. package/src/runtime/control-plane/facade/controller-session-store.ts +2 -488
  448. package/src/runtime/control-plane/facade/goal-workloop-access.ts +6 -3
  449. package/src/runtime/control-plane/facade/goal-workloop.ts +972 -137
  450. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +158 -0
  451. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +10 -0
  452. package/src/runtime/control-plane/facade/index.ts +4 -2
  453. package/src/runtime/control-plane/facade/operation-digest.ts +22 -58
  454. package/src/runtime/control-plane/facade/plan-contract-store.ts +1004 -38
  455. package/src/runtime/control-plane/facade/repository-work-admission.ts +19 -1
  456. package/src/runtime/control-plane/facade/requirement-authority.ts +218 -0
  457. package/src/runtime/control-plane/facade/requirement-board.ts +6 -1
  458. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +48 -0
  459. package/src/runtime/control-plane/facade/semantic-admission.ts +8 -16
  460. package/src/runtime/control-plane/facade/suggested-actions.ts +4 -1
  461. package/src/runtime/control-plane/facade/types.ts +189 -532
  462. package/src/runtime/control-plane/facade/work-admission-policy.ts +84 -35
  463. package/src/runtime/control-plane/facade/work-contract-store.ts +2 -1043
  464. package/src/runtime/control-plane/facade/work-implementation-review.ts +2 -0
  465. package/src/runtime/control-plane/facade/work-state-machine.ts +2 -250
  466. package/src/runtime/control-plane/generated-cache-retention.ts +239 -18
  467. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +12 -1
  468. package/src/runtime/control-plane/global-scheduler/maintenance.ts +76 -13
  469. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-entry.ts +55 -0
  470. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-process.ts +98 -0
  471. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +1 -1
  472. package/src/runtime/control-plane/global-scheduler/scheduler-worker-entry.ts +10 -0
  473. package/src/runtime/control-plane/global-scheduler/scheduler.ts +173 -81
  474. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +18 -6
  475. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +397 -0
  476. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +2 -177
  477. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +301 -560
  478. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +20 -4
  479. package/src/runtime/control-plane/launcher/thin-launcher.ts +50 -4
  480. package/src/runtime/control-plane/lifecycle-retention-metrics.ts +60 -0
  481. package/src/runtime/control-plane/persistence/experience-store.ts +169 -0
  482. package/src/runtime/control-plane/persistence/operational-prior-store.ts +348 -0
  483. package/src/runtime/control-plane/persistence/requirement-store.ts +30 -22
  484. package/src/runtime/control-plane/persistence/sqlite-store.ts +545 -76
  485. package/src/runtime/control-plane/persistence/workflow-content-store.ts +98 -0
  486. package/src/runtime/control-plane/persistence/workflow-registry-store.ts +186 -0
  487. package/src/runtime/control-plane/persistence/workflow-run-store.ts +123 -0
  488. package/src/runtime/control-plane/release-retention.ts +56 -16
  489. package/src/runtime/control-plane/repository-namespace-retention.ts +208 -0
  490. package/src/runtime/control-plane/routing/route-policy.ts +19 -0
  491. package/src/runtime/control-plane/runtime-cleanup.ts +574 -37
  492. package/src/runtime/control-plane/runtime-generation.ts +6 -0
  493. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +465 -0
  494. package/src/runtime/control-plane/workspace/workspace-store.ts +80 -0
  495. package/src/runtime/diagnostics/incident-repair.ts +406 -0
  496. package/src/runtime/diagnostics/mcp-timing.ts +125 -6
  497. package/src/runtime/diagnostics/performance.ts +6 -14
  498. package/src/runtime/diagnostics/read-only-tool.ts +1 -1
  499. package/src/runtime/evidence/artifact-store.ts +65 -2
  500. package/src/runtime/evidence/operational-shadow.ts +38 -0
  501. package/src/runtime/evidence/process-check-receipt.ts +5 -43
  502. package/src/runtime/evidence/sensitive-output.ts +4 -4
  503. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -1
  504. package/src/runtime/execution/jobs/store.ts +121 -2
  505. package/src/runtime/execution/managed-workspace.ts +55 -5
  506. package/src/runtime/execution/process-runtime/canary.ts +19 -5
  507. package/src/runtime/execution/process-runtime/check-classification.ts +48 -0
  508. package/src/runtime/execution/process-runtime/check-facade.ts +23 -9
  509. package/src/runtime/execution/process-runtime/check-receipt.ts +1 -1
  510. package/src/runtime/execution/process-runtime/check-result-retention.ts +132 -0
  511. package/src/runtime/execution/process-runtime/check-result.ts +73 -2
  512. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +42 -3
  513. package/src/runtime/execution/process-runtime/check-storage.ts +187 -0
  514. package/src/runtime/execution/process-runtime/command-facade.ts +38 -87
  515. package/src/runtime/execution/process-runtime/index.ts +1 -0
  516. package/src/runtime/execution/process-runtime/interactive-admission.ts +2 -1
  517. package/src/runtime/execution/process-runtime/lightweight-managed.ts +32 -1
  518. package/src/runtime/execution/process-runtime/persisted-check.ts +128 -21
  519. package/src/runtime/execution/process-runtime/resource-claims.ts +60 -3
  520. package/src/runtime/execution/process-runtime/runtime.ts +132 -15
  521. package/src/runtime/execution/process-runtime/types.ts +22 -0
  522. package/src/runtime/execution/workers/executor.ts +16 -13
  523. package/src/runtime/execution/workers/worker-entry.ts +1 -1
  524. package/src/runtime/gateway/mcp/execution-tools.ts +2 -207
  525. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +2 -61
  526. package/src/runtime/gateway/mcp/persisted-check-process.ts +2 -3
  527. package/src/runtime/gateway/mcp/process-tools.ts +2 -289
  528. package/src/runtime/gateway/mcp/router.ts +2 -1125
  529. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +2 -565
  530. package/src/runtime/gateway/mcp/runtime-tools.ts +2 -6651
  531. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +2 -1
  532. package/src/runtime/maintenance/cleanup.ts +38 -24
  533. package/src/runtime/platform/browser-product-discovery.ts +174 -0
  534. package/src/runtime/platform/computer-platform.ts +14 -0
  535. package/src/runtime/platform/executable-discovery.ts +54 -0
  536. package/src/runtime/platform/fetch-http-server.ts +90 -0
  537. package/src/runtime/platform/service-manager.ts +138 -0
  538. package/src/runtime/platform/windows-host-discovery.ts +118 -0
  539. package/src/runtime/platform/windows-recovery-deployment.ts +67 -0
  540. package/src/runtime/plugins/action-application.ts +135 -0
  541. package/src/runtime/plugins/app-store-connect-adapter.ts +9 -21
  542. package/src/runtime/plugins/browser-adapter.ts +140 -100
  543. package/src/runtime/plugins/browser-automation-service.ts +15 -36
  544. package/src/runtime/plugins/browser-macos-bridge.ts +69 -21
  545. package/src/runtime/plugins/browser-manifest-surface.ts +30 -6
  546. package/src/runtime/plugins/browser-native-session-service.ts +1 -1
  547. package/src/runtime/plugins/browser-provider-registry.ts +2 -109
  548. package/src/runtime/plugins/browser-registration.ts +16 -0
  549. package/src/runtime/plugins/browser-runtime-contract.ts +2 -154
  550. package/src/runtime/plugins/browser-runtime.ts +41 -9
  551. package/src/runtime/plugins/browser-session-authority.ts +101 -291
  552. package/src/runtime/plugins/browser-session-legacy-migration.ts +203 -0
  553. package/src/runtime/plugins/browser-session-store.ts +229 -36
  554. package/src/runtime/plugins/browser-session-types.ts +2 -98
  555. package/src/runtime/plugins/capability-authorization-grants.ts +17 -0
  556. package/src/runtime/plugins/catalog-trust.ts +82 -0
  557. package/src/runtime/plugins/computer-registration.ts +839 -0
  558. package/src/runtime/plugins/config-store.ts +119 -0
  559. package/src/runtime/plugins/desktop-operator-external-policy.ts +932 -0
  560. package/src/runtime/plugins/desktop-operator-registration.ts +111 -8
  561. package/src/runtime/plugins/errors.ts +8 -1
  562. package/src/runtime/plugins/external-adapter.ts +45 -322
  563. package/src/runtime/plugins/external-provider-policy.ts +48 -0
  564. package/src/runtime/plugins/external-registration.ts +9 -1
  565. package/src/runtime/plugins/external-unix-socket-probe.cjs +9 -3
  566. package/src/runtime/plugins/external-unix-socket.ts +64 -193
  567. package/src/runtime/plugins/first-party-external-registration.ts +163 -0
  568. package/src/runtime/plugins/first-party-registry.ts +3 -1
  569. package/src/runtime/plugins/github-adapter.ts +1 -2
  570. package/src/runtime/plugins/gmail-adapter.ts +6 -6
  571. package/src/runtime/plugins/google-calendar-adapter.ts +6 -6
  572. package/src/runtime/plugins/google-shared.ts +31 -46
  573. package/src/runtime/plugins/google-tasks-adapter.ts +6 -6
  574. package/src/runtime/plugins/ios-adapter.ts +1 -2
  575. package/src/runtime/plugins/local-system-adapter.ts +180 -0
  576. package/src/runtime/plugins/macos-capability-broker.ts +15 -105
  577. package/src/runtime/plugins/resend-adapter.ts +15 -24
  578. package/src/runtime/plugins/store.ts +493 -51
  579. package/src/runtime/plugins/types.ts +8 -1
  580. package/src/runtime/plugins/uu-remote-rescue-registration.ts +155 -0
  581. package/src/runtime/plugins/windows-host-recovery-install.ts +68 -0
  582. package/src/runtime/plugins/windows-host-recovery-registration.ts +85 -0
  583. package/src/runtime/plugins/xiaohongshu-publish.ts +86 -430
  584. package/src/runtime/projections/controller-context.ts +12 -6
  585. package/src/runtime/projections/git-status-sampler.ts +73 -22
  586. package/src/runtime/projections/materialized-view.ts +14 -8
  587. package/src/runtime/recovery/capability-action-application.ts +228 -0
  588. package/src/runtime/recovery/index.ts +3 -0
  589. package/src/runtime/recovery/lifecycle-inventory.ts +338 -0
  590. package/src/runtime/recovery/local-jobs-repair.ts +14 -14
  591. package/src/runtime/recovery/maintenance-executor.ts +358 -76
  592. package/src/runtime/recovery/quarantine-retention.ts +256 -0
  593. package/src/runtime/release/identity.ts +6 -0
  594. package/src/runtime/resources/leases/store.ts +1 -1
  595. package/src/runtime/root/active-execution-power-assertion.ts +139 -0
  596. package/src/runtime/root/assistant-learning-loop.ts +45 -0
  597. package/src/runtime/root/browser-session-composition.ts +59 -0
  598. package/src/runtime/root/computer-composition.ts +191 -0
  599. package/src/runtime/root/computer-target-composition.ts +16 -0
  600. package/src/runtime/root/computer-target-persistence.ts +39 -0
  601. package/src/runtime/root/controller-round-composition.ts +107 -0
  602. package/src/runtime/root/controller-services.ts +2 -0
  603. package/src/runtime/root/entry.ts +4 -3
  604. package/src/runtime/root/gateway-adapter.ts +3 -3
  605. package/src/runtime/root/local-bridge.ts +5 -2
  606. package/src/runtime/root/mcp-transport.ts +5 -5
  607. package/src/runtime/root/package-connector-service.ts +108 -56
  608. package/src/runtime/root/package-runtime-release.ts +86 -18
  609. package/src/runtime/root/package-runtime-service.ts +63 -86
  610. package/src/runtime/root/release-execution-canary.ts +71 -0
  611. package/src/runtime/root/release-loader.ts +68 -0
  612. package/src/runtime/root/release-manifest.ts +106 -2
  613. package/src/runtime/root/release-materialize.ts +103 -4
  614. package/src/runtime/root/release-store.ts +31 -2
  615. package/src/runtime/root/runtime.ts +240 -25
  616. package/src/runtime/root/scheduled-controller-composition.ts +51 -0
  617. package/src/runtime/root/scheduler.ts +12 -4
  618. package/src/runtime/root/service-runner.ts +1 -1
  619. package/src/runtime/root/service.ts +41 -16
  620. package/src/runtime/root/status.ts +1 -0
  621. package/src/runtime/root/types.ts +24 -1
  622. package/src/runtime/shared/local-bridge-surface.ts +1 -1
  623. package/src/runtime/shared/process-environment.ts +19 -4
  624. package/src/runtime/shared/storage-capacity.ts +68 -0
  625. package/src/runtime/standalone-recovery/controller-home-migration.ts +1116 -0
  626. package/src/runtime/standalone-recovery/core.ts +984 -230
  627. package/src/runtime/standalone-recovery/entry.ts +182 -51
  628. package/src/runtime/standalone-recovery/independent-host-rescue.ts +172 -0
  629. package/src/runtime/standalone-recovery/installer.ts +212 -104
  630. package/src/runtime/standalone-recovery/mcp-server.ts +243 -0
  631. package/src/runtime/standalone-recovery/mutation-identity-contract.ts +21 -0
  632. package/src/runtime/standalone-recovery/operation-lock.ts +160 -0
  633. package/src/runtime/standalone-recovery/performance.ts +135 -0
  634. package/src/runtime/standalone-recovery/release.ts +5 -0
  635. package/src/runtime/watchdog/workflow-watchdog.ts +1 -1
  636. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +1 -1
  637. package/src/runtime/workflow/schedules/engine.ts +191 -343
  638. package/src/runtime/workflow/schedules/pending-activation.ts +1 -1
  639. package/src/runtime/workflow/schedules/settlement.ts +2 -191
  640. package/src/runtime/workflow/schedules/store.ts +2 -607
  641. package/src/runtime/workflow/schedules/types.ts +2 -127
  642. package/src/runtime/workflow/schedules/work-continuation.ts +180 -15
  643. package/src/runtime/workflows/first-party/xiaohongshu.ts +122 -0
  644. package/src/runtime/workflows/runtime.ts +486 -0
  645. package/src/testing/test-governance.ts +90 -29
  646. package/assets/templates/helpers/archive-architecture-request.sh +0 -244
  647. package/docs/architecture/history/README.md +0 -7
  648. package/docs/architecture/history/chatgpt-handoff-facade.md +0 -397
  649. package/docs/architecture/history/global-hook-runtime.md +0 -166
  650. package/docs/architecture/history/ios-semantic-automation-provider-v2.md +0 -170
  651. package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  652. package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +0 -59
  653. package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +0 -59
  654. package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +0 -59
  655. package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +0 -59
  656. package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  657. package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  658. package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  659. package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  660. package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +0 -59
  661. package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  662. package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  663. package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  664. package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  665. package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  666. package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  667. package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  668. package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  669. package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  670. package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +0 -59
  671. package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +0 -59
  672. package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +0 -63
  673. package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  674. package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  675. package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  676. package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  677. package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +0 -60
  678. package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +0 -60
  679. package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +0 -68
  680. package/docs/architecture/requests/archive/2026/root.md +0 -68
  681. package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +0 -76
  682. package/docs/architecture/requests/archive/2026/verification-evals-checks.md +0 -68
  683. package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +0 -69
  684. package/scripts/archive-architecture-request.sh +0 -4
  685. package/scripts/run-skill-evals.ts +0 -1022
@@ -1,8 +1,13 @@
1
1
  import {
2
+ failWorkContract,
2
3
  getWorkContract,
4
+ recordWorkEvidenceState,
5
+ requestWorkImplementationReview,
3
6
  transitionWorkContractPhase,
4
7
  updateWorkContract,
5
- } from '../facade/work-contract-store';
8
+ workRequiresImplementationReview,
9
+ latestImplementationReview,
10
+ } from '../../../../packages/kernel/work/api/index';
6
11
  import {
7
12
  listValidatingWorkHandles,
8
13
  transitionWorkHandle,
@@ -53,7 +58,26 @@ export function markWorkValidationPending(controllerHome: string, handle: WorkHa
53
58
  const evidenceState = contract.evidenceState === 'valid' || contract.evidenceState === 'stale'
54
59
  ? 'stale'
55
60
  : 'partial';
56
- if (contract.evidenceState !== evidenceState) updateWorkContract(options, contractId, { evidenceState });
61
+ if (contract.evidenceState !== evidenceState) recordWorkEvidenceState(options, contractId, evidenceState);
62
+ }
63
+
64
+ /**
65
+ * Re-bind aggregate validation authority after the physical Work validator has
66
+ * proved that every requested check is satisfied by an exact-current persisted
67
+ * valid_pass receipt. This is not a new validation run: no check was executed
68
+ * and source/workspace/check identity did not change, so an already-approved
69
+ * implementation review remains authoritative.
70
+ */
71
+ export function markWorkValidationCurrentFromReusedEvidence(controllerHome: string, handle: WorkHandleState): void {
72
+ if (handle.finalization.validation !== 'done' || !handle.validatedInputFingerprint) {
73
+ throw new Error('WORK_REUSED_VALIDATION_AUTHORITY_INCOMPLETE');
74
+ }
75
+ const contractId = handle.workContractId;
76
+ if (!contractId) return;
77
+ const options = { controllerHome, repoId: handle.repositoryId };
78
+ const contract = getWorkContract(options, contractId);
79
+ if (!contract || contract.completionReceipt) return;
80
+ if (contract.evidenceState !== 'valid') recordWorkEvidenceState(options, contractId, 'valid');
57
81
  }
58
82
 
59
83
  /**
@@ -61,11 +85,17 @@ export function markWorkValidationPending(controllerHome: string, handle: WorkHa
61
85
  * Process and Check records contribute evidence only; they never become a
62
86
  * second completion or lifecycle authority.
63
87
  */
88
+ export interface WorkValidationProjectionCandidate {
89
+ sourceRevision: string;
90
+ workspaceFingerprint: string;
91
+ }
92
+
64
93
  export function projectWorkValidationOutcome(
65
94
  controllerHome: string,
66
95
  handle: WorkHandleState,
67
96
  outcome: Exclude<WorkValidationOutcome, 'not_validating' | 'running'>,
68
97
  summary?: string,
98
+ candidate?: WorkValidationProjectionCandidate,
69
99
  ): void {
70
100
  const contractId = handle.workContractId;
71
101
  if (!contractId) return;
@@ -74,26 +104,63 @@ export function projectWorkValidationOutcome(
74
104
  if (!contract || contract.completionReceipt) return;
75
105
 
76
106
  if (outcome === 'passed') {
107
+ // Validation reconciliation may be replayed during finalization. A receipt
108
+ // that is already current must not rewind an active or explicitly approved
109
+ // review. A genuinely new validation first marks evidence stale/partial, so
110
+ // only that path may re-enter verification/review. No-check commit transfer
111
+ // can preserve an approved review before evidenceState itself is projected.
112
+ const validationWasRearmed = contract.evidenceState === 'stale' || contract.evidenceState === 'partial';
113
+ const currentReviewIsAuthoritative = contract.phase === 'review' && contract.evidenceState === 'valid';
114
+ const latestReview = latestImplementationReview(contract.implementationReviews);
115
+ const approvedReviewMatchesCurrentCandidate = Boolean(
116
+ candidate
117
+ && contract.phase === 'delivery'
118
+ && contract.phaseEvidence.review.state === 'satisfied'
119
+ && latestReview?.decision === 'approved'
120
+ && latestReview.sourceRevision === candidate.sourceRevision
121
+ && latestReview.verificationWorkspaceFingerprint === candidate.workspaceFingerprint
122
+ );
123
+ const approvedDeliveryIsAuthoritative = contract.phase === 'delivery'
124
+ && contract.phaseEvidence.review.state === 'satisfied'
125
+ && (!validationWasRearmed || approvedReviewMatchesCurrentCandidate);
126
+ if (currentReviewIsAuthoritative || approvedDeliveryIsAuthoritative) {
127
+ if (approvedReviewMatchesCurrentCandidate && contract.evidenceState !== 'valid') {
128
+ recordWorkEvidenceState(options, contractId, 'valid');
129
+ }
130
+ return;
131
+ }
132
+ const verified = transitionWorkContractPhase(options, contractId, {
133
+ phase: 'verification',
134
+ status: 'running',
135
+ state: 'satisfied',
136
+ summary: summary ?? 'All requested validation receipts passed.',
137
+ evidenceRefs: contract.evidenceRefs,
138
+ });
139
+ recordWorkEvidenceState(options, contractId, 'valid');
140
+ if (workRequiresImplementationReview(verified.workKind, verified.scopeEvidence?.actualChangedPaths ?? [])) {
141
+ requestWorkImplementationReview(
142
+ options,
143
+ contractId,
144
+ 'Validation receipts passed; explicit Controller implementation review is required before delivery.',
145
+ );
146
+ return;
147
+ }
77
148
  transitionWorkContractPhase(options, contractId, {
78
149
  phase: 'delivery',
79
150
  status: 'running',
80
151
  state: 'active',
81
- summary: summary ?? 'All requested validation receipts passed; delivery is next.',
82
- evidenceRefs: contract.evidenceRefs,
152
+ summary: 'Validation receipts passed and this Work kind does not require implementation review; delivery is next.',
153
+ evidenceRefs: verified.evidenceRefs,
83
154
  });
84
- updateWorkContract(options, contractId, { evidenceState: 'valid' });
85
155
  return;
86
156
  }
87
157
 
88
158
  if (outcome === 'failed') {
89
- transitionWorkContractPhase(options, contractId, {
90
- phase: 'cleanup',
91
- status: 'failed',
92
- state: 'failed',
93
- summary: summary ?? 'A requested validation check failed; terminal cleanup is next.',
159
+ failWorkContract(options, contractId, {
160
+ phase: contract.phase,
161
+ summary: summary ?? `A requested validation check failed while Work was in ${contract.phase}.`,
94
162
  evidenceRefs: contract.evidenceRefs,
95
163
  });
96
- updateWorkContract(options, contractId, { evidenceState: 'failed' });
97
164
  return;
98
165
  }
99
166
 
@@ -101,12 +168,15 @@ export function projectWorkValidationOutcome(
101
168
  phase: 'verification',
102
169
  status: 'running',
103
170
  state: 'blocked',
171
+ dispatchState: 'blocked',
104
172
  summary: summary ?? 'Validation infrastructure failed; retain the finite Work for retry without treating this as an acceptance failure.',
105
173
  evidenceRefs: contract.evidenceRefs,
106
174
  });
107
- updateWorkContract(options, contractId, {
108
- evidenceState: contract.evidenceState === 'valid' || contract.evidenceState === 'stale' ? 'stale' : 'partial',
109
- });
175
+ recordWorkEvidenceState(
176
+ options,
177
+ contractId,
178
+ contract.evidenceState === 'valid' || contract.evidenceState === 'stale' ? 'stale' : 'partial',
179
+ );
110
180
  }
111
181
 
112
182
  function settleInfrastructureFailure(
@@ -115,7 +185,7 @@ function settleInfrastructureFailure(
115
185
  summary: string,
116
186
  ): WorkValidationReconciliation {
117
187
  const next = transitionWorkHandle(controllerHome, handle, 'failed', {
118
- finalization: { ...handle.finalization, validation: 'failed', lastError: summary },
188
+ finalization: { ...handle.finalization, validation: 'failed', failureCode: undefined, lastError: summary },
119
189
  validationRun: undefined,
120
190
  failureReason: summary,
121
191
  });
@@ -141,7 +211,7 @@ export function reconcileWorkValidation(
141
211
 
142
212
  if (run.requestedChecks.length === 0) {
143
213
  const next = transitionWorkHandle(controllerHome, handle, run.resumeState, {
144
- finalization: { ...handle.finalization, validation: 'done', lastError: undefined },
214
+ finalization: { ...handle.finalization, validation: 'done', failureCode: undefined, lastError: undefined },
145
215
  validationRun: undefined,
146
216
  validatedInputFingerprint: run.fingerprint,
147
217
  failureReason: undefined,
@@ -203,7 +273,7 @@ export function reconcileWorkValidation(
203
273
  return settleInfrastructureFailure(controllerHome, handle, receipt.summary);
204
274
  }
205
275
  const next = transitionWorkHandle(controllerHome, handle, 'failed', {
206
- finalization: { ...handle.finalization, validation: 'failed', lastError: receipt.summary },
276
+ finalization: { ...handle.finalization, validation: 'failed', failureCode: undefined, lastError: receipt.summary },
207
277
  validationRun: undefined,
208
278
  failureReason: receipt.summary,
209
279
  });
@@ -217,7 +287,7 @@ export function reconcileWorkValidation(
217
287
  }
218
288
 
219
289
  const next = transitionWorkHandle(controllerHome, handle, run.resumeState, {
220
- finalization: { ...handle.finalization, validation: 'done', lastError: undefined },
290
+ finalization: { ...handle.finalization, validation: 'done', failureCode: undefined, lastError: undefined },
221
291
  validationRun: undefined,
222
292
  validatedInputFingerprint: run.fingerprint,
223
293
  failureReason: undefined,
@@ -1,7 +1,7 @@
1
1
  import { listControllerChecks, type ControllerCheck } from '../../../cli/controller/check-runner';
2
2
  import { selectRepositoryCheckout } from '../../../cli/repositories/registry';
3
3
  import type { RepositoryRecord } from '../../../cli/repositories/types';
4
- import { getWorkContract } from '../facade/work-contract-store';
4
+ import { getWorkContract } from '../../../../packages/kernel/work/api/index';
5
5
  import type { WorkContract } from '../facade/types';
6
6
 
7
7
  export interface WorkVerificationContext {
@@ -1,4 +1,5 @@
1
- import { readLatestControllerCheckEvidence } from '../../../cli/controller/check-runner';
1
+ import { createHash } from 'crypto';
2
+ import { controllerCheckExecutionIdentity, listControllerChecks, readLatestControllerCheckEvidence } from '../../../cli/controller/check-runner';
2
3
  import { repositoryGitStatus } from '../../../cli/repositories/structured-git';
3
4
  import type { RepositoryRecord } from '../../../cli/repositories/types';
4
5
  import {
@@ -10,12 +11,14 @@ import {
10
11
  runPersistedCheckViaProcessRuntime,
11
12
  } from '../../execution/process-runtime';
12
13
  import { classifyPersistedCheckTerminalEvidence } from '../../execution/process-runtime/check-result';
14
+ import { buildCheckExecutionSchedule } from '../../execution/process-runtime/check-scheduling';
15
+ import { ingestCheckCompletionGraceProcess } from '../persistence/operational-prior-store';
13
16
  import { buildFacadeResult } from '../facade/facade-result';
14
17
  import { classifyVerificationOutcome, normalizeCheckIds } from '../facade/check-normalization';
15
18
  import { verifyGoalWorkloop } from '../facade/goal-workloop';
16
- import type { FacadeResult, WorkContract } from '../facade/types';
19
+ import type { FacadeResult, VerificationRecord, WorkContract } from '../facade/types';
17
20
  import { executionIdentityForRepository } from './execution-identity';
18
- import { commandFingerprint, verificationInputFingerprint, workspaceValidationFingerprint } from './verification-evidence';
21
+ import { commandFingerprint, effectiveVerificationEvidence, verificationInputFingerprint, workspaceValidationFingerprint } from './verification-evidence';
19
22
  import { resolveWorkVerificationContext } from './work-verification-context';
20
23
 
21
24
  export interface ExecuteWorkVerificationInput {
@@ -45,6 +48,244 @@ function result(facade: FacadeResult, isError = false): ExecuteWorkVerificationR
45
48
  return { facade, isError };
46
49
  }
47
50
 
51
+ export interface ContentEquivalentWorkVerificationTransferPlan {
52
+ transferredRecords: VerificationRecord[];
53
+ reusableCheckIds: string[];
54
+ invalidatedCheckIds: string[];
55
+ }
56
+
57
+ /**
58
+ * Pure verification-transfer planner for a Forge-owned representation-only
59
+ * commit. It never mutates Work authority. The caller must persist the complete
60
+ * verification + derived-review + lifecycle transfer atomically.
61
+ */
62
+ export function planWorkVerificationAcrossContentEquivalentCommit(input: {
63
+ controllerHome: string;
64
+ repository: RepositoryRecord;
65
+ workId: string;
66
+ preCommitSourceRevision: string;
67
+ preCommitWorkspaceFingerprint: string;
68
+ postCommitSourceRevision: string;
69
+ postCommitWorkspaceFingerprint: string;
70
+ recordedAt?: string;
71
+ }): ContentEquivalentWorkVerificationTransferPlan {
72
+ const resolved = resolveWorkVerificationContext({
73
+ controllerHome: input.controllerHome,
74
+ repository: input.repository,
75
+ workId: input.workId,
76
+ });
77
+ if (!resolved.ok || !resolved.context.workContract) {
78
+ throw new Error(`WORK_VERIFICATION_TRANSFER_CONTEXT_REQUIRED: ${input.workId}`);
79
+ }
80
+ const { workContract, repository, checks } = resolved.context;
81
+ if (workContract.completionReceipt) throw new Error(`WORK_VERIFICATION_TRANSFER_WORK_TERMINAL: ${input.workId}`);
82
+ const requestedChecks = workContract.checks;
83
+ const checkById = new Map(listControllerChecks(repository.canonicalRoot).map((check) => [check.id, check] as const));
84
+ const transferredRecords: VerificationRecord[] = [];
85
+ const reusableCheckIds: string[] = [];
86
+ const invalidatedCheckIds: string[] = [];
87
+ const recordedAt = input.recordedAt ?? new Date().toISOString();
88
+
89
+ for (const checkId of requestedChecks) {
90
+ const check = checkById.get(checkId) ?? checks.find((entry) => entry.id === checkId);
91
+ const sourcePass = effectiveVerificationEvidence(workContract.checkRefs, {
92
+ sourceRevision: input.preCommitSourceRevision,
93
+ workspaceFingerprint: input.preCommitWorkspaceFingerprint,
94
+ checkId,
95
+ requestedChecks,
96
+ }).find((entry) => entry.current && entry.record.outcome === 'valid_pass' && Boolean(entry.record.receipt))?.record;
97
+ if (!check || !sourcePass?.receipt || check.effects?.git !== undefined) {
98
+ invalidatedCheckIds.push(checkId);
99
+ continue;
100
+ }
101
+ let currentExecutionIdentity;
102
+ try {
103
+ currentExecutionIdentity = controllerCheckExecutionIdentity(repository.canonicalRoot, checkId);
104
+ } catch {
105
+ invalidatedCheckIds.push(checkId);
106
+ continue;
107
+ }
108
+ const receipt = sourcePass.receipt;
109
+ const definitionUnchanged = Boolean(receipt.checkDefinitionDigest)
110
+ && receipt.checkDefinitionDigest === currentExecutionIdentity.definitionDigest;
111
+ const contentInputsUnchanged = Boolean(receipt.checkRevision)
112
+ && receipt.checkRevision === currentExecutionIdentity.revision;
113
+ const environmentUnchanged = Boolean(receipt.checkEnvironmentFingerprint)
114
+ && receipt.checkEnvironmentFingerprint === currentExecutionIdentity.environmentFingerprint;
115
+ if (!definitionUnchanged || !contentInputsUnchanged || !environmentUnchanged) {
116
+ invalidatedCheckIds.push(checkId);
117
+ continue;
118
+ }
119
+ const transferred: VerificationRecord = {
120
+ ...sourcePass,
121
+ summary: `Verification authority transferred across a content-equivalent Forge commit for ${checkId}.`,
122
+ recordedAt,
123
+ sourceRevision: input.postCommitSourceRevision,
124
+ workspaceFingerprint: input.postCommitWorkspaceFingerprint,
125
+ verificationInputFingerprint: verificationInputFingerprint({
126
+ sourceRevision: input.postCommitSourceRevision,
127
+ workspaceFingerprint: input.postCommitWorkspaceFingerprint,
128
+ checkId,
129
+ requestedChecks,
130
+ }),
131
+ evidenceRef: {
132
+ title: checkId,
133
+ summary: 'Reused the exact persisted Process receipt after proving check definition, content inputs, environment, and non-Git read semantics are unchanged across the commit.',
134
+ detailLevel: 'summary',
135
+ },
136
+ };
137
+ transferredRecords.push(transferred);
138
+ reusableCheckIds.push(checkId);
139
+ }
140
+
141
+ return { transferredRecords, reusableCheckIds, invalidatedCheckIds };
142
+ }
143
+
144
+ const MAX_WORK_VERIFY_BATCH_CHECKS = 32;
145
+
146
+ export interface ExecuteWorkVerificationBatchInput extends Omit<ExecuteWorkVerificationInput, 'checkId'> {
147
+ checkIds: string[];
148
+ }
149
+
150
+ function boundedCheckSchedulingPayload(schedule: ReturnType<typeof buildCheckExecutionSchedule>) {
151
+ return {
152
+ waveCount: schedule.waves.length,
153
+ maxParallel: schedule.maxParallel,
154
+ waves: schedule.waves,
155
+ conflicts: schedule.conflicts,
156
+ invalidCheckIds: schedule.invalidCheckIds,
157
+ guidance: schedule.guidance,
158
+ };
159
+ }
160
+
161
+ /**
162
+ * Canonical batch wrapper for rh_work verification. Scheduling remains advisory
163
+ * and Process Runtime resource claims remain the execution/lease authority.
164
+ * Every member still executes through executeWorkVerification so Work snapshot,
165
+ * Failure Contract, VerificationRecord, and lifecycle semantics stay singular.
166
+ */
167
+ export async function executeWorkVerificationBatch(input: ExecuteWorkVerificationBatchInput): Promise<ExecuteWorkVerificationResult> {
168
+ const workId = input.workId?.trim() ?? '';
169
+ const requestedCheckIds = [...new Set(input.checkIds.map((value) => value.trim()).filter(Boolean))];
170
+ if (requestedCheckIds.length === 0) {
171
+ return result(buildFacadeResult({
172
+ status: 'blocked',
173
+ summary: 'Work batch verification requires a non-empty check_ids array.',
174
+ data: { batch: true, checkIds: [], verificationStarted: false },
175
+ warnings: ['CHECK_IDS_REQUIRED: pass between 1 and 32 registered check ids.'],
176
+ }), true);
177
+ }
178
+ if (requestedCheckIds.length > MAX_WORK_VERIFY_BATCH_CHECKS) {
179
+ return result(buildFacadeResult({
180
+ status: 'blocked',
181
+ summary: `Work batch verification accepts at most ${MAX_WORK_VERIFY_BATCH_CHECKS} distinct check ids.`,
182
+ data: { batch: true, checkIds: requestedCheckIds.slice(0, MAX_WORK_VERIFY_BATCH_CHECKS), verificationStarted: false },
183
+ warnings: ['CHECK_IDS_LIMIT_EXCEEDED'],
184
+ }), true);
185
+ }
186
+
187
+ const resolvedVerification = resolveWorkVerificationContext({
188
+ controllerHome: input.controllerHome,
189
+ repository: input.repository,
190
+ workId,
191
+ });
192
+ if (!resolvedVerification.ok) {
193
+ return result(buildFacadeResult({
194
+ status: 'blocked',
195
+ summary: `${resolvedVerification.code}: ${resolvedVerification.detail}`,
196
+ data: { batch: true, checkIds: requestedCheckIds, verificationStarted: false },
197
+ warnings: ['Work batch verification never falls back to a different checkout or check registry.'],
198
+ }), true);
199
+ }
200
+
201
+ const { repository: verificationRepository, checks } = resolvedVerification.context;
202
+ const checksById = new Map(checks.map((check) => [check.id, check] as const));
203
+ const schedule = buildCheckExecutionSchedule({
204
+ checks,
205
+ requestedCheckIds,
206
+ repoId: verificationRepository.repoId,
207
+ checkoutId: verificationRepository.activeCheckoutId,
208
+ });
209
+ const checkScheduling = boundedCheckSchedulingPayload(schedule);
210
+ if (schedule.invalidCheckIds.length > 0) {
211
+ return result(buildFacadeResult({
212
+ status: 'blocked',
213
+ summary: `Work batch verification contains unregistered checks: ${schedule.invalidCheckIds.join(', ')}`,
214
+ data: { batch: true, checkIds: requestedCheckIds, checkScheduling, verificationStarted: false },
215
+ warnings: ['INVALID_CHECK_IDS'],
216
+ }), true);
217
+ }
218
+ const durableCheckIds = requestedCheckIds.filter((checkId) => checkRequiresDurableWorkflow(checksById.get(checkId)));
219
+ if (durableCheckIds.length > 0) {
220
+ return result(buildFacadeResult({
221
+ status: 'blocked',
222
+ summary: 'Work batch verification only launches ordinary focused checks; durable release or multi-phase checks must be verified individually.',
223
+ data: { batch: true, checkIds: requestedCheckIds, durableCheckIds, checkScheduling, verificationStarted: false },
224
+ warnings: ['BATCH_CONTAINS_DURABLE_CHECK'],
225
+ }), true);
226
+ }
227
+ if (schedule.waves.length !== 1 || schedule.waves[0]?.checkIds.length !== requestedCheckIds.length) {
228
+ return result(buildFacadeResult({
229
+ status: 'blocked',
230
+ summary: 'Requested Work checks span multiple resource-conflicting waves; submit one returned wave per verify call.',
231
+ data: { batch: true, checkIds: requestedCheckIds, checkScheduling, verificationStarted: false },
232
+ warnings: ['BATCH_SPANS_MULTIPLE_CHECK_WAVES'],
233
+ }), true);
234
+ }
235
+
236
+ const baseRequestId = input.requestId?.trim() ?? '';
237
+ const batchDigest = createHash('sha256').update(JSON.stringify(requestedCheckIds)).digest('hex').slice(0, 8);
238
+ const executions = await Promise.all(requestedCheckIds.map((checkId, index) => executeWorkVerification({
239
+ ...input,
240
+ checkId,
241
+ requestId: baseRequestId ? `${baseRequestId}:batch:${index + 1}:${batchDigest}` : undefined,
242
+ })));
243
+ const verifications: Array<Record<string, unknown> & { checkId: string; facadeStatus: FacadeResult['status']; isError: boolean }> = executions.map((execution, index) => {
244
+ const data = execution.facade.data as Record<string, unknown>;
245
+ const verification = data.verification && typeof data.verification === 'object' && !Array.isArray(data.verification)
246
+ ? data.verification as Record<string, unknown>
247
+ : {};
248
+ return {
249
+ checkId: requestedCheckIds[index],
250
+ ...verification,
251
+ facadeStatus: execution.facade.status,
252
+ isError: execution.isError,
253
+ };
254
+ });
255
+ const completed = verifications.every((verification) => verification.completed === true);
256
+ const allPassed = completed && verifications.every((verification) => verification.outcome === 'valid_pass');
257
+ const anyAcceptanceFailure = verifications.some((verification) => verification.outcome === 'valid_fail');
258
+ const anyInfrastructureFailure = verifications.some((verification) => verification.outcome === 'infrastructure_failure');
259
+ const anyBlocked = executions.some((execution) => execution.facade.status === 'blocked');
260
+ const processIds = verifications
261
+ .map((verification) => typeof verification.processId === 'string' ? verification.processId : '')
262
+ .filter(Boolean);
263
+ const facade = buildFacadeResult({
264
+ status: anyAcceptanceFailure ? 'failed' : anyBlocked ? 'blocked' : 'ok',
265
+ summary: completed
266
+ ? allPassed
267
+ ? `Work verification batch passed ${requestedCheckIds.length} checks.`
268
+ : anyAcceptanceFailure
269
+ ? 'Work verification batch completed with an acceptance failure.'
270
+ : anyInfrastructureFailure
271
+ ? 'Work verification batch completed with an infrastructure failure.'
272
+ : 'Work verification batch completed.'
273
+ : `Work verification batch launched ${requestedCheckIds.length} resource-compatible checks through Process Runtime.`,
274
+ data: {
275
+ batch: true,
276
+ checkIds: requestedCheckIds,
277
+ checkScheduling,
278
+ verifications,
279
+ processIds,
280
+ completed,
281
+ ...(completed ? { ok: allPassed } : {}),
282
+ },
283
+ warnings: anyInfrastructureFailure ? ['infrastructure_failure is distinct from acceptance failure'] : [],
284
+ rawAvailable: false,
285
+ });
286
+ return result(facade, anyAcceptanceFailure || executions.some((execution) => execution.isError && execution.facade.status !== 'ok'));
287
+ }
288
+
48
289
  /**
49
290
  * Canonical Work verification application service.
50
291
  *
@@ -166,7 +407,7 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
166
407
  requestedChecks,
167
408
  }) : undefined;
168
409
  const registeredCheck = checks.find((entry) => entry.id === normalizedCheckId);
169
- const durableClassCheck = checkRequiresDurableWorkflow(normalizedCheckId, registeredCheck);
410
+ const durableClassCheck = checkRequiresDurableWorkflow(registeredCheck);
170
411
  const allowDurableCheckExecution = Boolean(
171
412
  durableClassCheck
172
413
  && workContract
@@ -283,6 +524,18 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
283
524
  || evidenceState.state !== 'matched'
284
525
  || (!receipt.ok && failureClass !== 'acceptance_failure');
285
526
  const checkFailed = !receipt.ok && !infrastructureFailed;
527
+ if (receipt.ok && evidenceState.state === 'matched') {
528
+ try {
529
+ ingestCheckCompletionGraceProcess({
530
+ controllerHome: input.controllerHome,
531
+ repoId: verificationRepository.repoId,
532
+ processId: receipt.processId,
533
+ });
534
+ } catch {
535
+ // Operational Memory is a disposable derived optimization. Its failure
536
+ // must never change Check/Work correctness or lifecycle truth.
537
+ }
538
+ }
286
539
  const commonVerification = {
287
540
  checkId: normalizedCheckId,
288
541
  outcome: infrastructureFailed ? 'infrastructure_failure' : receipt.ok ? 'valid_pass' : 'valid_fail',
@@ -304,6 +557,7 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
304
557
  evidenceArtifactPath: record.origin?.workVerificationSnapshot ? undefined : receipt.artifactPath,
305
558
  evidenceReceiptId: receipt.receiptId,
306
559
  checkResultReceiptId: structuredCheckResult?.receiptId,
560
+ ...(evidenceState.failureEvidence ? { failureEvidence: evidenceState.failureEvidence } : {}),
307
561
  verificationIsolation: record.origin?.workVerificationSnapshot ? 'work_snapshot' : 'shared_checkout',
308
562
  boundedStatus: receipt.ok ? 'pass' : infrastructureFailed ? 'infrastructure_failure' : 'fail',
309
563
  evidenceState: evidenceState.state,