@moretea-labs/forge 1.7.2 → 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 +26 -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 -1613
  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 +369 -99
  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 +219 -22
  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 -6655
  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 +85 -18
  609. package/src/runtime/root/package-runtime-service.ts +60 -97
  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
@@ -5,6 +5,7 @@ usage() {
5
5
  cat <<'USAGE_EOF'
6
6
  Usage:
7
7
  scripts/architecture-queue.sh record --file <path>
8
+ scripts/architecture-queue.sh resolve --file <docs/architecture/requests/file.md>
8
9
  scripts/architecture-queue.sh status [--format text|json|summary] [--gate]
9
10
  scripts/architecture-queue.sh reindex [--check] [--quiet]
10
11
  scripts/architecture-queue.sh triage --before <YYYY-MM-DD>
@@ -187,6 +188,48 @@ repo_relative_path() {
187
188
  printf '%s' "$value"
188
189
  }
189
190
 
191
+ clear_contract_pending_request() {
192
+ local rel_request="$1"
193
+ local short_request="${rel_request#docs/architecture/}"
194
+ local context_file tmp
195
+
196
+ while IFS= read -r context_file; do
197
+ if ! grep -Fq "Pending architecture request: \`${rel_request}\`" "$context_file" &&
198
+ ! grep -Fq "Pending architecture request: \`${short_request}\`" "$context_file"; then
199
+ continue
200
+ fi
201
+ tmp="$(mktemp)"
202
+ awk -v rel="$rel_request" -v short="$short_request" '
203
+ index($0, "Pending architecture request: `" rel "`") > 0 ||
204
+ index($0, "Pending architecture request: `" short "`") > 0 {
205
+ print "- Pending architecture request: `(none)`"
206
+ next
207
+ }
208
+ { print }
209
+ ' "$context_file" > "$tmp"
210
+ mv "$tmp" "$context_file"
211
+ echo "[ArchitectureQueue] Cleared pending architecture request in ${context_file#./}"
212
+ done < <(find . \
213
+ \( -path './.git' -o -path './node_modules' -o -path './_ref' -o -path './_ops' \) -prune -o \
214
+ \( -name 'AGENTS.md' -o -name 'CLAUDE.md' \) -type f -print 2>/dev/null)
215
+ }
216
+
217
+ delete_request_file() {
218
+ local candidate="$1"
219
+ local rel_request
220
+ rel_request="$(repo_relative_path "$candidate" || true)"
221
+ if [[ -z "$rel_request" || "$(dirname "$rel_request")" != "$requests_dir" || "$rel_request" != "$requests_dir/"*.md ]]; then
222
+ echo "architecture-queue: resolve target must be a direct Markdown child of $requests_dir" >&2
223
+ return 2
224
+ fi
225
+ if [[ ! -f "$rel_request" ]]; then
226
+ echo "architecture-queue: request not found: $rel_request" >&2
227
+ return 2
228
+ fi
229
+ rm -- "$rel_request"
230
+ clear_contract_pending_request "$rel_request"
231
+ }
232
+
190
233
  metadata_value() {
191
234
  local file="$1"
192
235
  local label="$2"
@@ -563,6 +606,20 @@ record_command() {
563
606
  echo "[ArchitectureDrift] severity=$severity capability_id=$capability_id functional_block=$functional_block spawn_recommended=$spawn_recommended contract_sync_required=$contract_sync_required"
564
607
  }
565
608
 
609
+ resolve_command() {
610
+ if [[ -z "$file_path" ]]; then
611
+ echo "architecture-queue: resolve requires --file <docs/architecture/requests/file.md>" >&2
612
+ exit 2
613
+ fi
614
+ local rel_request
615
+ rel_request="$(repo_relative_path "$file_path" || true)"
616
+ delete_request_file "$rel_request"
617
+ quiet="true"
618
+ check_mode="false"
619
+ reindex_requests
620
+ echo "[ArchitectureQueue] Resolved $rel_request (deleted; Git history is the archive)"
621
+ }
622
+
566
623
  triage_command() {
567
624
  if [[ -z "$before_date" ]]; then
568
625
  echo "architecture-queue: triage requires --before <YYYY-MM-DD>" >&2
@@ -597,16 +654,7 @@ triage_command() {
597
654
  capability_id="${capability_id:-root}"
598
655
  card="$(request_card_path "$capability_id")"
599
656
  architecture_event upsert-from-request --source-request "$request" --request-file "$card"
600
- if [[ -x "scripts/archive-architecture-request.sh" ]]; then
601
- bash scripts/archive-architecture-request.sh \
602
- --request "$request" \
603
- --status superseded \
604
- --artifact "$card" \
605
- --note "Merged into architecture queue card by triage --before $before_date." >/dev/null
606
- else
607
- mkdir -p "docs/architecture/requests/archive/$(date '+%Y')"
608
- mv "$request" "docs/architecture/requests/archive/$(date '+%Y')/$(basename "$request")"
609
- fi
657
+ delete_request_file "$request"
610
658
  count=$((count + 1))
611
659
  done < <(find "$requests_dir" -maxdepth 1 -type f -name '*.md' | sort)
612
660
 
@@ -627,6 +675,9 @@ case "$command_name" in
627
675
  record)
628
676
  record_command
629
677
  ;;
678
+ resolve)
679
+ resolve_command
680
+ ;;
630
681
  status)
631
682
  status_command
632
683
  ;;
@@ -13,44 +13,12 @@ fi
13
13
  usage() {
14
14
  cat <<'USAGE_EOF'
15
15
  Usage: scripts/archive-workflow.sh --plan <plan-file> --outcome <Completed|Abandoned|Superseded>
16
- USAGE_EOF
17
- }
18
-
19
- set_plan_status() {
20
- local file="$1"
21
- local status="$2"
22
- local tmp_file
23
- tmp_file="$(mktemp)"
24
- awk -v next_status="$status" '
25
- BEGIN { updated = 0 }
26
- {
27
- if (!updated && $0 ~ /\*\*Status\*\*:/) {
28
- sub(/\*\*Status\*\*: .*/, "**Status**: " next_status)
29
- updated = 1
30
- }
31
- print
32
- }
33
- ' "$file" > "$tmp_file"
34
- mv "$tmp_file" "$file"
35
- }
36
16
 
37
- unique_archive_path() {
38
- local desired="$1"
39
- if [[ ! -e "$desired" ]]; then
40
- printf '%s' "$desired"
41
- return
42
- fi
43
-
44
- local stem ext counter candidate
45
- stem="${desired%.md}"
46
- ext=".md"
47
- counter=2
48
- candidate="${stem}-v${counter}${ext}"
49
- while [[ -e "$candidate" ]]; do
50
- counter=$((counter + 1))
51
- candidate="${stem}-v${counter}${ext}"
52
- done
53
- printf '%s' "$candidate"
17
+ Compatibility name: this helper closes a terminal repo-local workflow. It does
18
+ not create repository archive files. The final plan/contract/review/notes must
19
+ already be represented by HEAD with no staged or unstaged changes; after that
20
+ proof, the helper deletes those lifecycle artifacts and relies on Git history.
21
+ USAGE_EOF
54
22
  }
55
23
 
56
24
  normalize_slug() {
@@ -59,9 +27,7 @@ normalize_slug() {
59
27
 
60
28
  is_transient_plan_slug() {
61
29
  case "$1" in
62
- think-plan-[0-9]*|codex-plan-[0-9]*|approved-plan-[0-9]*)
63
- return 0
64
- ;;
30
+ think-plan-[0-9]*|codex-plan-[0-9]*|approved-plan-[0-9]*) return 0 ;;
65
31
  esac
66
32
  return 1
67
33
  }
@@ -104,53 +70,52 @@ plan_artifact_stem_from_parts() {
104
70
  fi
105
71
  }
106
72
 
107
- todo_is_deferred_ledger() {
108
- local file="${1:-tasks/todos.md}"
109
- [[ -f "$file" ]] || return 1
110
- grep -Eq '^# Deferred Goal Ledger[[:space:]]*$' "$file" \
111
- && grep -Eq '^> \*\*Status\*\*:[[:space:]]*Backlog[[:space:]]*$' "$file" \
112
- && grep -Eq '^## Deferred Goals[[:space:]]*$' "$file" \
113
- && grep -Eq '\|[[:space:]]*Goal[[:space:]]*\|[[:space:]]*Why Deferred[[:space:]]*\|[[:space:]]*Tradeoff[[:space:]]*\|[[:space:]]*Revisit Trigger[[:space:]]*\|' "$file"
73
+ repo_relative_path() {
74
+ local candidate="$1"
75
+ python3 - "$candidate" <<'PY'
76
+ from pathlib import Path
77
+ import sys
78
+ root = Path.cwd().resolve()
79
+ path = Path(sys.argv[1])
80
+ if not path.is_absolute():
81
+ path = root / path
82
+ try:
83
+ print(path.resolve().relative_to(root).as_posix())
84
+ except ValueError:
85
+ raise SystemExit(2)
86
+ PY
114
87
  }
115
88
 
116
- touch_deferred_ledger_update_marker() {
117
- local file="${1:-tasks/todos.md}"
118
- local tmp_file
119
- tmp_file="$(mktemp)"
120
- awk '
121
- BEGIN { updated = 0 }
122
- !updated && /^> \*\*Updated\*\*:/ {
123
- print "> **Updated**: (archive-workflow)"
124
- updated = 1
125
- next
126
- }
127
- { print }
128
- ' "$file" > "$tmp_file"
129
- mv "$tmp_file" "$file"
130
- }
131
-
132
- write_empty_deferred_ledger() {
133
- cat > tasks/todos.md <<'TODO_EOF'
134
- # Deferred Goal Ledger
135
-
136
- > **Status**: Backlog
137
- > **Updated**: (archive-workflow)
138
- > **Scope**: Medium/long-term goals deferred from active plan execution
139
-
140
- Current plan tasks live in the active plan's `## Task Breakdown`.
141
- Do not duplicate that execution checklist here. Record only work intentionally deferred beyond this slice, with the tradeoff and revisit trigger.
142
-
143
- ## Deferred Goals
144
-
145
- | Goal | Why Deferred | Tradeoff | Revisit Trigger |
146
- |------|--------------|----------|-----------------|
147
- | (none) | Archived workflow did not leave a deferred medium/long-term goal. | Keep the next slice clean. | Add a row when a real follow-up is postponed. |
148
- TODO_EOF
89
+ assert_history_safe() {
90
+ local candidate="$1"
91
+ local rel
92
+ [[ -f "$candidate" ]] || return 0
93
+ rel="$(repo_relative_path "$candidate" || true)"
94
+ [[ -n "$rel" ]] || {
95
+ echo "archive-workflow: refusing path outside repository: $candidate" >&2
96
+ return 1
97
+ }
98
+ git ls-files --error-unmatch -- "$rel" >/dev/null 2>&1 || {
99
+ echo "archive-workflow: refusing to delete untracked lifecycle artifact: $rel" >&2
100
+ echo "Persist or deliberately discard the unique content before workflow closeout." >&2
101
+ return 1
102
+ }
103
+ git cat-file -e "HEAD:$rel" 2>/dev/null || {
104
+ echo "archive-workflow: refusing to delete lifecycle artifact not represented by HEAD: $rel" >&2
105
+ return 1
106
+ }
107
+ git diff --quiet -- "$rel" || {
108
+ echo "archive-workflow: refusing to delete lifecycle artifact with unstaged changes: $rel" >&2
109
+ return 1
110
+ }
111
+ git diff --cached --quiet -- "$rel" || {
112
+ echo "archive-workflow: refusing to delete lifecycle artifact with staged changes: $rel" >&2
113
+ return 1
114
+ }
149
115
  }
150
116
 
151
117
  plan_file=""
152
118
  outcome=""
153
-
154
119
  while [[ $# -gt 0 ]]; do
155
120
  case "$1" in
156
121
  --plan)
@@ -175,120 +140,65 @@ while [[ $# -gt 0 ]]; do
175
140
  esac
176
141
  done
177
142
 
178
- if [[ -z "$plan_file" || -z "$outcome" ]]; then
179
- echo "--plan and --outcome are required" >&2
180
- usage
181
- exit 1
182
- fi
183
-
143
+ [[ -n "$plan_file" && -n "$outcome" ]] || { echo "--plan and --outcome are required" >&2; usage; exit 1; }
184
144
  case "$outcome" in
185
- Completed|Abandoned|Superseded)
186
- ;;
187
- *)
188
- echo "Invalid outcome: $outcome" >&2
189
- exit 1
190
- ;;
145
+ Completed|Abandoned|Superseded) ;;
146
+ *) echo "Invalid outcome: $outcome" >&2; exit 1 ;;
191
147
  esac
148
+ [[ -f "$plan_file" ]] || { echo "Plan file not found: $plan_file" >&2; exit 1; }
192
149
 
193
- if [[ ! -f "$plan_file" ]]; then
194
- echo "Plan file not found: $plan_file" >&2
195
- exit 1
196
- fi
197
-
198
- normalized_plan="${plan_file#./}"
199
- if [[ "$normalized_plan" == plans/archive/* ]]; then
200
- echo "Error: plan is already archived" >&2
201
- exit 1
202
- fi
203
-
204
- mkdir -p plans/archive tasks/archive tasks/notes
150
+ normalized_plan="$(repo_relative_path "$plan_file" || true)"
151
+ case "$normalized_plan" in
152
+ plans/*.md) ;;
153
+ *) echo "archive-workflow: plan must be a direct Markdown child of plans/: $plan_file" >&2; exit 1 ;;
154
+ esac
205
155
 
206
- timestamp="$(date +%Y%m%d-%H%M)"
207
- timestamp_human="$(date '+%Y-%m-%d %H:%M')"
208
- plan_base="$(basename "$plan_file")"
209
- slug="$(echo "$plan_base" | sed -E 's/^plan-[0-9]{8}-[0-9]{4}-//; s/\.md$//')"
156
+ plan_base="$(basename "$normalized_plan")"
157
+ slug="$(printf '%s' "$plan_base" | sed -E 's/^plan-[0-9]{8}-[0-9]{4}-//; s/\.md$//')"
210
158
  original_artifact_stem="$(printf '%s' "$plan_base" | sed -E 's/^plan-//; s/\.md$//')"
211
- artifact_stem="$(plan_artifact_stem_from_parts "$plan_file" "$original_artifact_stem" "$slug")"
212
- parent_run_id="${HOOK_RUN_ID:-${CLAUDE_RUN_ID:-${CODEX_RUN_ID:-run-${timestamp}}}}"
213
- todo_source_plan="$(awk -F': ' '/^> \*\*Source Plan\*\*:/ {print $2; exit}' tasks/todos.md 2>/dev/null | xargs)"
214
-
215
- plan_status="Archived"
216
- if [[ "$outcome" == "Abandoned" ]]; then
217
- plan_status="Abandoned"
218
- fi
219
- set_plan_status "$plan_file" "$plan_status"
220
-
221
- archive_plan_path="plans/archive/${plan_base}"
222
- archive_plan_path="$(unique_archive_path "$archive_plan_path")"
223
-
224
- if [[ "$plan_file" != "$archive_plan_path" ]]; then
225
- mv "$plan_file" "$archive_plan_path"
226
- fi
227
-
228
- if [[ -f tasks/todos.md ]] && grep -q '[^[:space:]]' tasks/todos.md; then
229
- archive_todo="tasks/archive/todo-${timestamp}-${slug}.md"
230
- {
231
- echo "> **Archived**: ${timestamp_human}"
232
- echo "> **Related Plan**: ${archive_plan_path}"
233
- echo "> **Outcome**: ${outcome}"
234
- echo "> **Source Plan**: ${todo_source_plan:-"(none)"}"
235
- echo "> **Parent Run ID**: ${parent_run_id}"
236
- echo
237
- cat tasks/todos.md
238
- } > "$archive_todo"
239
- fi
159
+ artifact_stem="$(plan_artifact_stem_from_parts "$normalized_plan" "$original_artifact_stem" "$slug")"
160
+
161
+ candidates=("$normalized_plan")
162
+ for path in \
163
+ "tasks/contracts/${artifact_stem}.contract.md" \
164
+ "tasks/reviews/${artifact_stem}.review.md" \
165
+ "tasks/notes/${artifact_stem}.notes.md" \
166
+ "tasks/contracts/${slug}.contract.md" \
167
+ "tasks/reviews/${slug}.review.md" \
168
+ "tasks/notes/${slug}.notes.md"; do
169
+ [[ -f "$path" ]] && candidates+=("$path")
170
+ done
240
171
 
241
- notes_file="tasks/notes/${artifact_stem}.notes.md"
242
- if [[ ! -f "$notes_file" && -f "tasks/notes/${slug}.notes.md" ]]; then
243
- notes_file="tasks/notes/${slug}.notes.md"
244
- fi
245
- if [[ -f "$notes_file" ]]; then
246
- archive_notes="$(unique_archive_path "tasks/archive/notes-${timestamp}-${slug}.md")"
247
- {
248
- echo "> **Archived**: ${timestamp_human}"
249
- echo "> **Related Plan**: ${archive_plan_path}"
250
- echo "> **Outcome**: ${outcome}"
251
- echo "> **Lifecycle**: notes"
252
- echo "> **Parent Run ID**: ${parent_run_id}"
253
- echo
254
- cat "$notes_file"
255
- } > "$archive_notes"
256
- rm -f "$notes_file"
257
- fi
172
+ # All-or-nothing preflight. Git history is only a valid archive after the exact
173
+ # terminal evidence has been committed; never silently erase unique local work.
174
+ for path in "${candidates[@]}"; do
175
+ assert_history_safe "$path"
176
+ done
258
177
 
259
- if todo_is_deferred_ledger tasks/todos.md; then
260
- touch_deferred_ledger_update_marker tasks/todos.md
261
- else
262
- write_empty_deferred_ledger
263
- fi
178
+ # Avoid deleting the same fallback artifact twice.
179
+ declare -A seen=()
180
+ for path in "${candidates[@]}"; do
181
+ [[ -n "${seen[$path]:-}" ]] && continue
182
+ seen[$path]=1
183
+ rm -- "$path"
184
+ echo "[WorkflowCloseout] Removed $path"
185
+ done
264
186
 
265
- # Clear active-plan markers if they pointed to the archived plan
266
- cleared_active=0
267
187
  for marker_file in ".ai/harness/active-plan" ".claude/.active-plan"; do
268
- if [[ ! -f "$marker_file" ]]; then
269
- continue
270
- fi
188
+ [[ -f "$marker_file" ]] || continue
271
189
  marker_value="$(cat "$marker_file" 2>/dev/null | xargs)"
272
- if [[ "$marker_value" == "$plan_file" || "$marker_value" == "./$plan_file" ]]; then
190
+ if [[ "$marker_value" == "$normalized_plan" || "$marker_value" == "./$normalized_plan" || "$marker_value" == "$plan_file" ]]; then
273
191
  rm -f "$marker_file"
274
- cleared_active=1
275
- echo "Cleared $marker_file (archived plan was active)"
192
+ echo "[WorkflowCloseout] Cleared $marker_file"
276
193
  fi
277
194
  done
278
- if [[ "$cleared_active" -eq 1 ]]; then
279
- rm -f ".ai/harness/active-worktree"
280
- fi
195
+ rm -f ".ai/harness/active-worktree"
281
196
 
282
- # Clean up saved plan state backups
283
- plan_key="$(basename "$plan_file" .md)"
284
- rm -f ".claude/.plan-state/${plan_key}.todo.md.bak"
285
- rm -f ".claude/.plan-state/${plan_key}.task-state.json.bak"
197
+ plan_key="$(basename "$normalized_plan" .md)"
198
+ rm -f ".claude/.plan-state/${plan_key}.todo.md.bak" ".claude/.plan-state/${plan_key}.task-state.json.bak"
286
199
 
287
200
  if [[ -x "scripts/refresh-current-status.sh" ]]; then
288
- bash "scripts/refresh-current-status.sh" --clear --write --reason "archive-workflow" || true
201
+ bash "scripts/refresh-current-status.sh" --clear --write --reason "workflow-closeout" || true
289
202
  fi
290
203
 
291
- echo "Archived plan to: $archive_plan_path"
292
- if [[ -f "docs/reference-configs/handoff-protocol.md" ]]; then
293
- echo "Next: refresh or prune long-running workflow rules using docs/reference-configs/handoff-protocol.md"
294
- fi
204
+ echo "[WorkflowCloseout] Closed $normalized_plan as outcome=$outcome; Git history is the archive."
@@ -15,7 +15,8 @@ type Capability = {
15
15
  prefixes: string[];
16
16
  contract_files: ContractFiles;
17
17
  architecture_module: string;
18
- workstream_dir: string;
18
+ /** Legacy migration metadata; new capability config never writes it. */
19
+ workstream_dir?: string;
19
20
  lsp_profile: string;
20
21
  verification_hints: string[];
21
22
  };
@@ -64,12 +65,12 @@ function usage(): never {
64
65
  " --agents <path> AGENTS.md path (default: <prefix>/AGENTS.md)",
65
66
  " --claude <path> CLAUDE.md path (default: <prefix>/CLAUDE.md)",
66
67
  " --architecture-module <path> Architecture module path",
67
- " --workstream-dir <path> Workstream directory path",
68
+ " --workstream-dir <path> RETIRED: repo-local Workstreams are no longer writable",
68
69
  " --lsp-profile <profile> LSP/tooling profile (default: typescript-lsp)",
69
70
  " --verification-hint <command> Repeatable local verification hint",
70
71
  " --create-prefix Create the prefix directory when missing",
71
72
  " --create-architecture-module Create a minimal architecture module when missing",
72
- " --create-workstream Create a durable workstream ledger",
73
+ " --create-workstream RETIRED: use Controller Home Requirement/Plan/Work",
73
74
  " --no-sync-contracts Only update the registry",
74
75
  " --dry-run Print planned changes without writing",
75
76
  " --format text|json Output format (default: text)",
@@ -238,7 +239,6 @@ function buildCapability(args: Args, repo: string): Capability {
238
239
  args.architectureModule || `docs/architecture/modules/${domain}/${name}.md`,
239
240
  repo
240
241
  ),
241
- workstream_dir: normalizeRepoPath(args.workstreamDir || `tasks/workstreams/${domain}/${name}`, repo),
242
242
  lsp_profile: args.lspProfile,
243
243
  verification_hints:
244
244
  args.verificationHints.length > 0 ? args.verificationHints : ["record local commands here before implementation"],
@@ -304,7 +304,7 @@ function syncContracts(repo: string, capability: Capability): void {
304
304
  architecture_domain: capability.domain,
305
305
  architecture_capability: capability.name,
306
306
  architecture_module: capability.architecture_module,
307
- workstream_dir: capability.workstream_dir,
307
+ ...(capability.workstream_dir ? { workstream_dir: capability.workstream_dir } : {}),
308
308
  contract_agents: capability.contract_files.agents,
309
309
  contract_claude: capability.contract_files.claude,
310
310
  lsp_profile: capability.lsp_profile,
@@ -341,12 +341,11 @@ function createArchitectureModule(repo: string, capability: Capability): void {
341
341
  );
342
342
  }
343
343
 
344
- function createWorkstream(repo: string, capability: Capability): void {
345
- runChecked(repo, "bash", ["scripts/workstream-sync.sh", "ensure", "--block", capability.prefixes[0]]);
346
- }
347
-
348
344
  function main(): void {
349
345
  const args = parseArgs(process.argv.slice(2));
346
+ if (args.workstreamDir || args.createWorkstream) {
347
+ throw new Error("LEGACY_WORKSTREAM_WRITES_RETIRED: repo-local tasks/workstreams are migration-only; use Forge Controller Home Requirement/Plan/Work");
348
+ }
350
349
  const repo = repoRoot(args.repo);
351
350
  const requestedCapability = buildCapability(args, repo);
352
351
  const prefixPath = resolve(repo, requestedCapability.prefixes[0]);
@@ -366,14 +365,12 @@ function main(): void {
366
365
 
367
366
  if (args.syncContracts) actions.push(`sync-contracts:${capability.contract_files.agents},${capability.contract_files.claude}`);
368
367
  if (args.createArchitectureModule) actions.push(`create-architecture-module:${capability.architecture_module}`);
369
- if (args.createWorkstream) actions.push(`create-workstream:${capability.workstream_dir}`);
370
368
  actions.push("validate:capability-registry");
371
369
 
372
370
  if (!args.dryRun) {
373
371
  if (status === "added") writeRegistry(repo, registry);
374
372
  if (args.syncContracts) syncContracts(repo, capability);
375
373
  if (args.createArchitectureModule) createArchitectureModule(repo, capability);
376
- if (args.createWorkstream) createWorkstream(repo, capability);
377
374
  validateRegistry(repo);
378
375
  }
379
376
 
@@ -15,7 +15,8 @@ type Capability = {
15
15
  prefixes: string[];
16
16
  contract_files: ContractFiles;
17
17
  architecture_module: string;
18
- workstream_dir: string;
18
+ /** Legacy migration metadata only. Modern capability authority uses Controller Home Work. */
19
+ workstream_dir?: string;
19
20
  lsp_profile: string;
20
21
  verification_hints: string[];
21
22
  };
@@ -25,7 +26,7 @@ type CapabilityRegistry = {
25
26
  capabilities: Capability[];
26
27
  };
27
28
 
28
- type Format = "json" | "text" | "prefixes";
29
+ type Format = "json" | "text" | "prefixes" | "ids";
29
30
 
30
31
  type Args = {
31
32
  command: string;
@@ -42,8 +43,8 @@ function usage(): never {
42
43
  [
43
44
  "Usage:",
44
45
  " scripts/capability-resolver.ts list [--repo <repo>] [--format json|text|prefixes]",
45
- " scripts/capability-resolver.ts match --path <repo-relative-path> [--repo <repo>] [--format json|text]",
46
- " scripts/capability-resolver.ts match --paths-from <file|-> [--repo <repo>] [--format json|text]",
46
+ " scripts/capability-resolver.ts match --path <repo-relative-path> [--repo <repo>] [--format json|text|ids]",
47
+ " scripts/capability-resolver.ts match --paths-from <file|-> [--repo <repo>] [--format json|text|ids]",
47
48
  " scripts/capability-resolver.ts validate [--repo <repo>] [--format json|text]",
48
49
  ].join("\n")
49
50
  );
@@ -73,7 +74,7 @@ function parseArgs(argv: string[]): Args {
73
74
  break;
74
75
  case "--format": {
75
76
  const value = argv[++index] as Format;
76
- if (!["json", "text", "prefixes"].includes(value)) usage();
77
+ if (!["json", "text", "prefixes", "ids"].includes(value)) usage();
77
78
  args.format = value;
78
79
  break;
79
80
  }
@@ -91,6 +92,7 @@ function parseArgs(argv: string[]): Args {
91
92
  if (args.command === "match" && !args.path && !args.pathsFrom) usage();
92
93
  if (args.command === "match" && args.path && args.pathsFrom) usage();
93
94
  if (args.command === "match" && args.format === "prefixes") usage();
95
+ if (args.command !== "match" && args.format === "ids") usage();
94
96
  return args;
95
97
  }
96
98
 
@@ -151,7 +153,6 @@ function defaultCapabilityForPrefix(prefix: string): Capability {
151
153
  claude: `${prefix}/CLAUDE.md`,
152
154
  },
153
155
  architecture_module: `docs/architecture/modules/${domain}/${name}.md`,
154
- workstream_dir: `tasks/workstreams/${domain}/${name}`,
155
156
  lsp_profile: "typescript-lsp",
156
157
  verification_hints: ["record local commands here before implementation"],
157
158
  };
@@ -220,7 +221,6 @@ function validateCapability(capability: Capability, repo: string): string[] {
220
221
  ["domain", capability.domain],
221
222
  ["name", capability.name],
222
223
  ["architecture_module", capability.architecture_module],
223
- ["workstream_dir", capability.workstream_dir],
224
224
  ["lsp_profile", capability.lsp_profile],
225
225
  ];
226
226
 
@@ -260,14 +260,20 @@ function validateCapability(capability: Capability, repo: string): string[] {
260
260
  }
261
261
  }
262
262
 
263
- for (const [field, value] of [
264
- ["architecture_module", capability.architecture_module],
265
- ["workstream_dir", capability.workstream_dir],
266
- ] as const) {
267
- try {
268
- normalizeRepoPath(value, repo);
269
- } catch (error) {
270
- errors.push(`${capability.id}: invalid ${field}: ${(error as Error).message}`);
263
+ try {
264
+ normalizeRepoPath(capability.architecture_module, repo);
265
+ } catch (error) {
266
+ errors.push(`${capability.id}: invalid architecture_module: ${(error as Error).message}`);
267
+ }
268
+ if (capability.workstream_dir !== undefined) {
269
+ if (typeof capability.workstream_dir !== "string" || capability.workstream_dir.trim() === "") {
270
+ errors.push(`${capability.id}: legacy workstream_dir must be a non-empty repository path when present`);
271
+ } else {
272
+ try {
273
+ normalizeRepoPath(capability.workstream_dir, repo);
274
+ } catch (error) {
275
+ errors.push(`${capability.id}: invalid legacy workstream_dir: ${(error as Error).message}`);
276
+ }
271
277
  }
272
278
  }
273
279
 
@@ -312,10 +318,16 @@ function validateRegistry(registry: CapabilityRegistry, repo: string): string[]
312
318
 
313
319
  try {
314
320
  architectureModules.add(normalizeRepoPath(capability.architecture_module, repo));
315
- workstreamDirs.add(normalizeRepoPath(capability.workstream_dir, repo));
316
321
  } catch {
317
322
  // Field-specific validation already recorded the concrete error.
318
323
  }
324
+ if (capability.workstream_dir) {
325
+ try {
326
+ workstreamDirs.add(normalizeRepoPath(capability.workstream_dir, repo));
327
+ } catch {
328
+ // Legacy field-specific validation already recorded the concrete error.
329
+ }
330
+ }
319
331
  }
320
332
 
321
333
  const modulesRoot = resolve(repo, "docs/architecture/modules");
@@ -338,7 +350,9 @@ function validateRegistry(registry: CapabilityRegistry, repo: string): string[]
338
350
  }
339
351
 
340
352
  const workstreamsRoot = resolve(repo, "tasks/workstreams");
341
- if (existsSync(workstreamsRoot)) {
353
+ // Only legacy registries that still declare workstream ownership participate
354
+ // in orphan validation. Modern registries do not synthesize this retired surface.
355
+ if (workstreamDirs.size > 0 && existsSync(workstreamsRoot)) {
342
356
  const stack = [workstreamsRoot];
343
357
  while (stack.length > 0) {
344
358
  const current = stack.pop()!;
@@ -383,7 +397,6 @@ function findMatch(registry: CapabilityRegistry, repo: string, inputPath: string
383
397
  architecture_domain: "root",
384
398
  architecture_capability: "_root",
385
399
  architecture_module: "docs/architecture/index.md",
386
- workstream_dir: "tasks/workstreams/root/_root",
387
400
  };
388
401
  }
389
402
 
@@ -409,7 +422,7 @@ function findMatch(registry: CapabilityRegistry, repo: string, inputPath: string
409
422
  architecture_domain: winner.capability.domain,
410
423
  architecture_capability: winner.capability.name,
411
424
  architecture_module: winner.capability.architecture_module,
412
- workstream_dir: winner.capability.workstream_dir,
425
+ ...(winner.capability.workstream_dir ? { workstream_dir: winner.capability.workstream_dir } : {}),
413
426
  contract_agents: winner.capability.contract_files.agents,
414
427
  contract_claude: winner.capability.contract_files.claude,
415
428
  lsp_profile: winner.capability.lsp_profile,
@@ -475,6 +488,9 @@ async function main(): Promise<void> {
475
488
  }
476
489
  if (args.format === "json") {
477
490
  printJson(matches);
491
+ } else if (args.format === "ids") {
492
+ const ids = [...new Set(matches.map((match) => match.capability_id))].sort();
493
+ for (const id of ids) console.log(id);
478
494
  } else {
479
495
  for (const match of matches) {
480
496
  console.log(`${match.file_path}: ${match.capability_id} (${match.matched_prefix})`);
@@ -486,6 +502,8 @@ async function main(): Promise<void> {
486
502
  const match = findMatch(registry, repo, args.path);
487
503
  if (args.format === "json") {
488
504
  printJson(match);
505
+ } else if (args.format === "ids") {
506
+ console.log(match.capability_id);
489
507
  } else {
490
508
  for (const [key, value] of Object.entries(match)) {
491
509
  if (Array.isArray(value)) {