@moretea-labs/forge 1.8.0 → 1.8.2

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 (695) hide show
  1. package/AGENTS.md +73 -7
  2. package/CHANGELOG.md +34 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.en.md +24 -3
  6. package/README.md +10 -6
  7. package/README.zh-CN.md +5 -3
  8. package/THIRD_PARTY_NOTICES.md +1 -2
  9. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
  11. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  12. package/adapters/chatgpt/controller-round-host.ts +15 -25
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  14. package/adapters/chatgpt/provider-delivery.ts +229 -2
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
  16. package/adapters/computer/chatgpt-extension-target.ts +708 -0
  17. package/adapters/computer/chrome-extension/background.js +541 -0
  18. package/adapters/computer/chrome-extension/content.js +402 -0
  19. package/adapters/computer/chrome-extension/core.js +24 -0
  20. package/adapters/computer/chrome-extension/manifest.json +32 -0
  21. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  22. package/adapters/computer/desktop-operator-provider.ts +18 -6
  23. package/adapters/computer/interaction-target-authority.ts +178 -24
  24. package/adapters/mcp/access-mode.ts +18 -39
  25. package/adapters/mcp/auth.ts +2 -7
  26. package/adapters/mcp/instructions.ts +6 -5
  27. package/adapters/mcp/multi-repository.ts +10 -47
  28. package/adapters/mcp/oauth.ts +73 -0
  29. package/adapters/mcp/paths.ts +4 -1
  30. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  31. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  32. package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
  33. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
  34. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  35. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  36. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  37. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  38. package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
  39. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  40. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
  41. package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
  42. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  43. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  44. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  45. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  46. package/adapters/mcp/runtime-gateway/router.ts +19 -507
  47. package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
  48. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
  49. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  50. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
  51. package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
  52. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
  53. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  54. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
  55. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
  56. package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
  57. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  58. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  59. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
  60. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  61. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  62. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  63. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  64. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  65. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
  66. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  67. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
  68. package/adapters/mcp/server.ts +91 -26
  69. package/adapters/mcp/setup.ts +5 -13
  70. package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
  71. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
  72. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
  73. package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
  74. package/adapters/mcp/toolset-names.ts +11 -37
  75. package/adapters/mcp/toolset.ts +19 -92
  76. package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
  77. package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
  78. package/adapters/mcp/transports/http-observation.ts +377 -0
  79. package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
  80. package/adapters/mcp/transports/http.ts +200 -683
  81. package/adapters/mcp/transports/oauth-http.ts +322 -0
  82. package/adapters/mcp/transports/session-registry.ts +6 -0
  83. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  84. package/adapters/mcp/types.ts +0 -6
  85. package/assets/hooks/lib/session-state.sh +0 -38
  86. package/assets/hooks/post-bash.sh +1 -1
  87. package/assets/hooks/post-tool-observer.sh +0 -5
  88. package/assets/hooks/prompt-guard.sh +0 -55
  89. package/assets/partials/04-project-structure.partial.md +1 -1
  90. package/assets/partials/07-footer.partial.md +1 -1
  91. package/assets/partials-agents/02-operating-mode.partial.md +1 -1
  92. package/assets/partials-agents/08-deep-docs.partial.md +1 -1
  93. package/assets/plugin-registry.v1.json +6 -4
  94. package/assets/reference-configs/agentic-development-flow.md +26 -1
  95. package/assets/reference-configs/external-tooling.md +0 -76
  96. package/assets/reference-configs/global-working-rules.md +19 -0
  97. package/assets/reference-configs/release-deploy.md +1 -1
  98. package/assets/templates/helpers/architecture-queue.sh +1 -1
  99. package/assets/templates/helpers/check-agent-tooling.sh +1 -327
  100. package/assets/templates/helpers/check-task-workflow.sh +1 -1
  101. package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
  102. package/assets/templates/helpers/migrate-project-template.sh +2 -2
  103. package/assets/workflow-contract.v1.json +0 -2
  104. package/docs/README.md +5 -2
  105. package/docs/architecture/CURRENT.md +205 -51
  106. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  107. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  108. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
  109. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  110. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  111. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  112. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  113. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
  114. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  115. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
  116. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
  117. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  118. package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
  119. package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
  120. package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
  121. package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
  122. package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
  123. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
  124. package/docs/architecture/domains/public-surface.md +3 -5
  125. package/docs/architecture/domains/verification.md +6 -5
  126. package/docs/architecture/domains/workflow-engine.md +6 -0
  127. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
  128. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
  129. package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
  130. package/docs/forge-plugin-management.md +16 -4
  131. package/docs/operations/controller-browser-plugin.md +23 -0
  132. package/docs/operations/controller-performance-and-502.md +17 -0
  133. package/docs/operations/controller-reliability-runbook.md +2 -2
  134. package/docs/operations/features.md +6 -7
  135. package/docs/operations/features.zh-CN.md +1 -1
  136. package/docs/operations/github-repository.md +4 -4
  137. package/docs/operations/github-semantic-release-projection.md +20 -0
  138. package/docs/operations/homebrew.md +2 -2
  139. package/docs/operations/mcp-tool-exposure.md +13 -52
  140. package/docs/operations/releasing.md +2 -0
  141. package/docs/operations/runtime-performance-diagnostics.md +8 -0
  142. package/docs/operations/standalone-disaster-recovery.md +15 -7
  143. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  144. package/docs/tutorials/03-first-repository-task.md +2 -0
  145. package/docs/wiki/Computer-and-Plugins.md +78 -0
  146. package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
  147. package/docs/wiki/Home.md +16 -2
  148. package/docs/wiki/Implementation.md +25 -13
  149. package/docs/wiki/Installation.md +28 -32
  150. package/docs/wiki/Integrations.md +4 -0
  151. package/docs/wiki/Quick-Start.md +35 -22
  152. package/docs/wiki/Releases-and-Upgrades.md +15 -25
  153. package/docs/wiki/_Sidebar.md +5 -1
  154. package/package.json +25 -25
  155. package/packages/kernel/cognition/api/index.ts +6 -0
  156. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  157. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  158. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  159. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  160. package/packages/kernel/cognition/domain/learning.ts +106 -0
  161. package/packages/kernel/cognition/domain/memory.ts +254 -0
  162. package/packages/kernel/controller/api/index.ts +1 -0
  163. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  164. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  165. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  166. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  167. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  168. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  169. package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
  170. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  171. package/packages/kernel/identity/api/index.ts +10 -0
  172. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  173. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  174. package/packages/kernel/identity/domain/grant.ts +72 -0
  175. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  176. package/packages/kernel/identity/domain/user-request.ts +93 -0
  177. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
  178. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  179. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  180. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  181. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  182. package/packages/kernel/scheduler/api/index.ts +0 -2
  183. package/packages/kernel/scheduler/application/eligibility.ts +4 -1
  184. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  185. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  186. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  187. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
  188. package/packages/kernel/work/api/index.ts +3 -2
  189. package/packages/kernel/work/application/work-service.ts +18 -42
  190. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  191. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  192. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  193. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  194. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  195. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  196. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  197. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  198. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  199. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  200. package/packages/kernel/work/domain/state-machine.ts +34 -65
  201. package/packages/kernel/work/domain/types.ts +57 -51
  202. package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
  203. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  204. package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
  205. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  206. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  207. package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
  208. package/packages/plugin-runtime/computer/index.ts +2 -0
  209. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  210. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  211. package/packages/protocols/computer/contract.ts +27 -1
  212. package/scripts/activate-source-baseline.ts +7 -9
  213. package/scripts/assemble-template.ts +11 -72
  214. package/scripts/canary-controller-semantic-wait.ts +12 -24
  215. package/scripts/check-mcp-compatibility.ts +94 -201
  216. package/scripts/check-package-identity.mjs +0 -5
  217. package/scripts/check-runtime-architecture.mjs +921 -239
  218. package/scripts/forge-local-recovery-helper.mjs +93 -15
  219. package/scripts/init-project.sh +0 -46
  220. package/scripts/install-ios-hid-toolchain.sh +60 -0
  221. package/scripts/install-standalone-recovery.ts +1 -1
  222. package/scripts/lib/project-init-lib.sh +6 -3
  223. package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
  224. package/scripts/open-source-audit-allowlist.txt +1 -3
  225. package/scripts/run-bounded-command.mjs +5 -0
  226. package/scripts/run-governed-gate.ts +2 -1
  227. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  228. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  229. package/scripts/smoke-ios-physical-device.ts +38 -10
  230. package/scripts/smoke-mcp-http-runtime.ts +12 -8
  231. package/scripts/smoke-mcp-tool-surface.ts +27 -41
  232. package/scripts/smoke-runtime-recovery.ts +12 -43
  233. package/scripts/smoke-schedule-engine.ts +23 -15
  234. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  235. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  236. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
  237. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  238. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  239. package/scripts/smoke-workflow-supervisor.ts +103 -0
  240. package/scripts/sync-generated-authority.mjs +0 -1
  241. package/scripts/verify-forge-runtime.sh +2 -1
  242. package/src/cli/agent-jobs/executor-health.ts +12 -35
  243. package/src/cli/agent-jobs/integration.ts +20 -51
  244. package/src/cli/agent-jobs/job-manager.ts +7 -3
  245. package/src/cli/chatgpt-browser/file-policy.ts +2 -2
  246. package/src/cli/commands/brain-assistant.ts +27 -13
  247. package/src/cli/commands/brain.ts +13 -15
  248. package/src/cli/commands/chatgpt.ts +1 -163
  249. package/src/cli/commands/doctor.ts +1 -143
  250. package/src/cli/commands/global-runtime.ts +3 -196
  251. package/src/cli/commands/init-hook.ts +6 -23
  252. package/src/cli/commands/init.ts +3 -252
  253. package/src/cli/commands/mcp.ts +0 -5
  254. package/src/cli/commands/prompt-guard-decision.ts +0 -2
  255. package/src/cli/commands/recovery.ts +137 -135
  256. package/src/cli/commands/repository.ts +17 -1
  257. package/src/cli/commands/runtime.ts +3 -3
  258. package/src/cli/commands/setup-execution.ts +41 -0
  259. package/src/cli/commands/setup-profile.ts +8 -0
  260. package/src/cli/controller/check-runner.ts +13 -2
  261. package/src/cli/controller/completion-backlog.ts +3 -3
  262. package/src/cli/controller/completion-orchestrator.ts +5 -44
  263. package/src/cli/controller/completion-target.ts +3 -72
  264. package/src/cli/controller/composite-operations.ts +1 -1
  265. package/src/cli/controller/context/instruction-context.ts +1 -1
  266. package/src/cli/controller/context/known-paths.ts +2 -2
  267. package/src/cli/controller/context/query-planning.ts +11 -4
  268. package/src/cli/controller/context/rule-resolution.ts +2 -2
  269. package/src/cli/controller/context/source-materializer.ts +83 -102
  270. package/src/cli/controller/context/structural-provider.ts +84 -0
  271. package/src/cli/controller/context/structural.ts +6 -6
  272. package/src/cli/controller/context/types.ts +8 -9
  273. package/src/cli/controller/context-pack.ts +107 -84
  274. package/src/cli/controller/execution-completion.ts +4 -7
  275. package/src/cli/controller/execution-policy.ts +36 -153
  276. package/src/cli/controller/governance.ts +2 -3
  277. package/src/cli/controller/issue-store.ts +4 -99
  278. package/src/cli/controller/launch-agents.ts +59 -18
  279. package/src/cli/controller/operational-plan.ts +25 -52
  280. package/src/cli/controller/runtime-config.ts +5 -1
  281. package/src/cli/controller/stuck-state-migration.ts +2 -3
  282. package/src/cli/controller/systemd-user.ts +42 -10
  283. package/src/cli/editing/edit-session.ts +18 -12
  284. package/src/cli/github/github.ts +4 -4
  285. package/src/cli/github/semantic-projection.ts +174 -0
  286. package/src/cli/hook/prompt-intents.ts +0 -9
  287. package/src/cli/index.ts +1 -43
  288. package/src/cli/local-bridge/connector-freshness.ts +1 -12
  289. package/src/cli/local-bridge/console-automations.ts +19 -14
  290. package/src/cli/local-bridge/console-view-models.ts +4 -13
  291. package/src/cli/local-bridge/facade-api.ts +64 -193
  292. package/src/cli/local-bridge/server.ts +24 -147
  293. package/src/cli/local-bridge/types.ts +0 -1
  294. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  295. package/src/cli/repositories/command-classifier.ts +0 -9
  296. package/src/cli/repositories/command-executor.ts +29 -23
  297. package/src/cli/repositories/command-scope.ts +37 -18
  298. package/src/cli/repositories/controller-home.ts +48 -0
  299. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  300. package/src/cli/repositories/git-command-executor.ts +2 -2
  301. package/src/cli/repositories/locks.ts +20 -0
  302. package/src/cli/repositories/registry.ts +79 -12
  303. package/src/cli/repositories/safe-patch.ts +2 -12
  304. package/src/cli/repositories/structured-git.ts +101 -5
  305. package/src/cli/repository/inspector.ts +185 -343
  306. package/src/cli/repository/session-cache.ts +92 -6
  307. package/src/effects/process-runner.ts +17 -1
  308. package/src/runtime/context/assistant-context.ts +20 -7
  309. package/src/runtime/context/assistant-work-context.ts +89 -27
  310. package/src/runtime/context/automatic-learning.ts +565 -0
  311. package/src/runtime/context/cognitive-attention.ts +173 -0
  312. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  313. package/src/runtime/context/context-closure.ts +46 -9
  314. package/src/runtime/context/context-pack-process.ts +103 -0
  315. package/src/runtime/context/context-plane.ts +1 -9
  316. package/src/runtime/context/direct-controller-learning.ts +298 -0
  317. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  318. package/src/runtime/context/semantic-navigation-contract.ts +16 -0
  319. package/src/runtime/context/semantic-navigation.ts +7 -35
  320. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  321. package/src/runtime/context/typescript-navigation.ts +89 -3
  322. package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
  323. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  324. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  325. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  326. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  327. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  328. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  329. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  330. package/src/runtime/control-plane/execution/validation.ts +6 -8
  331. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  332. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  333. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  334. package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
  335. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  336. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  337. package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
  338. package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
  339. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  340. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  341. package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
  342. package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
  343. package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
  344. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  345. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  346. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
  347. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
  348. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  349. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
  350. package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
  351. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  352. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  353. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  354. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  355. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  356. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  357. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  358. package/src/runtime/control-plane/facade/index.ts +0 -1
  359. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  360. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  361. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  362. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  363. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  364. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  365. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  366. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  367. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  368. package/src/runtime/control-plane/facade/types.ts +49 -108
  369. package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
  370. package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
  371. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  372. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  373. package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
  374. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
  375. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  376. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  377. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  378. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  379. package/src/runtime/control-plane/governance/external-effects.ts +1 -1
  380. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  381. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
  382. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  383. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  384. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  385. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  386. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  387. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  388. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  389. package/src/runtime/control-plane/release-retention.ts +135 -47
  390. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  391. package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
  392. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  393. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  394. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  395. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  396. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  397. package/src/runtime/evidence/artifact-store.ts +158 -40
  398. package/src/runtime/evidence/evidence-store.ts +112 -8
  399. package/src/runtime/evidence/output-handle-index.ts +225 -0
  400. package/src/runtime/evidence/result-store.ts +158 -44
  401. package/src/runtime/evidence/sensitive-output.ts +22 -2
  402. package/src/runtime/execution/jobs/child-reference.ts +11 -0
  403. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
  404. package/src/runtime/execution/jobs/store.ts +3 -4
  405. package/src/runtime/execution/managed-workspace.ts +57 -0
  406. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  407. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  408. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  409. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  410. package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
  411. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  412. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  413. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  414. package/src/runtime/execution/process-runtime/index.ts +3 -0
  415. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  416. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  417. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  418. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  419. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  420. package/src/runtime/execution/process-runtime/runtime.ts +55 -18
  421. package/src/runtime/execution/process-runtime/store.ts +30 -2
  422. package/src/runtime/execution/process-runtime/types.ts +6 -1
  423. package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
  424. package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
  425. package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
  426. package/src/runtime/execution/workers/executor.ts +3 -8
  427. package/src/runtime/maintenance/cleanup.ts +41 -5
  428. package/src/runtime/platform/service-inventory.ts +130 -0
  429. package/src/runtime/platform/service-manager.ts +8 -0
  430. package/src/runtime/plugins/action-application.ts +97 -29
  431. package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
  432. package/src/runtime/plugins/browser-adapter.ts +1124 -333
  433. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  434. package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
  435. package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
  436. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  437. package/src/runtime/plugins/browser-registration.ts +18 -0
  438. package/src/runtime/plugins/browser-runtime.ts +40 -36
  439. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  440. package/src/runtime/plugins/browser-session-store.ts +46 -76
  441. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  442. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
  443. package/src/runtime/plugins/computer-registration.ts +298 -20
  444. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  445. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  446. package/src/runtime/plugins/external-adapter.ts +42 -6
  447. package/src/runtime/plugins/external-registration.ts +21 -1
  448. package/src/runtime/plugins/github-adapter.ts +30 -3
  449. package/src/runtime/plugins/gmail-adapter.ts +189 -3
  450. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  451. package/src/runtime/plugins/google-shared.ts +24 -12
  452. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  453. package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
  454. package/src/runtime/plugins/ios-adapter.ts +46 -41
  455. package/src/runtime/plugins/ios-agent-device.ts +54 -4
  456. package/src/runtime/plugins/ios-device-ownership.ts +103 -0
  457. package/src/runtime/plugins/ios-physical-device.ts +497 -79
  458. package/src/runtime/plugins/lightweight-action.ts +208 -2
  459. package/src/runtime/plugins/local-system-adapter.ts +12 -100
  460. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  461. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  462. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  463. package/src/runtime/plugins/store.ts +682 -435
  464. package/src/runtime/plugins/types.ts +24 -0
  465. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  466. package/src/runtime/projections/git-status-sampler.ts +2 -19
  467. package/src/runtime/projections/invalidation.ts +7 -3
  468. package/src/runtime/projections/materialized-view.ts +80 -36
  469. package/src/runtime/recovery/actions.ts +4 -4
  470. package/src/runtime/recovery/capability-action-application.ts +46 -45
  471. package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
  472. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  473. package/src/runtime/recovery/probe.ts +2 -2
  474. package/src/runtime/recovery/store.ts +29 -11
  475. package/src/runtime/release/release-coordinator.ts +312 -0
  476. package/src/runtime/release/release-session.ts +716 -0
  477. package/src/runtime/release/release-state-migration.ts +25 -0
  478. package/src/runtime/resources/leases/store.ts +56 -25
  479. package/src/runtime/root/computer-composition.ts +191 -6
  480. package/src/runtime/root/controller-progression-composition.ts +254 -0
  481. package/src/runtime/root/controller-round-composition.ts +20 -1
  482. package/src/runtime/root/deployment-topology.ts +106 -0
  483. package/src/runtime/root/entry.ts +4 -3
  484. package/src/runtime/root/known-good-recovery.ts +184 -0
  485. package/src/runtime/root/local-bridge.ts +0 -1
  486. package/src/runtime/root/mcp-transport.ts +111 -18
  487. package/src/runtime/root/ownership.ts +261 -9
  488. package/src/runtime/root/package-connector-service.ts +227 -29
  489. package/src/runtime/root/package-runtime-release.ts +117 -30
  490. package/src/runtime/root/package-runtime-service.ts +24 -24
  491. package/src/runtime/root/release-execution-canary.ts +57 -12
  492. package/src/runtime/root/release-loader.ts +90 -8
  493. package/src/runtime/root/release-manifest.ts +80 -40
  494. package/src/runtime/root/release-materialize.ts +372 -106
  495. package/src/runtime/root/release-store.ts +395 -36
  496. package/src/runtime/root/runtime-lane.ts +191 -0
  497. package/src/runtime/root/runtime.ts +160 -29
  498. package/src/runtime/root/scheduled-controller-composition.ts +29 -3
  499. package/src/runtime/root/service-runner.ts +2 -2
  500. package/src/runtime/root/service.ts +126 -44
  501. package/src/runtime/root/status.ts +48 -0
  502. package/src/runtime/root/types.ts +32 -9
  503. package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
  504. package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
  505. package/src/runtime/root/write-fence.ts +50 -2
  506. package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
  507. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  508. package/src/runtime/safe-tooling/ios-development.ts +22 -8
  509. package/src/runtime/safe-tooling/job-summary.ts +1 -1
  510. package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
  511. package/src/runtime/shared/atomic-text-file.ts +21 -0
  512. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  513. package/src/runtime/shared/json-files.ts +8 -3
  514. package/src/runtime/shared/process-environment.ts +20 -9
  515. package/src/runtime/shared/response-budget.ts +1 -3
  516. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  517. package/src/runtime/standalone-recovery/core.ts +3792 -417
  518. package/src/runtime/standalone-recovery/entry.ts +507 -45
  519. package/src/runtime/standalone-recovery/installer.ts +262 -148
  520. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  521. package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
  522. package/src/runtime/standalone-recovery/performance.ts +54 -16
  523. package/src/runtime/standalone-recovery/release.ts +53 -5
  524. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  525. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  526. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  527. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
  528. package/src/runtime/workflow/schedules/engine.ts +166 -178
  529. package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
  530. package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
  531. package/src/runtime/workflows/runtime.ts +15 -19
  532. package/src/testing/test-governance.ts +5 -1
  533. package/supervisor/chatgpt-conversation.ts +23 -0
  534. package/supervisor/client.ts +218 -0
  535. package/supervisor/control-plane.ts +963 -0
  536. package/supervisor/entry.ts +15 -0
  537. package/supervisor/forge-validators.ts +147 -0
  538. package/supervisor/index.ts +5 -0
  539. package/supervisor/native-browser-adapter.ts +1151 -0
  540. package/supervisor/native-messaging/host.ts +58 -0
  541. package/supervisor/native-messaging/manifest.ts +26 -0
  542. package/supervisor/native-messaging/protocol.ts +27 -0
  543. package/supervisor/paths.ts +18 -0
  544. package/supervisor/protocol.ts +250 -0
  545. package/supervisor/server.ts +412 -0
  546. package/supervisor/store.ts +1870 -0
  547. package/supervisor/tsconfig.json +8 -0
  548. package/supervisor/types.ts +261 -0
  549. package/SKILL.md +0 -427
  550. package/adapters/chatgpt/controller-host.ts +0 -119
  551. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  552. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  553. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  554. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
  555. package/adapters/mcp/toolset-selection.ts +0 -41
  556. package/agents/openai.yaml +0 -4
  557. package/assets/skill-hooks.json +0 -41
  558. package/assets/skill-version.json +0 -189
  559. package/assets/skills/claude-review/SKILL.md +0 -231
  560. package/assets/skills/codex-review/SKILL.md +0 -103
  561. package/assets/templates/helpers/check-skill-version.ts +0 -193
  562. package/packages/kernel/progression/api/index.ts +0 -2
  563. package/packages/kernel/progression/application/projector.ts +0 -211
  564. package/packages/kernel/progression/domain/types.ts +0 -116
  565. package/packages/kernel/progression/index.ts +0 -1
  566. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  567. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  568. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  569. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  570. package/scripts/benchmark-background-check-overlap.ts +0 -228
  571. package/scripts/benchmark-computer-hotpath.ts +0 -255
  572. package/scripts/benchmark-controller-hotpath.ts +0 -212
  573. package/scripts/benchmark-controller-round2.ts +0 -191
  574. package/scripts/benchmark-ios-agent-device.ts +0 -511
  575. package/scripts/benchmark-mcp-host.sh +0 -117
  576. package/scripts/benchmark-mcp-transport.ts +0 -169
  577. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  578. package/scripts/benchmark-operational-shadow.ts +0 -28
  579. package/scripts/benchmark-quality-harness.ts +0 -146
  580. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  581. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  582. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  583. package/scripts/benchmark-thin-harness.ts +0 -251
  584. package/scripts/benchmark-typescript-navigation.ts +0 -186
  585. package/scripts/benchmark-work-efficiency.ts +0 -334
  586. package/scripts/build-controller-ui.ts +0 -28
  587. package/scripts/check-npm-release.sh +0 -32
  588. package/scripts/check-public-release-surface.sh +0 -19
  589. package/scripts/check-release-published.sh +0 -57
  590. package/scripts/check-release-readiness.sh +0 -37
  591. package/scripts/check-release-version.mjs +0 -74
  592. package/scripts/check-skill-version.ts +0 -5
  593. package/scripts/check-tarball-install-smoke.sh +0 -150
  594. package/scripts/ensure-codegraph.sh +0 -16
  595. package/scripts/package-source-archive.sh +0 -147
  596. package/scripts/public-release-files.txt +0 -39
  597. package/scripts/public-release.ts +0 -174
  598. package/scripts/publish-release-tarball.sh +0 -27
  599. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  600. package/scripts/run-skill-hook.ts +0 -244
  601. package/scripts/stage-runtime-release.ts +0 -44
  602. package/scripts/sync-codex-installed-copies.sh +0 -182
  603. package/src/cli/commands/tools.ts +0 -167
  604. package/src/cli/controller/progress.ts +0 -656
  605. package/src/cli/controller/work-mode.ts +0 -181
  606. package/src/cli/local-bridge/console-assets.ts +0 -17
  607. package/src/cli/local-bridge/dashboard.ts +0 -17
  608. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  609. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  610. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  611. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  612. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  613. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  614. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  615. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  616. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  617. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  618. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  619. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  620. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  621. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  622. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  623. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  624. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  625. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  626. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  627. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  628. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  629. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  630. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  631. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  632. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  633. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  634. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  635. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  636. package/src/cli/mcp/access-mode.ts +0 -2
  637. package/src/cli/mcp/access-tools.ts +0 -2
  638. package/src/cli/mcp/audit.ts +0 -2
  639. package/src/cli/mcp/auth.ts +0 -2
  640. package/src/cli/mcp/instructions.ts +0 -2
  641. package/src/cli/mcp/legacy-context.ts +0 -2
  642. package/src/cli/mcp/legacy-tool-service.ts +0 -2
  643. package/src/cli/mcp/multi-repository.ts +0 -2
  644. package/src/cli/mcp/oauth.ts +0 -2
  645. package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
  646. package/src/cli/mcp/paths.ts +0 -2
  647. package/src/cli/mcp/policy.ts +0 -2
  648. package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
  649. package/src/cli/mcp/proxy-env.ts +0 -2
  650. package/src/cli/mcp/readiness-projection.ts +0 -2
  651. package/src/cli/mcp/redaction.ts +0 -2
  652. package/src/cli/mcp/repo.ts +0 -2
  653. package/src/cli/mcp/repository-tools.ts +0 -2
  654. package/src/cli/mcp/server.ts +0 -2
  655. package/src/cli/mcp/setup.ts +0 -2
  656. package/src/cli/mcp/tool-capability-cache.ts +0 -2
  657. package/src/cli/mcp/tool-contract.ts +0 -2
  658. package/src/cli/mcp/tools.ts +0 -2
  659. package/src/cli/mcp/toolset-names.ts +0 -2
  660. package/src/cli/mcp/toolset-selection.ts +0 -2
  661. package/src/cli/mcp/toolset.ts +0 -2
  662. package/src/cli/mcp/transports/http.ts +0 -2
  663. package/src/cli/mcp/transports/session-registry.ts +0 -2
  664. package/src/cli/mcp/transports/stdio.ts +0 -2
  665. package/src/cli/mcp/types.ts +0 -2
  666. package/src/cli/mcp/umbrella-tools.ts +0 -2
  667. package/src/cli/tools/codegraph.ts +0 -695
  668. package/src/core/adoption/helper-wrapper-plan.ts +0 -159
  669. package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
  670. package/src/runtime/context/codegraph-read-provider.ts +0 -611
  671. package/src/runtime/context/codegraph-sidecar.cjs +0 -248
  672. package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
  673. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  674. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  675. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  676. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  677. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  678. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  679. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  680. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  681. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  682. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  683. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  684. package/src/runtime/control-plane/routing/index.ts +0 -1
  685. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  686. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
  687. package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
  688. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
  689. package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
  690. package/src/runtime/gateway/mcp/process-tools.ts +0 -2
  691. package/src/runtime/gateway/mcp/router.ts +0 -2
  692. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
  693. package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
  694. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
  695. package/src/runtime/plugins/browser-provider-registry.ts +0 -2
@@ -1,9 +1,9 @@
1
1
  import { readForgeInstanceIdentity } from '../../../../packages/kernel/identity/api/index';
2
2
  import { resolveProjectForRepositoryPlacement } from '../workspace/workspace-store';
3
3
  import type { ScopeRef } from '../../../../packages/kernel/identity/api/index';
4
- import type { ExperienceRecord, ExperienceStorePort, OutcomeObservation, OutcomeObservationStorePort } from '../../../../packages/kernel/memory/api/index';
5
- import { getWorkContract, isTerminalWorkContractStatus, type WorkContract } from '../../../../packages/kernel/work/api/index';
6
- import { controllerSessionAuthorityMatches, getControllerRoundRelay, getControllerSession } from '../../../../packages/kernel/controller/api/index';
4
+ import { recordExperience, recordOutcomeObservation, type ExperienceRecord, type ExperienceStorePort, type OutcomeObservation, type OutcomeObservationStorePort } from '../../../../packages/kernel/memory/api/index';
5
+ import { getWorkContract, isTerminalSemanticWorkState, type WorkContract } from '../../../../packages/kernel/work/api/index';
6
+ import { getControllerRoundRelay } from '../../../../packages/kernel/controller/api/index';
7
7
  import { readExecutionArtifact } from '../../evidence/artifact-store';
8
8
  import { readExecutionEvidence } from '../../evidence/evidence-store';
9
9
  import { assertControlPlaneMetadataPayload } from './metadata-payload-policy';
@@ -12,14 +12,45 @@ import { deleteControlPlaneRecordWithinTransaction, listControlPlaneRecords, lis
12
12
 
13
13
  export const EXPERIENCE_NAMESPACE = 'assistant_experience';
14
14
  export const OUTCOME_OBSERVATION_NAMESPACE = 'assistant_outcome_observation';
15
- export interface ExperienceWriteIdentity { workId: string; controllerId: string; authorityId: string }
15
+ export interface ExperienceWriteIdentity {
16
+ workId: string;
17
+ /** Legacy provenance only; never execution or write authority. */
18
+ controllerId?: string;
19
+ /** Legacy provenance only; never execution or write authority. */
20
+ authorityId?: string;
21
+ }
22
+ export interface ClosedRoundLearningAuthority { workId: string; sourceRoundId: string }
23
+
24
+ interface ExperienceStoreOptions {
25
+ controllerHome: string;
26
+ repoId: string;
27
+ identity?: ExperienceWriteIdentity;
28
+ closedRoundAuthority?: ClosedRoundLearningAuthority;
29
+ now?: () => string;
30
+ }
31
+
32
+ function resolvedProjectForWork(work: WorkContract, controllerHome?: string) {
33
+ if (!controllerHome) return undefined;
34
+ const instance = readForgeInstanceIdentity(controllerHome);
35
+ if (!instance) return undefined;
36
+ const declaredProject = work.scopeRef?.kind === 'project'
37
+ ? work.scopeRef.id
38
+ : work.engineeringContext?.projectContractReceipt?.projectId;
39
+ return resolveProjectForRepositoryPlacement({
40
+ controllerHome,
41
+ forgeInstanceId: instance.instanceId,
42
+ repositoryId: work.repoId,
43
+ checkoutId: work.checkoutId,
44
+ projectId: declaredProject,
45
+ });
46
+ }
16
47
 
17
48
  export function experienceScopesForWork(work: WorkContract, controllerHome?: string): ScopeRef[] {
18
49
  const scopes: ScopeRef[] = [{ schemaVersion: 1, kind: 'work', id: work.workId }];
19
- const declaredProject = work.scopeRef?.kind === 'project' ? work.scopeRef.id : work.engineeringContext?.projectContractReceipt?.projectId;
20
- const instance = controllerHome ? readForgeInstanceIdentity(controllerHome) : undefined;
21
- const projectId = controllerHome && instance ? resolveProjectForRepositoryPlacement({ controllerHome,
22
- forgeInstanceId: instance.instanceId, repositoryId: work.repoId, checkoutId: work.checkoutId, projectId: declaredProject })?.projectId ?? declaredProject : declaredProject;
50
+ const declaredProject = work.scopeRef?.kind === 'project'
51
+ ? work.scopeRef.id
52
+ : work.engineeringContext?.projectContractReceipt?.projectId;
53
+ const projectId = resolvedProjectForWork(work, controllerHome)?.projectId ?? declaredProject;
23
54
  if (projectId) scopes.push({ schemaVersion: 1, kind: 'project', id: projectId });
24
55
  if (work.requirementId) scopes.push({ schemaVersion: 1, kind: 'requirement', id: work.requirementId });
25
56
  if (work.planId) scopes.push({ schemaVersion: 1, kind: 'plan', id: work.planId });
@@ -28,23 +59,62 @@ export function experienceScopesForWork(work: WorkContract, controllerHome?: str
28
59
  return scopes;
29
60
  }
30
61
 
31
- function matchesScope(work: WorkContract, scope: ScopeRef, controllerHome: string): boolean {
62
+ /**
63
+ * Cognitive recall may include portable Workspace guidance shared by sibling
64
+ * Projects. Raw Controller/Experience writes deliberately remain limited to
65
+ * experienceScopesForWork so project-local observations cannot bypass
66
+ * evidence-backed promotion into cross-project memory.
67
+ */
68
+ export function cognitiveScopesForWork(work: WorkContract, controllerHome?: string): ScopeRef[] {
69
+ const scopes = experienceScopesForWork(work, controllerHome);
70
+ const workspaceId = resolvedProjectForWork(work, controllerHome)?.workspaceId;
71
+ if (workspaceId && !scopes.some(scope => scope.kind === 'workspace' && scope.id === workspaceId)) {
72
+ scopes.push({ schemaVersion: 1, kind: 'workspace', id: workspaceId });
73
+ }
74
+ return scopes;
75
+ }
76
+
77
+ function matchesExperienceScope(work: WorkContract, scope: ScopeRef, controllerHome: string): boolean {
32
78
  return experienceScopesForWork(work, controllerHome).some(candidate => candidate.kind === scope.kind && candidate.id === scope.id);
33
79
  }
34
80
 
35
- function canonicalWorkflowEvidenceAvailable(input: { controllerHome: string; repoId: string }, ref: string, scope: ScopeRef, sourceWorkId: string): boolean {
81
+ function matchesCognitiveScope(work: WorkContract, scope: ScopeRef, controllerHome: string): boolean {
82
+ return cognitiveScopesForWork(work, controllerHome).some(candidate => candidate.kind === scope.kind && candidate.id === scope.id);
83
+ }
84
+
85
+ function isLegacyOutputLocatorMiss(error: unknown, kind: 'artifact' | 'evidence'): boolean {
86
+ const message = error instanceof Error ? error.message : String(error);
87
+ return kind === 'artifact'
88
+ ? message.startsWith('ARTIFACT_LOCATOR_NOT_FOUND:')
89
+ : message.startsWith('EVIDENCE_LOCATOR_NOT_FOUND:');
90
+ }
91
+
92
+ export function canonicalWorkflowEvidenceAvailable(input: { controllerHome: string; repoId: string }, ref: string, scope: ScopeRef, sourceWorkId: string): boolean {
36
93
  try {
37
94
  const source = getWorkContract(input, sourceWorkId);
38
- if (!source || !matchesScope(source, scope, input.controllerHome)) return false;
95
+ if (!source || !matchesCognitiveScope(source, scope, input.controllerHome)) return false;
39
96
  const linked = source.evidenceRefs.find(item => item.evidenceId === ref || item.artifactId === ref);
40
97
  if (linked) {
41
98
  if (ref.startsWith('ART-')) {
42
- const artifact = readExecutionArtifact(input.controllerHome, input.repoId, ref, 16 * 1024);
99
+ let artifact;
100
+ try {
101
+ artifact = readExecutionArtifact(input.controllerHome, ref, 16 * 1024);
102
+ } catch (error) {
103
+ if (!isLegacyOutputLocatorMiss(error, 'artifact')) throw error;
104
+ artifact = readExecutionArtifact(input.controllerHome, ref, 16 * 1024, { legacyRepoId: input.repoId });
105
+ }
43
106
  return !artifact.truncated && artifact.artifact.kind === 'evidence';
44
107
  }
45
- if (ref.startsWith('EVD-')) return readExecutionEvidence(input.controllerHome, input.repoId, ref).evidenceId === ref;
108
+ if (ref.startsWith('EVD-')) {
109
+ try { return readExecutionEvidence(input.controllerHome, ref).evidenceId === ref; }
110
+ catch (error) {
111
+ if (!isLegacyOutputLocatorMiss(error, 'evidence')) throw error;
112
+ return readExecutionEvidence(input.controllerHome, ref, { legacyRepoId: input.repoId }).evidenceId === ref;
113
+ }
114
+ }
46
115
  }
47
116
  if (source.checkRefs.some(check => check.receipt?.receiptId === ref && ['passed', 'failed'].includes(check.receipt.status))) return true;
117
+ if (source.engineeringContext?.blockerDispositions?.some(disposition => disposition.receiptId === ref)) return true;
48
118
  if (ref.startsWith('workflow-run-') || ref.startsWith('workflow-publication-')) {
49
119
  const runs = listControlPlaneRecords<WorkflowRunRecord>(input.controllerHome, { namespace: WORKFLOW_RUN_NAMESPACE, scope: sourceWorkId, limit: 1000 });
50
120
  return runs.some(row => row.value.evidenceRef === ref || row.value.publicationReceipt?.receiptId === ref);
@@ -57,23 +127,58 @@ function canonicalWorkflowEvidenceAvailable(input: { controllerHome: string; rep
57
127
  } catch { return false; }
58
128
  }
59
129
 
60
- function assertMemoryWriteAuthority(input: { controllerHome: string; repoId: string; identity?: ExperienceWriteIdentity }, scope: ScopeRef, sourceWorkId: string, sourceRoundId: string): void {
130
+ export function workExperienceProvenance(work: Pick<WorkContract, 'workId' | 'semanticRevision'>): string {
131
+ const revision = Number(work.semanticRevision);
132
+ return `work:${work.workId}:r${Number.isSafeInteger(revision) && revision > 0 ? revision : 'legacy'}`;
133
+ }
134
+
135
+ export function assertMemoryWriteAuthority(input: { controllerHome: string; repoId: string; identity?: ExperienceWriteIdentity }, scope: ScopeRef, sourceWorkId: string, sourceRoundId: string): void {
61
136
  const identity = input.identity;
62
- if (!identity) throw new Error('EXPERIENCE_CONTROLLER_REQUIRED');
63
- const current = getWorkContract(input, identity.workId), source = getWorkContract(input, sourceWorkId);
64
- if (!current || isTerminalWorkContractStatus(current.status) || !source || !matchesScope(current, scope, input.controllerHome) || !matchesScope(source, scope, input.controllerHome)) throw new Error('EXPERIENCE_WORK_SCOPE_MISMATCH');
65
- const owner = getControllerSession(input, identity.workId);
66
- if (!owner || owner.controllerId !== identity.controllerId) throw new Error('EXPERIENCE_CONTROLLER_NOT_OWNER');
67
- const relay = getControllerRoundRelay(input, identity.workId);
68
- if (relay) {
69
- if (relay.status !== 'claimed' || relay.authorityId !== identity.authorityId || relay.claimGeneration !== owner.claimGeneration
70
- || sourceRoundId !== `${relay.relayScopeId}:${relay.roundCount}`) throw new Error('EXPERIENCE_ROUND_AUTHORITY_MISMATCH');
71
- } else if (!controllerSessionAuthorityMatches(owner, identity.authorityId)
72
- || sourceRoundId !== `${identity.workId}:${owner.claimGeneration}`) throw new Error('EXPERIENCE_CLAIM_AUTHORITY_MISMATCH');
137
+ if (!identity?.workId?.trim()) throw new Error('EXPERIENCE_WORK_IDENTITY_REQUIRED');
138
+ const current = getWorkContract(input, identity.workId);
139
+ const source = getWorkContract(input, sourceWorkId);
140
+ if (!current || isTerminalSemanticWorkState(current.semanticState) || !source
141
+ || current.workId !== source.workId
142
+ || !matchesExperienceScope(current, scope, input.controllerHome)
143
+ || !matchesExperienceScope(source, scope, input.controllerHome)) {
144
+ throw new Error('EXPERIENCE_WORK_SCOPE_MISMATCH');
145
+ }
146
+ if (sourceRoundId !== workExperienceProvenance(source)) {
147
+ throw new Error('EXPERIENCE_WORK_PROVENANCE_MISMATCH');
148
+ }
149
+ }
150
+
151
+ function assertClosedRoundLearningWriteAuthority(
152
+ input: Pick<ExperienceStoreOptions, 'controllerHome' | 'repoId' | 'closedRoundAuthority'>,
153
+ scope: ScopeRef,
154
+ sourceWorkId: string,
155
+ sourceRoundId: string,
156
+ ): void {
157
+ const authority = input.closedRoundAuthority;
158
+ if (!authority || authority.workId !== sourceWorkId || authority.sourceRoundId !== sourceRoundId) {
159
+ throw new Error('EXPERIENCE_CLOSED_ROUND_AUTHORITY_MISMATCH');
160
+ }
161
+ const work = getWorkContract(input, authority.workId);
162
+ if (!work || isTerminalSemanticWorkState(work.semanticState) || !matchesExperienceScope(work, scope, input.controllerHome)) {
163
+ throw new Error('EXPERIENCE_CLOSED_ROUND_WORK_SCOPE_MISMATCH');
164
+ }
165
+ const relay = getControllerRoundRelay(input, authority.workId);
166
+ if (!relay?.observationWindow?.some(observation => observation.roundRef === sourceRoundId)) {
167
+ throw new Error('EXPERIENCE_CLOSED_ROUND_NOT_OBSERVED');
168
+ }
169
+ }
170
+
171
+ function assertExperienceStoreWriteAuthority(input: ExperienceStoreOptions, scope: ScopeRef, sourceWorkId: string, sourceRoundId: string): void {
172
+ if (input.identity && input.closedRoundAuthority) throw new Error('EXPERIENCE_WRITE_AUTHORITY_AMBIGUOUS');
173
+ if (input.closedRoundAuthority) {
174
+ assertClosedRoundLearningWriteAuthority(input, scope, sourceWorkId, sourceRoundId);
175
+ return;
176
+ }
177
+ assertMemoryWriteAuthority(input, scope, sourceWorkId, sourceRoundId);
73
178
  }
74
179
 
75
180
  /** One SQLite writer; nested domain operations share the same transaction. */
76
- export function controllerExperienceStore(input: { controllerHome: string; repoId: string; identity?: ExperienceWriteIdentity; now?: () => string }): ExperienceStorePort {
181
+ export function controllerExperienceStore(input: ExperienceStoreOptions): ExperienceStorePort {
77
182
  let transaction: SqliteDatabase | undefined;
78
183
  const key = (scope: ScopeRef) => `${scope.kind}:${scope.id}`;
79
184
  const work = (id: string) => getWorkContract(input, id);
@@ -86,7 +191,7 @@ export function controllerExperienceStore(input: { controllerHome: string; repoI
86
191
  });
87
192
  },
88
193
  assertWriteAuthority(scope, sourceWorkId, sourceRoundId) {
89
- assertMemoryWriteAuthority(input, scope, sourceWorkId, sourceRoundId);
194
+ assertExperienceStoreWriteAuthority(input, scope, sourceWorkId, sourceRoundId);
90
195
  },
91
196
  evidenceAvailable(ref, scope, sourceWorkId) {
92
197
  return canonicalWorkflowEvidenceAvailable(input, ref, scope, sourceWorkId);
@@ -113,7 +218,21 @@ export function controllerExperienceStore(input: { controllerHome: string; repoI
113
218
  };
114
219
  }
115
220
 
116
- export function controllerOutcomeObservationStore(input: { controllerHome: string; repoId: string; identity?: ExperienceWriteIdentity; now?: () => string }): OutcomeObservationStorePort {
221
+ export function recordClosedRoundExperience(input: {
222
+ controllerHome: string;
223
+ repoId: string;
224
+ authority: ClosedRoundLearningAuthority;
225
+ record: ExperienceRecord;
226
+ now?: string;
227
+ }): ExperienceRecord {
228
+ return recordExperience(
229
+ controllerExperienceStore({ controllerHome: input.controllerHome, repoId: input.repoId, closedRoundAuthority: input.authority }),
230
+ input.record,
231
+ input.now,
232
+ );
233
+ }
234
+
235
+ export function controllerOutcomeObservationStore(input: ExperienceStoreOptions): OutcomeObservationStorePort {
117
236
  let transaction: SqliteDatabase | undefined;
118
237
  const key = (scope: ScopeRef) => `${scope.kind}:${scope.id}`;
119
238
  return {
@@ -124,7 +243,7 @@ export function controllerOutcomeObservationStore(input: { controllerHome: strin
124
243
  try { return operation(); } finally { transaction = undefined; }
125
244
  });
126
245
  },
127
- assertWriteAuthority(scope, sourceWorkId, sourceRoundId) { assertMemoryWriteAuthority(input, scope, sourceWorkId, sourceRoundId); },
246
+ assertWriteAuthority(scope, sourceWorkId, sourceRoundId) { assertExperienceStoreWriteAuthority(input, scope, sourceWorkId, sourceRoundId); },
128
247
  evidenceAvailable(ref, scope, sourceWorkId) { return canonicalWorkflowEvidenceAvailable(input, ref, scope, sourceWorkId); },
129
248
  read(scope, id) {
130
249
  const row = transaction ? readControlPlaneRecordWithinTransaction<OutcomeObservation>(transaction, OUTCOME_OBSERVATION_NAMESPACE, key(scope), id)
@@ -146,6 +265,20 @@ export function controllerOutcomeObservationStore(input: { controllerHome: strin
146
265
  };
147
266
  }
148
267
 
268
+ export function recordClosedRoundOutcomeObservation(input: {
269
+ controllerHome: string;
270
+ repoId: string;
271
+ authority: ClosedRoundLearningAuthority;
272
+ observation: OutcomeObservation;
273
+ now?: string;
274
+ }): OutcomeObservation {
275
+ return recordOutcomeObservation(
276
+ controllerOutcomeObservationStore({ controllerHome: input.controllerHome, repoId: input.repoId, closedRoundAuthority: input.authority }),
277
+ input.observation,
278
+ input.now,
279
+ );
280
+ }
281
+
149
282
  /** Called by central maintenance, never by recall. A 30-day terminal grace preserves diagnosis. */
150
283
  export function cleanupExpiredExperiences(controllerHome: string, now = new Date().toISOString(), limit = 100): number {
151
284
  const at = Date.parse(now);
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  listControlPlaneRecords,
3
+ listControlPlaneRecordsWithinTransaction,
3
4
  readControlPlaneRecord,
4
5
  readControlPlaneRecordWithinTransaction,
5
6
  withControlPlaneTransaction,
@@ -7,8 +8,8 @@ import {
7
8
  type ControlPlaneRecord,
8
9
  type SqliteDatabase,
9
10
  } from './sqlite-store';
10
- import { isRepositoryCompletionReceipt, type WorkContract } from '../facade/types';
11
11
  import { REQUIREMENT_STATE_TRANSITIONS, type RequirementState } from '../../../../packages/kernel/goal/api/index';
12
+ import type { ScopeRef } from '../../../../packages/kernel/identity/api/index';
12
13
  export { REQUIREMENT_STATES, type RequirementState } from '../../../../packages/kernel/goal/api/index';
13
14
 
14
15
  export interface Requirement {
@@ -30,6 +31,10 @@ export interface Requirement {
30
31
  planIds: string[];
31
32
  acceptedAt: string;
32
33
  };
34
+ /** Semantic authored-context revision. Legacy rows normalize to semantic revision 1 until first thin semantic write. */
35
+ semanticRevision?: number;
36
+ /** Timestamp of the authored semantic content; mechanical Requirement updates must not change it. */
37
+ semanticUpdatedAt?: string;
33
38
  revision: number;
34
39
  createdAt: string;
35
40
  updatedAt: string;
@@ -48,9 +53,41 @@ export interface CreateRequirementInput {
48
53
  outcomeStatement: string;
49
54
  acceptanceCriteria?: string[];
50
55
  requiredDeliveryReferences?: string[];
56
+ /** Authority-derived provenance only; raw transports must not pass arbitrary audit refs. */
57
+ auditRefs?: string[];
58
+ }
59
+
60
+ export type SemanticRequirementState = 'open' | 'completed' | 'cancelled';
61
+
62
+ export interface RequirementSemanticView {
63
+ requirementId: string;
64
+ revision: number;
65
+ semanticScope: ScopeRef;
66
+ title: string;
67
+ outcomeStatement: string;
68
+ acceptanceCriteria: string[];
69
+ requiredDeliveryReferences: string[];
70
+ state: SemanticRequirementState;
71
+ createdAt: string;
72
+ updatedAt: string;
73
+ }
74
+
75
+ export interface RequirementRevisionRecord extends RequirementSemanticView {
76
+ schemaVersion: 1;
77
+ recordedAt: string;
78
+ }
79
+
80
+ export interface ReviseRequirementSemanticInput {
81
+ expectedRevision: number;
82
+ title?: string;
83
+ outcomeStatement?: string;
84
+ acceptanceCriteria?: string[];
85
+ requiredDeliveryReferences?: string[];
86
+ state?: SemanticRequirementState;
51
87
  }
52
88
 
53
89
  const NAMESPACE = 'requirement';
90
+ const REVISION_NAMESPACE = 'requirement_revision';
54
91
  const SCOPE = 'controller';
55
92
  const SCHEMA_VERSION = 1;
56
93
 
@@ -68,6 +105,36 @@ function bounded(values: readonly string[] | undefined, limit: number, maxLength
68
105
  return (values ?? []).map((value) => String(value).trim()).filter(Boolean).slice(0, limit).map((value) => value.slice(0, maxLength));
69
106
  }
70
107
 
108
+ export function currentRequirementSemanticRevision(requirement: Requirement): number {
109
+ const semantic = Number(requirement.semanticRevision);
110
+ return Number.isInteger(semantic) && semantic > 0 ? semantic : 1;
111
+ }
112
+
113
+ export function semanticRequirementState(requirement: Pick<Requirement, 'state'>): SemanticRequirementState {
114
+ if (requirement.state === 'done') return 'completed';
115
+ if (requirement.state === 'cancelled') return 'cancelled';
116
+ return 'open';
117
+ }
118
+
119
+ export function requirementSemanticView(requirement: Requirement): RequirementSemanticView {
120
+ return {
121
+ requirementId: requirement.requirementId,
122
+ revision: currentRequirementSemanticRevision(requirement),
123
+ semanticScope: { schemaVersion: 1, kind: 'requirement', id: requirement.requirementId },
124
+ title: requirement.title,
125
+ outcomeStatement: requirement.outcomeStatement,
126
+ acceptanceCriteria: [...requirement.acceptanceCriteria],
127
+ requiredDeliveryReferences: [...requirement.requiredDeliveryReferences],
128
+ state: semanticRequirementState(requirement),
129
+ createdAt: requirement.createdAt,
130
+ updatedAt: requirement.semanticUpdatedAt ?? requirement.createdAt,
131
+ };
132
+ }
133
+
134
+ function requirementRevisionKey(requirementId: string, revision: number): string {
135
+ return `${id(requirementId)}:r${revision}`;
136
+ }
137
+
71
138
  export function isLegacyMachineRequirementWait(requirement: Pick<Requirement, 'state' | 'attentionSummary'>): boolean {
72
139
  return requirement.state === 'waiting_for_user'
73
140
  && /^Work .+ delivered machine-valid evidence \(.+\); ChatGPT\/user semantic acceptance is still required\.$/.test(requirement.attentionSummary ?? '');
@@ -95,6 +162,98 @@ export function listRequirements(
95
162
  });
96
163
  }
97
164
 
165
+ /** Exact historical lookup, independent of global revision-list limits. */
166
+ export function getRequirementRevisionRecord(
167
+ options: RequirementStoreOptions,
168
+ requirementId: string,
169
+ revision: number,
170
+ ): RequirementRevisionRecord | undefined {
171
+ if (!Number.isInteger(revision) || revision < 1) return undefined;
172
+ const record = readControlPlaneRecord<RequirementRevisionRecord>(
173
+ options.controllerHome, REVISION_NAMESPACE, SCOPE, requirementRevisionKey(requirementId, revision),
174
+ )?.value;
175
+ return record ? {
176
+ ...record,
177
+ semanticScope: record.semanticScope ?? { schemaVersion: 1, kind: 'requirement', id: record.requirementId },
178
+ } : undefined;
179
+ }
180
+
181
+ export function listRequirementRevisionRecords(
182
+ options: RequirementStoreOptions,
183
+ requirementId?: string,
184
+ limit = 200,
185
+ ): RequirementRevisionRecord[] {
186
+ const normalizedId = requirementId ? id(requirementId) : undefined;
187
+ return listControlPlaneRecords<RequirementRevisionRecord>(options.controllerHome, {
188
+ namespace: REVISION_NAMESPACE,
189
+ scope: SCOPE,
190
+ limit: Math.max(1, Math.min(Math.trunc(limit), 1000)),
191
+ }).map((record) => record.value)
192
+ .filter((record) => !normalizedId || record.requirementId === normalizedId)
193
+ .map((record) => ({
194
+ ...record,
195
+ semanticScope: record.semanticScope ?? ({ schemaVersion: 1, kind: 'requirement', id: record.requirementId } as const),
196
+ }))
197
+ .sort((left, right) => right.revision - left.revision);
198
+ }
199
+
200
+ export function reviseRequirementSemantic(
201
+ options: RequirementStoreOptions,
202
+ requirementIdInput: string,
203
+ input: ReviseRequirementSemanticInput,
204
+ ): Requirement {
205
+ const requirementId = id(requirementIdInput);
206
+ if (!Number.isInteger(input.expectedRevision) || input.expectedRevision < 1) throw new Error('REQUIREMENT_EXPECTED_REVISION_INVALID');
207
+ return withControlPlaneTransaction(options.controllerHome, (database) => {
208
+ const current = readWithin(database, requirementId);
209
+ if (!current) throw new Error(`REQUIREMENT_NOT_FOUND: ${requirementId}`);
210
+ const semanticRevision = currentRequirementSemanticRevision(current.value);
211
+ if (semanticRevision !== input.expectedRevision) {
212
+ throw new Error(`REQUIREMENT_REVISION_CONFLICT:${requirementId}:expected=${input.expectedRevision}:actual=${semanticRevision}`);
213
+ }
214
+ const at = nowIso(options);
215
+ const revisionKey = requirementRevisionKey(requirementId, semanticRevision);
216
+ if (!readControlPlaneRecordWithinTransaction<RequirementRevisionRecord>(database, REVISION_NAMESPACE, SCOPE, revisionKey)) {
217
+ const archived: RequirementRevisionRecord = { schemaVersion: 1, ...requirementSemanticView(current.value), recordedAt: at };
218
+ writeControlPlaneRecordWithinTransaction(database, {
219
+ namespace: REVISION_NAMESPACE, scope: SCOPE, key: revisionKey, schemaVersion: 1,
220
+ value: archived, action: 'requirement_semantic_revision_archived', expectedRevision: null,
221
+ });
222
+ }
223
+ const requestedState = input.state;
224
+ if (requestedState === 'open' && (current.value.state === 'done' || current.value.state === 'cancelled')) {
225
+ throw new Error(`REQUIREMENT_SEMANTIC_REOPEN_FORBIDDEN:${requirementId}:${current.value.state}`);
226
+ }
227
+ const legacyState: RequirementState = requestedState === 'completed'
228
+ ? 'done'
229
+ : requestedState === 'cancelled'
230
+ ? 'cancelled'
231
+ : requestedState === 'open'
232
+ ? 'active'
233
+ : current.value.state;
234
+ const title = input.title === undefined ? current.value.title : String(input.title).trim().slice(0, 500);
235
+ const outcomeStatement = input.outcomeStatement === undefined ? current.value.outcomeStatement : String(input.outcomeStatement).trim().slice(0, 2_000);
236
+ if (!title || !outcomeStatement) throw new Error('REQUIREMENT_CONTENT_REQUIRED');
237
+ const updated: Requirement = {
238
+ ...current.value,
239
+ title,
240
+ outcomeStatement,
241
+ acceptanceCriteria: input.acceptanceCriteria === undefined ? [...current.value.acceptanceCriteria] : bounded(input.acceptanceCriteria, 50),
242
+ requiredDeliveryReferences: input.requiredDeliveryReferences === undefined ? [...current.value.requiredDeliveryReferences] : bounded(input.requiredDeliveryReferences, 50),
243
+ state: legacyState,
244
+ ...(requestedState ? { needsAttention: false, attentionSummary: undefined } : {}),
245
+ semanticRevision: semanticRevision + 1,
246
+ semanticUpdatedAt: at,
247
+ revision: current.value.revision + 1,
248
+ updatedAt: at,
249
+ };
250
+ return writeControlPlaneRecordWithinTransaction(database, {
251
+ namespace: NAMESPACE, scope: SCOPE, key: requirementId, schemaVersion: SCHEMA_VERSION,
252
+ value: updated, action: 'requirement_semantic_revised', expectedRevision: current.revision,
253
+ }).value;
254
+ });
255
+ }
256
+
98
257
  export function createRequirement(
99
258
  options: RequirementStoreOptions,
100
259
  input: CreateRequirementInput,
@@ -109,16 +268,29 @@ export function createRequirement(
109
268
  outcomeStatement: String(input.outcomeStatement ?? '').trim().slice(0, 2_000),
110
269
  acceptanceCriteria: bounded(input.acceptanceCriteria, 50),
111
270
  requiredDeliveryReferences: bounded(input.requiredDeliveryReferences, 50),
271
+ auditRefs: bounded(input.auditRefs, 50),
112
272
  state: 'planned',
113
273
  needsAttention: false,
274
+ semanticRevision: 1,
275
+ semanticUpdatedAt: at,
114
276
  revision: 1,
115
277
  createdAt: at,
116
278
  updatedAt: at,
117
- auditRefs: [],
118
279
  };
119
280
  if (!requirement.title || !requirement.outcomeStatement) throw new Error('REQUIREMENT_CONTENT_REQUIRED');
120
281
  withControlPlaneTransaction(options.controllerHome, (database) => {
121
282
  if (readWithin(database, requirementId)) throw new Error(`REQUIREMENT_ALREADY_EXISTS: ${requirementId}`);
283
+ const exclusiveCandidateRefs = requirement.auditRefs.filter(ref => ref.startsWith('cognitive-requirement-candidate:'));
284
+ if (exclusiveCandidateRefs.length > 0) {
285
+ const existing = listControlPlaneRecordsWithinTransaction<Requirement>(database, {
286
+ namespace: NAMESPACE,
287
+ scope: SCOPE,
288
+ limit: 1000,
289
+ });
290
+ if (existing.length >= 1000) throw new Error('REQUIREMENT_CANDIDATE_BINDING_LOOKUP_LIMIT');
291
+ const alreadyBound = existing.find(record => exclusiveCandidateRefs.some(ref => record.value.auditRefs.includes(ref)));
292
+ if (alreadyBound) throw new Error('REQUIREMENT_CANDIDATE_ALREADY_PROMOTED');
293
+ }
122
294
  writeControlPlaneRecordWithinTransaction(database, {
123
295
  namespace: NAMESPACE,
124
296
  scope: SCOPE,
@@ -132,6 +304,48 @@ export function createRequirement(
132
304
  return requirement;
133
305
  }
134
306
 
307
+ export function bindRequirementCandidateAuditRef(
308
+ options: RequirementStoreOptions,
309
+ requirementIdInput: string,
310
+ candidateAuditRefInput: string,
311
+ ): Requirement {
312
+ const requirementId = id(requirementIdInput);
313
+ const candidateAuditRef = String(candidateAuditRefInput ?? '').trim().slice(0, 500);
314
+ if (!candidateAuditRef.startsWith('cognitive-requirement-candidate:')) {
315
+ throw new Error('REQUIREMENT_CANDIDATE_AUDIT_REF_INVALID');
316
+ }
317
+ return withControlPlaneTransaction(options.controllerHome, (database) => {
318
+ const records = listControlPlaneRecordsWithinTransaction<Requirement>(database, {
319
+ namespace: NAMESPACE,
320
+ scope: SCOPE,
321
+ limit: 1000,
322
+ });
323
+ if (records.length >= 1000) throw new Error('REQUIREMENT_CANDIDATE_BINDING_LOOKUP_LIMIT');
324
+ const bound = records.find(record => record.value.auditRefs.includes(candidateAuditRef));
325
+ if (bound && bound.value.requirementId !== requirementId) {
326
+ throw new Error('REQUIREMENT_CANDIDATE_ALREADY_PROMOTED');
327
+ }
328
+ const current = readWithin(database, requirementId);
329
+ if (!current) throw new Error(`REQUIREMENT_NOT_FOUND: ${requirementId}`);
330
+ if (current.value.auditRefs.includes(candidateAuditRef)) return current.value;
331
+ const updated: Requirement = {
332
+ ...current.value,
333
+ auditRefs: [...new Set([...current.value.auditRefs, candidateAuditRef])].slice(-50),
334
+ revision: current.value.revision + 1,
335
+ updatedAt: nowIso(options),
336
+ };
337
+ return writeControlPlaneRecordWithinTransaction(database, {
338
+ namespace: NAMESPACE,
339
+ scope: SCOPE,
340
+ key: requirementId,
341
+ schemaVersion: SCHEMA_VERSION,
342
+ value: updated,
343
+ action: 'requirement_candidate_promoted',
344
+ expectedRevision: current.revision,
345
+ }).value;
346
+ });
347
+ }
348
+
135
349
  export function updateRequirement(
136
350
  options: RequirementStoreOptions,
137
351
  input: {
@@ -167,75 +381,3 @@ export function updateRequirement(
167
381
  }).value;
168
382
  });
169
383
  }
170
-
171
- export interface RequirementCompletionInput {
172
- requirementId: string;
173
- work: Pick<WorkContract,
174
- | 'workId'
175
- | 'requirementId'
176
- | 'status'
177
- | 'phase'
178
- | 'evidenceState'
179
- | 'completionOutcome'
180
- | 'completionReceipt'
181
- >;
182
- }
183
-
184
- /**
185
- * Project machine-complete Work delivery evidence into a Requirement without
186
- * asserting Requirement-level semantic acceptance. A Work is only one Plan-step
187
- * execution fact; it must not move the whole Requirement to waiting_for_user
188
- * while sibling/current Plan slices still exist. Requirement acceptance is a
189
- * separate lifecycle decision after current Plan/Work authority converges.
190
- *
191
- * The legacy function name is retained for compatibility with completion
192
- * callers. Its authority is evidence projection only, not semantic completion.
193
- */
194
- export function completeRequirementFromWork(
195
- options: RequirementStoreOptions,
196
- input: RequirementCompletionInput,
197
- ): Requirement {
198
- const requirementId = id(input.requirementId);
199
- const current = readRequirement(options, requirementId);
200
- if (!current) throw new Error(`REQUIREMENT_NOT_FOUND: ${requirementId}`);
201
- if (current.value.state === 'done') return current.value;
202
- if (current.value.state === 'cancelled') throw new Error('REQUIREMENT_CANCELLED');
203
-
204
- const work = input.work;
205
- if (work.requirementId !== requirementId) throw new Error('REQUIREMENT_WORK_IDENTITY_MISMATCH');
206
- if (work.status !== 'completed') throw new Error('REQUIREMENT_WORK_NOT_COMPLETED');
207
- if (work.phase !== 'cleanup') throw new Error('REQUIREMENT_WORK_CLEANUP_REQUIRED');
208
- if (work.evidenceState !== 'valid') throw new Error('REQUIREMENT_WORK_EVIDENCE_NOT_VALID');
209
- if (!work.completionOutcome) throw new Error('REQUIREMENT_WORK_COMPLETION_OUTCOME_REQUIRED');
210
- if (work.completionOutcome === 'superseded') throw new Error('REQUIREMENT_WORK_OUTCOME_NOT_COMPLETED');
211
-
212
- const receipt = work.completionReceipt;
213
- if (!receipt) throw new Error('REQUIREMENT_WORK_COMPLETION_RECEIPT_REQUIRED');
214
- if (receipt.workId !== work.workId) throw new Error('REQUIREMENT_WORK_RECEIPT_IDENTITY_MISMATCH');
215
- if (!isRepositoryCompletionReceipt(receipt)) throw new Error('REQUIREMENT_WORK_REPOSITORY_RECEIPT_REQUIRED');
216
- if (receipt.delivery.kind === 'superseded' || receipt.delivery.status !== 'integrated' || !receipt.delivery.reachable) throw new Error('REQUIREMENT_WORK_DELIVERY_NOT_PROVEN');
217
- if (!['complete', 'maintenance_warning'].includes(receipt.cleanup.status) || receipt.cleanup.blockers.length > 0) throw new Error('REQUIREMENT_WORK_CLEANUP_NOT_PROVEN');
218
-
219
- if (current.value.auditRefs.includes(receipt.receiptId)) return current.value;
220
- return updateRequirement(options, {
221
- requirementId,
222
- action: 'requirement_delivery_evidence_recorded',
223
- mutate: (latest) => {
224
- // Preserve concurrent terminal or genuinely user-blocked semantic state.
225
- // Older V2 builds generated waiting_for_user from a single Work receipt;
226
- // recognize that exact compatibility message and repair it back to active.
227
- if (latest.state === 'done') return latest;
228
- if (latest.state === 'cancelled') throw new Error('REQUIREMENT_CANCELLED');
229
- const legacyMachineWait = latest.state === 'waiting_for_user'
230
- && /^Work .+ delivered machine-valid evidence \(.+\); ChatGPT\/user semantic acceptance is still required\.$/.test(latest.attentionSummary ?? '');
231
- const preserveSemanticWait = latest.state === 'waiting_for_user' && !legacyMachineWait;
232
- return {
233
- ...latest,
234
- state: preserveSemanticWait ? 'waiting_for_user' : 'active',
235
- needsAttention: preserveSemanticWait ? latest.needsAttention : false,
236
- attentionSummary: preserveSemanticWait ? latest.attentionSummary : undefined,
237
- auditRefs: Array.from(new Set([...latest.auditRefs, receipt.receiptId])).slice(-50),
238
- };
239
- },
240
- });
241
- }