@moretea-labs/forge 1.6.0 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (469) hide show
  1. package/AGENTS.md +4 -0
  2. package/CHANGELOG.md +39 -0
  3. package/CLAUDE.md +4 -0
  4. package/README.md +2 -2
  5. package/README.zh-CN.md +1 -1
  6. package/SKILL.md +2 -2
  7. package/THIRD_PARTY_NOTICES.md +1 -1
  8. package/agents/openai.yaml +1 -1
  9. package/assets/hooks/hook-input.sh +11 -8
  10. package/assets/hooks/lib/session-state.sh +10 -7
  11. package/assets/hooks/lib/workflow-state.sh +13 -177
  12. package/assets/hooks/post-tool-observer.sh +8 -2
  13. package/assets/hooks/prompt-guard.sh +5 -81
  14. package/assets/hooks/session-start-context.sh +56 -1
  15. package/assets/partials/05-workflow.partial.md +1 -1
  16. package/assets/partials-agents/02-operating-mode.partial.md +2 -0
  17. package/assets/partials-agents/03-orchestration.partial.md +1 -1
  18. package/assets/plugin-registry.v1.json +3 -3
  19. package/assets/reference-configs/document-generation.md +1 -1
  20. package/assets/reference-configs/harness-overview.md +1 -1
  21. package/assets/reference-configs/sprint-contracts.md +3 -3
  22. package/assets/skill-version.json +2 -2
  23. package/assets/templates/contract.template.md +2 -7
  24. package/assets/templates/helpers/capture-plan.sh +2 -2
  25. package/assets/templates/helpers/check-architecture-sync.sh +17 -0
  26. package/assets/templates/helpers/check-task-workflow.sh +4 -4
  27. package/assets/templates/helpers/contract-worktree.sh +1 -21
  28. package/assets/templates/helpers/ensure-task-workflow.sh +11 -36
  29. package/assets/templates/helpers/inspect-project-state.ts +8 -6
  30. package/assets/templates/helpers/migrate-project-template.sh +22 -45
  31. package/assets/templates/helpers/migrate-workflow-docs.ts +9 -7
  32. package/assets/templates/helpers/new-plan.sh +1 -1
  33. package/assets/templates/helpers/plan-to-todo.sh +12 -37
  34. package/assets/templates/helpers/ship-worktrees.sh +2 -29
  35. package/assets/templates/helpers/verify-contract.sh +1 -111
  36. package/assets/templates/helpers/verify-sprint.sh +3 -180
  37. package/assets/templates/helpers/workflow-contract.ts +5 -1
  38. package/assets/templates/plan.template.md +1 -1
  39. package/assets/templates/review.template.md +9 -34
  40. package/assets/workflow-contract.v1.json +10 -19
  41. package/docs/README.md +10 -10
  42. package/docs/architecture/CURRENT.md +178 -0
  43. package/docs/architecture/EVOLUTION.md +42 -0
  44. package/docs/architecture/current/README.md +4 -156
  45. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
  46. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
  47. package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
  48. package/docs/architecture/history/README.md +7 -0
  49. package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
  50. package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
  51. package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
  52. package/docs/architecture/history.md +3 -34
  53. package/docs/architecture/index.md +15 -98
  54. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  55. package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
  56. package/docs/architecture/versions/1.6.md +38 -0
  57. package/docs/architecture/versions/1.7.md +41 -0
  58. package/docs/forge-chatgpt-browser-engine.md +2 -2
  59. package/docs/forge-chatgpt-mcp-setup.md +4 -28
  60. package/docs/forge-chatgpt-supervised-automation.md +3 -3
  61. package/docs/forge-github-issue-launcher.md +1 -1
  62. package/docs/forge-plugin-management.md +1 -1
  63. package/docs/forge-runtime-self-healing-loop.md +1 -1
  64. package/docs/operations/controller-browser-plugin.md +26 -6
  65. package/docs/operations/controller-performance-and-502.md +143 -0
  66. package/docs/operations/controller-reliability-runbook.md +1 -1
  67. package/docs/operations/features.md +2 -2
  68. package/docs/operations/github-repository.md +1 -1
  69. package/docs/operations/homebrew.md +2 -2
  70. package/docs/operations/mcp-tool-exposure.md +5 -3
  71. package/docs/wiki/Architecture.md +6 -6
  72. package/docs/wiki/Implementation.md +2 -2
  73. package/docs/wiki/Integrations.md +2 -2
  74. package/docs/wiki/Work-Lifecycle.md +1 -1
  75. package/package.json +33 -11
  76. package/scripts/activate-source-baseline.ts +17 -13
  77. package/scripts/architecture-event.ts +2 -820
  78. package/scripts/architecture-queue.sh +2 -645
  79. package/scripts/archive-architecture-request.sh +2 -242
  80. package/scripts/archive-workflow.sh +1 -291
  81. package/scripts/benchmark-background-check-overlap.ts +228 -0
  82. package/scripts/benchmark-mcp-host.sh +117 -0
  83. package/scripts/benchmark-mcp-transport.ts +170 -0
  84. package/scripts/benchmark-quality-harness.ts +146 -0
  85. package/scripts/benchmark-route-session-concurrency.ts +207 -6
  86. package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
  87. package/scripts/benchmark-typescript-navigation.ts +186 -0
  88. package/scripts/benchmark-work-efficiency.ts +334 -0
  89. package/scripts/capability-config.ts +2 -392
  90. package/scripts/capability-resolver.ts +2 -503
  91. package/scripts/capture-plan.sh +1 -332
  92. package/scripts/check-agent-tooling.sh +2 -1558
  93. package/scripts/check-architecture-sync.sh +2 -371
  94. package/scripts/check-brain-manifest.sh +2 -253
  95. package/scripts/check-context-files.sh +2 -47
  96. package/scripts/check-deploy-sql-order.sh +2 -115
  97. package/scripts/check-mcp-compatibility.ts +14 -0
  98. package/scripts/check-runtime-architecture.mjs +349 -79
  99. package/scripts/check-skill-version.ts +3 -191
  100. package/scripts/check-source-duplication.mjs +61 -0
  101. package/scripts/check-stable-baseline.ts +92 -0
  102. package/scripts/check-task-sync.sh +2 -63
  103. package/scripts/check-task-workflow.sh +2 -1000
  104. package/scripts/codex-handoff-resume.sh +2 -267
  105. package/scripts/context-contract-sync.sh +2 -514
  106. package/scripts/contract-run.ts +2 -463
  107. package/scripts/contract-worktree.sh +1 -722
  108. package/scripts/ensure-task-workflow.sh +1 -1225
  109. package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
  110. package/scripts/inspect-project-state.ts +4 -279
  111. package/scripts/install-standalone-recovery.ts +24 -0
  112. package/scripts/lib/project-init-lib.sh +22 -46
  113. package/scripts/lib/run-forge-helper.sh +19 -0
  114. package/scripts/lib/run-forge-helper.ts +26 -0
  115. package/scripts/migrate-project-template.sh +1 -1189
  116. package/scripts/migrate-workflow-docs.ts +4 -412
  117. package/scripts/new-plan.sh +1 -180
  118. package/scripts/new-spec.sh +1 -47
  119. package/scripts/new-sprint.sh +1 -46
  120. package/scripts/plan-to-todo.sh +1 -796
  121. package/scripts/prepare-codex-handoff.sh +2 -201
  122. package/scripts/prepare-handoff.sh +1 -78
  123. package/scripts/refresh-current-status.sh +2 -467
  124. package/scripts/run-governed-gate.ts +5 -1
  125. package/scripts/select-agent-context-blocks.sh +2 -64
  126. package/scripts/ship-worktrees.sh +1 -558
  127. package/scripts/smoke-ios-physical-device.ts +4 -2
  128. package/scripts/smoke-runtime-recovery.ts +1 -35
  129. package/scripts/smoke-schedule-engine.ts +1 -20
  130. package/scripts/sprint-backlog.sh +1 -834
  131. package/scripts/stage-runtime-release.ts +2 -1
  132. package/scripts/summarize-failures.sh +2 -123
  133. package/scripts/switch-plan.sh +1 -150
  134. package/scripts/sync-brain-docs.sh +2 -379
  135. package/scripts/sync-generated-authority.mjs +175 -0
  136. package/scripts/verify-contract.sh +2 -703
  137. package/scripts/verify-forge-runtime.sh +0 -1
  138. package/scripts/verify-sprint.sh +1 -677
  139. package/scripts/workflow-contract.ts +4 -205
  140. package/scripts/workstream-sync.sh +2 -261
  141. package/src/cli/agent-jobs/executor-health.ts +1 -1
  142. package/src/cli/commands/init-hook.ts +3 -3
  143. package/src/cli/commands/mcp.ts +9 -5
  144. package/src/cli/commands/plugin.ts +12 -3
  145. package/src/cli/commands/recovery.ts +25 -3
  146. package/src/cli/commands/runtime.ts +55 -3
  147. package/src/cli/commands/security.ts +12 -1
  148. package/src/cli/commands/setup-profile.ts +31 -21
  149. package/src/cli/controller/check-runner.ts +113 -5
  150. package/src/cli/controller/composite-result.ts +1 -1
  151. package/src/cli/controller/context/focus.ts +51 -0
  152. package/src/cli/controller/context/instruction-context.ts +114 -0
  153. package/src/cli/controller/context/known-paths.ts +76 -0
  154. package/src/cli/controller/context/query-planning.ts +110 -0
  155. package/src/cli/controller/context/rule-resolution.ts +532 -0
  156. package/src/cli/controller/context/source-materializer.ts +278 -0
  157. package/src/cli/controller/context/structural.ts +16 -0
  158. package/src/cli/controller/context/types.ts +286 -0
  159. package/src/cli/controller/context-pack.ts +828 -487
  160. package/src/cli/controller/launch-agents.ts +77 -2
  161. package/src/cli/controller/operational-plan.ts +2 -2
  162. package/src/cli/controller/work-mode.ts +6 -4
  163. package/src/cli/editing/edit-session.ts +60 -7
  164. package/src/cli/github/contracts.ts +16 -0
  165. package/src/cli/github/github.ts +135 -16
  166. package/src/cli/github/session.ts +2 -1
  167. package/src/cli/installer/managed-entries.ts +15 -1
  168. package/src/cli/local-bridge/console-automations.ts +54 -78
  169. package/src/cli/local-bridge/console-view-models.ts +1 -35
  170. package/src/cli/local-bridge/facade-api.ts +37 -264
  171. package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
  172. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +23 -13
  173. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
  174. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +6 -4
  175. package/src/cli/local-bridge/frontend/src/lib/api.ts +1 -6
  176. package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
  177. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +2 -2
  178. package/src/cli/local-bridge/frontend/src/styles.css +1 -1
  179. package/src/cli/local-bridge/frontend/src/types.ts +5 -8
  180. package/src/cli/local-bridge/job-store.ts +1 -490
  181. package/src/cli/local-bridge/server.ts +2 -515
  182. package/src/cli/local-bridge/ui-dist/app.css +1 -1
  183. package/src/cli/local-bridge/ui-dist/app.js +3703 -3757
  184. package/src/cli/mcp/auth.ts +5 -5
  185. package/src/cli/mcp/instructions.ts +3 -2
  186. package/src/cli/mcp/legacy-tool-service.ts +10 -222
  187. package/src/cli/mcp/multi-repository.ts +16 -5
  188. package/src/cli/mcp/oauth.ts +175 -26
  189. package/src/cli/mcp/post-finalize-work-attribution.ts +150 -0
  190. package/src/cli/mcp/repository-tools.ts +282 -146
  191. package/src/cli/mcp/server.ts +586 -116
  192. package/src/cli/mcp/tool-capability-cache.ts +1 -1
  193. package/src/cli/mcp/tool-contract.ts +14 -0
  194. package/src/cli/mcp/toolset-selection.ts +1 -1
  195. package/src/cli/mcp/toolset.ts +44 -7
  196. package/src/cli/mcp/transports/http.ts +124 -14
  197. package/src/cli/mcp/transports/session-registry.ts +43 -5
  198. package/src/cli/mcp/types.ts +3 -3
  199. package/src/cli/repositories/command-classifier.ts +103 -21
  200. package/src/cli/repositories/command-executor.ts +78 -526
  201. package/src/cli/repositories/command-process.ts +108 -0
  202. package/src/cli/repositories/command-scope.ts +99 -41
  203. package/src/cli/repositories/controller-home.ts +7 -8
  204. package/src/cli/repositories/git-command-executor.ts +2 -0
  205. package/src/cli/repositories/locks.ts +53 -16
  206. package/src/cli/repositories/repository-snapshot.ts +124 -0
  207. package/src/cli/repositories/selected-path-actions.ts +17 -9
  208. package/src/cli/repositories/structured-git.ts +118 -6
  209. package/src/cli/repository/inspector.ts +563 -65
  210. package/src/cli/repository/session-cache.ts +58 -17
  211. package/src/cli/v81-entry.ts +1 -4
  212. package/src/effects/fs-transaction.ts +85 -17
  213. package/src/runtime/context/codegraph-read-provider.ts +233 -2
  214. package/src/runtime/context/codegraph-sidecar.cjs +74 -40
  215. package/src/runtime/context/generic-lsp-provider.ts +355 -0
  216. package/src/runtime/context/lsp-client.ts +283 -0
  217. package/src/runtime/context/semantic-navigation-contract.ts +61 -0
  218. package/src/runtime/context/semantic-navigation.ts +223 -0
  219. package/src/runtime/context/swift-navigation.ts +565 -0
  220. package/src/runtime/context/typescript-navigation.ts +226 -0
  221. package/src/runtime/control-plane/dispatch-priority.ts +28 -0
  222. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +48 -16
  223. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
  224. package/src/runtime/control-plane/execution/repository-work-attribution.ts +106 -0
  225. package/src/runtime/control-plane/execution/retained-work-resume.ts +203 -0
  226. package/src/runtime/control-plane/execution/session-store.ts +18 -0
  227. package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
  228. package/src/runtime/control-plane/execution/work-completion-authority.ts +58 -0
  229. package/src/runtime/control-plane/execution/work-evidence-policy.ts +200 -0
  230. package/src/runtime/control-plane/execution/work-execution-support.ts +386 -0
  231. package/src/runtime/control-plane/execution/work-finalization-service.ts +1913 -0
  232. package/src/runtime/control-plane/execution/work-handle-authority.ts +96 -0
  233. package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
  234. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
  235. package/src/runtime/control-plane/execution/work-operation-service.ts +468 -0
  236. package/src/runtime/control-plane/execution/work-path-scope.ts +37 -0
  237. package/src/runtime/control-plane/execution/work-preparation-service.ts +479 -0
  238. package/src/runtime/control-plane/execution/work-process-evidence.ts +129 -0
  239. package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
  240. package/src/runtime/control-plane/execution/work-task-receipt.ts +22 -18
  241. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +156 -11
  242. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +22 -14
  243. package/src/runtime/control-plane/execution/work-verification-context.ts +56 -0
  244. package/src/runtime/control-plane/execution/work-verification-service.ts +388 -0
  245. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +90 -9
  246. package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
  247. package/src/runtime/control-plane/facade/controller-round-relay.ts +1118 -0
  248. package/src/runtime/control-plane/facade/controller-session-store.ts +302 -12
  249. package/src/runtime/control-plane/facade/goal-workloop-access.ts +17 -1
  250. package/src/runtime/control-plane/facade/goal-workloop.ts +928 -190
  251. package/src/runtime/control-plane/facade/index.ts +3 -0
  252. package/src/runtime/control-plane/facade/plan-contract-store.ts +275 -42
  253. package/src/runtime/control-plane/facade/repository-work-admission.ts +147 -0
  254. package/src/runtime/control-plane/facade/requirement-authority.ts +83 -0
  255. package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
  256. package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
  257. package/src/runtime/control-plane/facade/types.ts +90 -10
  258. package/src/runtime/control-plane/facade/work-contract-store.ts +157 -261
  259. package/src/runtime/control-plane/facade/work-state-machine.ts +250 -0
  260. package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
  261. package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
  262. package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
  263. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
  264. package/src/runtime/control-plane/global-scheduler/maintenance.ts +152 -0
  265. package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
  266. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
  267. package/src/runtime/control-plane/global-scheduler/scheduler.ts +278 -543
  268. package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
  269. package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
  270. package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
  271. package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
  272. package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
  273. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
  274. package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
  275. package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
  276. package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
  277. package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
  278. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +63 -0
  279. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +365 -117
  280. package/src/runtime/control-plane/launcher/launch-reservation-store.ts +89 -0
  281. package/src/runtime/control-plane/launcher/thin-launcher.ts +244 -11
  282. package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
  283. package/src/runtime/control-plane/persistence/requirement-store.ts +0 -12
  284. package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
  285. package/src/runtime/control-plane/release-retention.ts +62 -2
  286. package/src/runtime/control-plane/repo-actor/registry.ts +4 -2
  287. package/src/runtime/control-plane/routing/route-policy.ts +24 -21
  288. package/src/runtime/control-plane/routing/workspace-admission.ts +70 -0
  289. package/src/runtime/control-plane/runtime-status-client.ts +0 -2
  290. package/src/runtime/diagnostics/mcp-timing.ts +13 -0
  291. package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
  292. package/src/runtime/diagnostics/performance.ts +24 -1
  293. package/src/runtime/evidence/event-ledger.ts +1 -1
  294. package/src/runtime/evidence/process-check-execution.ts +18 -0
  295. package/src/runtime/execution/jobs/child-reference.ts +6 -2
  296. package/src/runtime/execution/jobs/store.ts +58 -4
  297. package/src/runtime/execution/jobs/types.ts +1 -1
  298. package/src/runtime/execution/managed-workspace.ts +203 -1
  299. package/src/runtime/execution/process-runtime/check-facade.ts +51 -4
  300. package/src/runtime/execution/process-runtime/check-result.ts +88 -0
  301. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +7 -1
  302. package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
  303. package/src/runtime/execution/process-runtime/command-facade.ts +367 -40
  304. package/src/runtime/execution/process-runtime/gc.ts +38 -6
  305. package/src/runtime/execution/process-runtime/lightweight-managed.ts +1201 -0
  306. package/src/runtime/execution/process-runtime/persisted-check.ts +51 -5
  307. package/src/runtime/execution/process-runtime/resource-claims.ts +10 -6
  308. package/src/runtime/execution/process-runtime/runtime.ts +53 -3
  309. package/src/runtime/execution/process-runtime/store.ts +1 -0
  310. package/src/runtime/execution/process-runtime/types.ts +4 -12
  311. package/src/runtime/execution/thin-harness/async-process.ts +12 -2
  312. package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
  313. package/src/runtime/execution/work-activity.ts +21 -0
  314. package/src/runtime/execution/workers/executor.ts +18 -61
  315. package/src/runtime/gateway/mcp/execution-tools.ts +35 -1852
  316. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +61 -0
  317. package/src/runtime/gateway/mcp/process-tools.ts +83 -37
  318. package/src/runtime/gateway/mcp/router.ts +186 -84
  319. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +565 -0
  320. package/src/runtime/gateway/mcp/runtime-tools.ts +2378 -1947
  321. package/src/runtime/plugins/app-store-connect-adapter.ts +216 -47
  322. package/src/runtime/plugins/browser-adapter.ts +2662 -829
  323. package/src/runtime/plugins/browser-automation-service.ts +10 -0
  324. package/src/runtime/plugins/browser-handoff-host.ts +2 -25
  325. package/src/runtime/plugins/browser-handoff.ts +110 -5
  326. package/src/runtime/plugins/browser-macos-bridge.ts +701 -63
  327. package/src/runtime/plugins/browser-manifest-surface.ts +603 -0
  328. package/src/runtime/plugins/browser-native-session-service.ts +222 -0
  329. package/src/runtime/plugins/browser-node-bridge.ts +6 -34
  330. package/src/runtime/plugins/browser-provider-registry.ts +109 -0
  331. package/src/runtime/plugins/browser-runtime-contract.ts +154 -0
  332. package/src/runtime/plugins/browser-runtime.ts +193 -0
  333. package/src/runtime/plugins/browser-session-authority.ts +332 -0
  334. package/src/runtime/plugins/browser-session-store.ts +121 -0
  335. package/src/runtime/plugins/browser-session-types.ts +98 -0
  336. package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
  337. package/src/runtime/plugins/desktop-operator-registration.ts +10 -4
  338. package/src/runtime/plugins/external-adapter.ts +358 -3
  339. package/src/runtime/plugins/external-unix-socket.ts +7 -1
  340. package/src/runtime/plugins/first-party-registry.ts +2 -0
  341. package/src/runtime/plugins/github-adapter.ts +125 -0
  342. package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
  343. package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
  344. package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
  345. package/src/runtime/plugins/ios-adapter.ts +106 -16
  346. package/src/runtime/plugins/ios-agent-device.ts +234 -64
  347. package/src/runtime/plugins/ios-physical-device.ts +1143 -392
  348. package/src/runtime/plugins/lightweight-action.ts +153 -0
  349. package/src/runtime/plugins/local-system-adapter.ts +123 -6
  350. package/src/runtime/plugins/macos-capability-broker.ts +47 -9
  351. package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
  352. package/src/runtime/plugins/plugin-management-adapter.ts +49 -8
  353. package/src/runtime/plugins/resend-adapter.ts +1 -1
  354. package/src/runtime/plugins/store.ts +330 -33
  355. package/src/runtime/plugins/types.ts +38 -3
  356. package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
  357. package/src/runtime/projections/git-status-sampler.ts +16 -16
  358. package/src/runtime/projections/materialized-view.ts +28 -10
  359. package/src/runtime/recovery/maintenance-executor.ts +426 -25
  360. package/src/runtime/root/mcp-transport.ts +180 -10
  361. package/src/runtime/root/package-connector-service.ts +230 -10
  362. package/src/runtime/root/package-runtime-release.ts +143 -17
  363. package/src/runtime/root/package-runtime-service.ts +461 -22
  364. package/src/runtime/root/release-manifest.ts +144 -18
  365. package/src/runtime/root/release-materialize.ts +125 -32
  366. package/src/runtime/root/release-store.ts +48 -11
  367. package/src/runtime/root/runtime.ts +23 -5
  368. package/src/runtime/root/service.ts +100 -29
  369. package/src/runtime/root/types.ts +12 -0
  370. package/src/runtime/safe-tooling/ios-development.ts +321 -63
  371. package/src/runtime/shared/trusted-executable.ts +62 -0
  372. package/src/runtime/shared/trusted-node-executable.ts +48 -0
  373. package/src/runtime/standalone-recovery/core.ts +1079 -240
  374. package/src/runtime/standalone-recovery/entry.ts +100 -24
  375. package/src/runtime/standalone-recovery/installer.ts +20 -4
  376. package/src/runtime/standalone-recovery/service-labels.ts +2 -0
  377. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
  378. package/src/runtime/workflow/schedules/browser-probe.ts +81 -3
  379. package/src/runtime/workflow/schedules/engine.ts +364 -202
  380. package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
  381. package/src/runtime/workflow/schedules/settlement.ts +64 -17
  382. package/src/runtime/workflow/schedules/store.ts +209 -19
  383. package/src/runtime/workflow/schedules/types.ts +2 -4
  384. package/src/runtime/workflow/schedules/work-continuation.ts +26 -13
  385. package/src/testing/test-governance.ts +8 -40
  386. package/assets/reference-configs/heartbeat-triage.md +0 -57
  387. package/assets/templates/helpers/harness-trace-grade.sh +0 -150
  388. package/assets/templates/helpers/heartbeat-triage.sh +0 -361
  389. package/assets/templates/helpers/maintenance-triage.sh +0 -167
  390. package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
  391. package/docs/architecture/current/architecture-invariants.md +0 -331
  392. package/docs/architecture/current/automation-and-schedule-engine.md +0 -459
  393. package/docs/architecture/current/codegraph-context-provider.md +0 -238
  394. package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
  395. package/docs/architecture/current/controller-repository-decoupling.md +0 -148
  396. package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -373
  397. package/docs/architecture/current/entity-model.md +0 -612
  398. package/docs/architecture/current/external-plugin-governance.md +0 -396
  399. package/docs/architecture/current/failure-recovery.md +0 -447
  400. package/docs/architecture/current/governance.md +0 -213
  401. package/docs/architecture/current/human-interaction-plane.md +0 -87
  402. package/docs/architecture/current/implementation-status.md +0 -128
  403. package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
  404. package/docs/architecture/current/legacy-governance.md +0 -58
  405. package/docs/architecture/current/local-workspace-target-grants.md +0 -70
  406. package/docs/architecture/current/migration-roadmap.md +0 -105
  407. package/docs/architecture/current/multi-repository-execution.md +0 -371
  408. package/docs/architecture/current/operations-runbook.md +0 -45
  409. package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
  410. package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
  411. package/docs/architecture/current/repository-access-modes.md +0 -102
  412. package/docs/architecture/current/route-policy.md +0 -15
  413. package/docs/architecture/current/route-session-concurrency.md +0 -85
  414. package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
  415. package/docs/architecture/current/runtime-directory-map.md +0 -49
  416. package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
  417. package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
  418. package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
  419. package/docs/architecture/current/system-overview.md +0 -169
  420. package/docs/architecture/current/target-requirements-traceability.md +0 -202
  421. package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
  422. package/docs/architecture/current/thin-harness-v1.md +0 -321
  423. package/docs/architecture/current/verification-and-release-gates.md +0 -391
  424. package/docs/forge-autonomous-goal-loop.md +0 -9
  425. package/docs/forge-provider-configuration.md +0 -7
  426. package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -93
  427. package/docs/operations/gmail-assistant-routines.md +0 -186
  428. package/docs/operations/personal-assistant-operator-guide.md +0 -61
  429. package/docs/operations/provider-configuration.md +0 -31
  430. package/scripts/harness-trace-grade.sh +0 -150
  431. package/scripts/heartbeat-triage.sh +0 -361
  432. package/scripts/maintenance-triage.sh +0 -167
  433. package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
  434. package/src/cli/repositories/goal-registry.ts +0 -239
  435. package/src/runtime/assistant/action-proposals.ts +0 -279
  436. package/src/runtime/assistant/intent.ts +0 -395
  437. package/src/runtime/assistant/model-provider.ts +0 -460
  438. package/src/runtime/assistant/openapi.ts +0 -223
  439. package/src/runtime/assistant/policy.ts +0 -89
  440. package/src/runtime/assistant/readiness.ts +0 -258
  441. package/src/runtime/assistant/routine-runtime.ts +0 -477
  442. package/src/runtime/assistant/schedule-binding.ts +0 -171
  443. package/src/runtime/assistant/standing-grants.ts +0 -375
  444. package/src/runtime/assistant/store.ts +0 -243
  445. package/src/runtime/assistant/types.ts +0 -135
  446. package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
  447. package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
  448. package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
  449. package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
  450. package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
  451. package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
  452. package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
  453. package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
  454. package/src/runtime/control-plane/goal-loop/index.ts +0 -13
  455. package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
  456. package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
  457. package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
  458. package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
  459. package/src/runtime/control-plane/goal-loop/types.ts +0 -378
  460. package/src/runtime/control-plane/startup-recovery.ts +0 -198
  461. package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
  462. package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
  463. package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
  464. package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
  465. package/src/runtime/workflow/findings/store.ts +0 -204
  466. package/src/runtime/workflow/findings/types.ts +0 -58
  467. package/src/runtime/workflow/portfolio/engine.ts +0 -20
  468. package/src/runtime/workflow/portfolio/store.ts +0 -185
  469. package/src/runtime/workflow/portfolio/types.ts +0 -29
@@ -1,799 +1,4 @@
1
1
  #!/bin/bash
2
2
  set -euo pipefail
3
-
4
3
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
- if REPO_ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null)"; then
6
- cd "$REPO_ROOT"
7
- elif [[ "$SCRIPT_DIR" == */.ai/harness/scripts ]]; then
8
- cd "$SCRIPT_DIR/../../.."
9
- else
10
- cd "$SCRIPT_DIR/.."
11
- fi
12
-
13
- usage() {
14
- cat <<'USAGE_EOF'
15
- Usage: scripts/plan-to-todo.sh --plan <plan-file>
16
- USAGE_EOF
17
- }
18
-
19
- # Source shared workflow-state library if available (installed via migration).
20
- # This avoids duplicating task-state JSON generation logic.
21
- _WF_LIB=".ai/hooks/lib/workflow-state.sh"
22
- if [[ -f "$_WF_LIB" ]]; then
23
- # shellcheck source=/dev/null
24
- . "$_WF_LIB"
25
- _HAS_WF_LIB=1
26
- else
27
- _HAS_WF_LIB=0
28
- fi
29
-
30
- # Fallback json_escape only when workflow-state.sh is not available
31
- if [[ "$_HAS_WF_LIB" -eq 0 ]]; then
32
- workflow_json_escape() {
33
- local value="$1"
34
- value="${value//\\/\\\\}"
35
- value="${value//\"/\\\"}"
36
- value="${value//$'\n'/\\n}"
37
- value="${value//$'\r'/\\r}"
38
- value="${value//$'\t'/\\t}"
39
- printf '%s' "$value"
40
- }
41
- fi
42
-
43
- extract_status() {
44
- local file="$1"
45
- awk '/\*\*Status\*\*:/ {sub(/^.*\*\*Status\*\*: */, ""); gsub(/\r/, ""); print; exit}' "$file" | xargs
46
- }
47
-
48
- plan_evidence_contract_error() {
49
- local file="$1"
50
- local section=""
51
- local missing=0
52
-
53
- section="$(awk '
54
- BEGIN { in_section = 0 }
55
- /^## Evidence Contract[[:space:]]*$/ { in_section = 1; next }
56
- in_section && /^## / { exit }
57
- in_section { print }
58
- ' "$file")"
59
-
60
- if [[ -z "$(printf '%s' "$section" | tr -d '[:space:]')" ]]; then
61
- echo "missing ## Evidence Contract section"
62
- return 1
63
- fi
64
-
65
- local label line value
66
- for label in "State/progress path" "Verification evidence" "Evaluator rubric" "Stop condition" "Rollback surface"; do
67
- line="$(printf '%s\n' "$section" | grep -Ei "^[[:space:]]*-[[:space:]]*(\\*\\*)?${label}(\\*\\*)?[[:space:]]*:" | head -1 || true)"
68
- if [[ -z "$line" ]]; then
69
- echo "missing field: ${label}"
70
- missing=1
71
- continue
72
- fi
73
-
74
- value="${line#*:}"
75
- value="$(printf '%s' "$value" | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//')"
76
- if [[ -z "$value" ]] || printf '%s' "$value" | grep -Eiq '^(tbd|todo|n/a|none|unknown|\.\.\.)$'; then
77
- echo "field has no concrete value: ${label}"
78
- missing=1
79
- fi
80
- done
81
-
82
- [[ "$missing" -eq 0 ]]
83
- }
84
-
85
- extract_capability_id() {
86
- local file="$1"
87
- awk -F': ' '/^\> \*\*Capability ID\*\*:/ {print $2; exit}' "$file" | xargs
88
- }
89
-
90
- get_todo_source_plan() {
91
- awk -F': ' '/^\> \*\*Source Plan\*\*:/ {print $2; exit}' tasks/todos.md 2>/dev/null | xargs
92
- }
93
-
94
- plan_slug_from_path() {
95
- local plan_file="$1"
96
- local base slug
97
- base="$(basename "$plan_file")"
98
- slug="$(printf '%s' "$base" | sed -E 's/^plan-[0-9]{8}-[0-9]{4}-//; s/\.md$//')"
99
- printf '%s' "$slug"
100
- }
101
-
102
- plan_original_artifact_stem_from_path() {
103
- local plan_file="$1"
104
- local base stem
105
- base="$(basename "$plan_file")"
106
- stem="$(printf '%s' "$base" | sed -E 's/^plan-//; s/\.md$//')"
107
- if [[ "$stem" =~ ^[0-9]{8}-[0-9]{4}-.+ ]]; then
108
- printf '%s' "$stem"
109
- else
110
- plan_slug_from_path "$plan_file"
111
- fi
112
- }
113
-
114
- is_transient_plan_slug() {
115
- case "$1" in
116
- think-plan-[0-9]*|codex-plan-[0-9]*|approved-plan-[0-9]*)
117
- return 0
118
- ;;
119
- esac
120
- return 1
121
- }
122
-
123
- plan_title_slug_from_file() {
124
- local plan_file="$1"
125
- local title slug
126
- [[ -f "$plan_file" ]] || return 1
127
- title="$(awk '
128
- /^# Plan:[[:space:]]*/ {
129
- sub(/^# Plan:[[:space:]]*/, "")
130
- print
131
- exit
132
- }
133
- ' "$plan_file" | xargs)"
134
- [[ -n "$title" ]] || return 1
135
- slug="$(printf '%s' "$title" | tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//; s/-{2,}/-/g')"
136
- [[ -n "$slug" ]] || return 1
137
- printf '%s' "$slug"
138
- }
139
-
140
- plan_task_profile_from_file() {
141
- local plan_file="$1"
142
- local profile
143
- profile="$(awk '
144
- /^> \*\*Task Profile\*\*:/ {
145
- sub(/^> \*\*Task Profile\*\*:[[:space:]]*/, "")
146
- gsub(/\r/, "")
147
- print
148
- exit
149
- }
150
- ' "$plan_file" | xargs)"
151
- printf '%s' "${profile:-code-change}"
152
- }
153
-
154
- plan_artifact_stem_from_path() {
155
- local plan_file="$1"
156
- local stem stamp slug title_slug
157
- stem="$(plan_original_artifact_stem_from_path "$plan_file")"
158
- if [[ "$stem" =~ ^[0-9]{8}-[0-9]{4}-.+ ]]; then
159
- stamp="$(printf '%s' "$stem" | sed -E 's/^([0-9]{8}-[0-9]{4})-.+$/\1/')"
160
- slug="$(printf '%s' "$stem" | sed -E 's/^[0-9]{8}-[0-9]{4}-//')"
161
- if is_transient_plan_slug "$slug"; then
162
- title_slug="$(plan_title_slug_from_file "$plan_file" || true)"
163
- if [[ -n "$title_slug" && "$title_slug" != "$slug" ]]; then
164
- printf '%s-%s' "$stamp" "$title_slug"
165
- return 0
166
- fi
167
- fi
168
- printf '%s' "$stem"
169
- else
170
- plan_slug_from_path "$plan_file"
171
- fi
172
- }
173
-
174
- policy_get() {
175
- local jq_path="$1"
176
- local default_value="${2:-}"
177
- local value=""
178
-
179
- if [[ -f ".ai/harness/policy.json" ]] && command -v jq >/dev/null 2>&1; then
180
- value="$(jq -r "$jq_path // empty" ".ai/harness/policy.json" 2>/dev/null || true)"
181
- if [[ -n "$value" ]]; then
182
- printf '%s' "$value"
183
- return 0
184
- fi
185
- fi
186
-
187
- printf '%s' "$default_value"
188
- }
189
-
190
- is_linked_worktree() {
191
- local git_dir
192
- git_dir="$(git rev-parse --git-dir 2>/dev/null || true)"
193
- [[ "$git_dir" == *".git/worktrees/"* ]]
194
- }
195
-
196
- plan_requests_contract_worktree() {
197
- local file="$1"
198
- local auto_for_contract_tasks
199
-
200
- if grep -Eiq '^\> \*\*(Contract Level|Execution Mode|Execution Surface)\*\*:[[:space:]]*(false|primary|inline)[[:space:]]*$' "$file"; then
201
- return 1
202
- fi
203
-
204
- if grep -Eiq '^\> \*\*(Contract Level|Execution Mode|Execution Surface)\*\*:[[:space:]]*(true|worktree|contract-worktree)[[:space:]]*$' "$file"; then
205
- return 0
206
- fi
207
-
208
- auto_for_contract_tasks="$(policy_get '.worktree_strategy.auto_for_contract_tasks' 'false')"
209
- [[ "$auto_for_contract_tasks" == "true" ]]
210
- }
211
-
212
- maybe_start_contract_worktree() {
213
- local file="$1"
214
-
215
- [[ "${FORGE_CONTRACT_WORKTREE:-}" != "1" ]] || return 0
216
- [[ "${FORGE_DISABLE_CONTRACT_WORKTREE:-}" != "1" ]] || return 0
217
- [[ -x "scripts/contract-worktree.sh" ]] || return 0
218
- git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0
219
- ! is_linked_worktree || return 0
220
- plan_requests_contract_worktree "$file" || return 0
221
-
222
- bash "scripts/contract-worktree.sh" start --plan "$file"
223
- exit $?
224
- }
225
-
226
- set_plan_status() {
227
- local file="$1"
228
- local status="$2"
229
- local tmp_file
230
- tmp_file="$(mktemp)"
231
- awk -v next_status="$status" '
232
- BEGIN { updated = 0 }
233
- {
234
- if (!updated && $0 ~ /\*\*Status\*\*:/) {
235
- sub(/\*\*Status\*\*: .*/, "**Status**: " next_status)
236
- updated = 1
237
- }
238
- print
239
- }
240
- ' "$file" > "$tmp_file"
241
- mv "$tmp_file" "$file"
242
- }
243
-
244
- unique_archive_path() {
245
- local desired="$1"
246
- if [[ ! -e "$desired" ]]; then
247
- printf '%s' "$desired"
248
- return
249
- fi
250
-
251
- local stem counter candidate
252
- stem="${desired%.md}"
253
- counter=2
254
- candidate="${stem}-v${counter}.md"
255
- while [[ -e "$candidate" ]]; do
256
- counter=$((counter + 1))
257
- candidate="${stem}-v${counter}.md"
258
- done
259
- printf '%s' "$candidate"
260
- }
261
-
262
- rewrite_plan_artifact_references() {
263
- local plan_file="$1"
264
- local from_stem="$2"
265
- local to_stem="$3"
266
- local tmp_file
267
-
268
- [[ -n "$from_stem" && -n "$to_stem" && "$from_stem" != "$to_stem" ]] || return 0
269
-
270
- tmp_file="$(mktemp)"
271
- sed \
272
- -e "s|tasks/contracts/${from_stem}\\.contract\\.md|tasks/contracts/${to_stem}.contract.md|g" \
273
- -e "s|tasks/reviews/${from_stem}\\.review\\.md|tasks/reviews/${to_stem}.review.md|g" \
274
- -e "s|tasks/notes/${from_stem}\\.notes\\.md|tasks/notes/${to_stem}.notes.md|g" \
275
- "$plan_file" > "$tmp_file"
276
- mv "$tmp_file" "$plan_file"
277
- }
278
-
279
- render_contract_file() {
280
- local plan_file="$1"
281
- local contract_file="$2"
282
- local review_file="$3"
283
- local notes_file="$4"
284
- local slug="$5"
285
- local timestamp="$6"
286
- local capability_id="$7"
287
- local owner="${USER:-AI Agent}"
288
- local task_profile
289
- local template_file=".claude/templates/contract.template.md"
290
- local tmp_file
291
-
292
- task_profile="$(plan_task_profile_from_file "$plan_file")"
293
-
294
- if [[ ! -f "$template_file" ]]; then
295
- mkdir -p .claude/templates
296
- cat > "$template_file" <<'CONTRACT_TEMPLATE_EOF'
297
- # Task Contract: {{TASK_SLUG}}
298
-
299
- > **Status**: Pending
300
- > **Plan**: {{PLAN_FILE}}
301
- > **Task Profile**: {{TASK_PROFILE}}
302
- > **Owner**: {{OWNER}}
303
- > **Capability ID**: {{CAPABILITY_ID}}
304
- > **Last Updated**: {{TIMESTAMP}}
305
- > **Review File**: `{{REVIEW_FILE}}`
306
- > **Notes File**: `{{NOTES_FILE}}`
307
-
308
- ## Goal
309
-
310
- Describe the exact outcome this task must deliver.
311
-
312
- ## Scope
313
-
314
- - In scope:
315
- - Out of scope:
316
-
317
- ## Workflow Inventory
318
-
319
- - Source plan: `{{PLAN_FILE}}`
320
- - Deferred-goal ledger: `tasks/todos.md`
321
- - Review file: `{{REVIEW_FILE}}`
322
- - Notes file: `{{NOTES_FILE}}`
323
- - Checks file: `.ai/harness/checks/latest.json`
324
- - Run snapshots: `.ai/harness/runs/`
325
- - Scope gate: edit only paths listed under `allowed_paths`; update this contract before widening scope.
326
- - Completion gate: `scripts/verify-sprint.sh` must see this contract pass, the review recommend pass, and `## External Acceptance Advice` pass or record a manual override.
327
-
328
- ## Allowed Paths
329
-
330
- ```yaml
331
- allowed_paths:
332
- - plans/
333
- - tasks/todos.md
334
- - {{CONTRACT_FILE}}
335
- - {{REVIEW_FILE}}
336
- - {{NOTES_FILE}}
337
- - .ai/context/capabilities.json
338
- - .claude/templates/
339
- - src/
340
- - tests/
341
- ```
342
-
343
- ## Delegation Contract
344
-
345
- ```yaml
346
- delegation:
347
- budget:
348
- tokens: null
349
- tool_calls: null
350
- wall_time_minutes: null
351
- permission_scope:
352
- mode: inherit_allowed_paths
353
- writable_paths: []
354
- network: inherited
355
- roles:
356
- parent:
357
- mode: narrate_and_gatekeep
358
- purpose: approval_checkpoint_owner
359
- explorer:
360
- mode: read_only
361
- purpose: codebase_research
362
- worker:
363
- mode: edit_within_allowed_paths
364
- purpose: implementation
365
- verifier:
366
- mode: read_only
367
- purpose: exit_criteria_review
368
- ```
369
-
370
- ## Exit Criteria (Machine Verifiable)
371
-
372
- ```yaml
373
- exit_criteria:
374
- files_exist:
375
- - src/modules/{{TASK_SLUG}}/index.ts
376
- - {{NOTES_FILE}}
377
- tests_pass:
378
- - path: tests/unit/{{TASK_SLUG}}.test.ts
379
- commands_succeed:
380
- - bun run typecheck
381
- files_contain:
382
- - path: src/modules/{{TASK_SLUG}}/index.ts
383
- pattern: "export"
384
- ```
385
-
386
- ## Acceptance Notes (Human Review)
387
-
388
- - Functional behavior:
389
- - Edge cases:
390
- - Regression risks:
391
-
392
- ## Rollback Point
393
-
394
- - Commit / checkpoint:
395
- - Revert strategy:
396
- CONTRACT_TEMPLATE_EOF
397
- fi
398
-
399
- tmp_file="$(mktemp)"
400
- sed \
401
- -e "s/{{TASK_SLUG}}/${slug}/g" \
402
- -e "s|{{PLAN_FILE}}|${plan_file}|g" \
403
- -e "s|{{TASK_PROFILE}}|${task_profile}|g" \
404
- -e "s|{{CONTRACT_FILE}}|${contract_file}|g" \
405
- -e "s|{{REVIEW_FILE}}|${review_file}|g" \
406
- -e "s|{{NOTES_FILE}}|${notes_file}|g" \
407
- -e "s|{{CAPABILITY_ID}}|${capability_id}|g" \
408
- -e "s/{{OWNER}}/${owner}/g" \
409
- -e "s/{{TIMESTAMP}}/${timestamp}/g" \
410
- "$template_file" \
411
- | sed \
412
- -e "s|tasks/contracts/${slug}\\.contract\\.md|${contract_file}|g" \
413
- -e "s|tasks/reviews/${slug}\\.review\\.md|${review_file}|g" \
414
- -e "s|tasks/notes/${slug}\\.notes\\.md|${notes_file}|g" \
415
- > "$tmp_file"
416
- mv "$tmp_file" "$contract_file"
417
- }
418
-
419
- render_implementation_notes_file() {
420
- local plan_file="$1"
421
- local contract_file="$2"
422
- local review_file="$3"
423
- local notes_file="$4"
424
- local slug="$5"
425
- local timestamp="$6"
426
- local template_file=".claude/templates/implementation-notes.template.md"
427
- local tmp_file
428
-
429
- if [[ ! -f "$template_file" ]]; then
430
- mkdir -p .claude/templates
431
- cat > "$template_file" <<'NOTES_TEMPLATE_EOF'
432
- # Implementation Notes: {{TASK_SLUG}}
433
-
434
- > **Status**: Active
435
- > **Plan**: {{PLAN_FILE}}
436
- > **Contract**: {{CONTRACT_FILE}}
437
- > **Review**: {{REVIEW_FILE}}
438
- > **Last Updated**: {{TIMESTAMP}}
439
- > **Lifecycle**: notes
440
-
441
- ## Design Decisions
442
-
443
- - ...
444
-
445
- ## Deviations From Plan Or Spec
446
-
447
- - None recorded.
448
-
449
- ## Tradeoffs Considered
450
-
451
- | Option | Decision | Reason |
452
- |--------|----------|--------|
453
- | ... | ... | ... |
454
-
455
- ## Open Questions
456
-
457
- - None.
458
-
459
- ## Evidence Links
460
-
461
- - Checks: `.ai/harness/checks/latest.json`
462
- - Run snapshots: `.ai/harness/runs/`
463
-
464
- ## Promotion Candidates
465
-
466
- - Promote to `tasks/lessons.md` only after a repeated correction or failure pattern.
467
- - Promote to `docs/researches/` only when it is durable repo knowledge with evidence.
468
- - Promote to harness asset files only after verification across more than one task or fixture.
469
- NOTES_TEMPLATE_EOF
470
- fi
471
-
472
- tmp_file="$(mktemp)"
473
- sed \
474
- -e "s/{{TASK_SLUG}}/${slug}/g" \
475
- -e "s|{{PLAN_FILE}}|${plan_file}|g" \
476
- -e "s|{{CONTRACT_FILE}}|${contract_file}|g" \
477
- -e "s|{{REVIEW_FILE}}|${review_file}|g" \
478
- -e "s/{{TIMESTAMP}}/${timestamp}/g" \
479
- "$template_file" > "$tmp_file"
480
- mv "$tmp_file" "$notes_file"
481
- }
482
-
483
- # Delegate to workflow-state.sh if available; inline fallback otherwise.
484
- # This ensures a single source of truth for task-state JSON generation.
485
- if [[ "$_HAS_WF_LIB" -eq 0 ]]; then
486
- workflow_sync_task_state_from_todo() {
487
- local todo_file="${1:-tasks/todos.md}"
488
- local state_file="${2:-.claude/.task-state.json}"
489
- local source_plan="${3:-}"
490
- local timestamp
491
- local tmp_state
492
- local total=0
493
- local done=0
494
- local promoted_in_progress=0
495
- local first=1
496
-
497
- mkdir -p "$(dirname "$state_file")"
498
- timestamp="$(date '+%Y-%m-%dT%H:%M:%S%z')"
499
-
500
- {
501
- echo "{"
502
- printf ' "done_tasks": 0,\n'
503
- printf ' "total_tasks": 0,\n'
504
- printf ' "source_plan": "%s",\n' "$(workflow_json_escape "${source_plan:-}")"
505
- printf ' "updated_at": "%s",\n' "$(workflow_json_escape "$timestamp")"
506
- echo ' "tasks": ['
507
-
508
- while IFS= read -r line; do
509
- printf '%s\n' "$line" | grep -Eq '^[[:space:]]*-[[:space:]]\[[ xX]\][[:space:]]+' || continue
510
- total=$((total + 1))
511
- local desc
512
- desc="$(printf '%s' "$line" | sed -E 's/^[[:space:]]*-[[:space:]]\[[ xX]\][[:space:]]+//')"
513
- local status="pending"
514
- local passes="false"
515
-
516
- if [[ "$line" =~ \[[xX]\] ]]; then
517
- status="completed"
518
- passes="true"
519
- done=$((done + 1))
520
- elif [[ "$promoted_in_progress" -eq 0 ]]; then
521
- status="in_progress"
522
- promoted_in_progress=1
523
- fi
524
-
525
- if [[ "$first" -eq 0 ]]; then
526
- echo ","
527
- fi
528
- first=0
529
-
530
- printf ' {"id":"task-%s","desc":"%s","status":"%s","passes":%s,"verification_evidence":[]}' \
531
- "$total" \
532
- "$(workflow_json_escape "$desc")" \
533
- "$status" \
534
- "$passes"
535
- done < "$todo_file"
536
-
537
- echo
538
- echo " ]"
539
- echo "}"
540
- } > "$state_file"
541
-
542
- tmp_state="$(mktemp)"
543
- awk -v done="$done" -v total="$total" '
544
- {
545
- if ($0 ~ /"done_tasks":/) {
546
- printf " \"done_tasks\": %s,\n", done
547
- } else if ($0 ~ /"total_tasks":/) {
548
- printf " \"total_tasks\": %s,\n", total
549
- } else {
550
- print
551
- }
552
- }
553
- ' "$state_file" > "$tmp_state"
554
- mv "$tmp_state" "$state_file"
555
- }
556
- fi
557
-
558
- plan_file=""
559
- while [[ $# -gt 0 ]]; do
560
- case "$1" in
561
- --plan)
562
- [[ -n "${2:-}" ]] || { echo "Error: --plan requires a value" >&2; usage; exit 1; }
563
- plan_file="$2"
564
- shift 2
565
- ;;
566
- --help|-h)
567
- usage
568
- exit 0
569
- ;;
570
- *)
571
- echo "Unknown argument: $1" >&2
572
- usage
573
- exit 1
574
- ;;
575
- esac
576
- done
577
-
578
- if [[ -z "$plan_file" ]]; then
579
- echo "--plan is required" >&2
580
- usage
581
- exit 1
582
- fi
583
-
584
- if [[ ! -f "$plan_file" ]]; then
585
- echo "Plan file not found: $plan_file" >&2
586
- exit 1
587
- fi
588
-
589
- status="$(extract_status "$plan_file")"
590
- if [[ "$status" != "Approved" ]]; then
591
- echo "Plan status must be Approved before extraction (current: ${status:-unknown})." >&2
592
- exit 1
593
- fi
594
-
595
- if ! evidence_error="$(plan_evidence_contract_error "$plan_file")"; then
596
- echo "Plan Evidence Contract is incomplete in $plan_file:" >&2
597
- printf '%s\n' "$evidence_error" >&2
598
- exit 1
599
- fi
600
-
601
- maybe_start_contract_worktree "$plan_file"
602
-
603
- mkdir -p tasks/archive
604
- mkdir -p tasks/contracts
605
- mkdir -p tasks/reviews
606
- mkdir -p tasks/notes
607
- mkdir -p .claude
608
- mkdir -p .ai/context
609
- mkdir -p .ai/harness/checks
610
- mkdir -p .ai/harness/session .ai/harness/controller/packets .ai/harness/projections .ai/harness/transfers
611
- mkdir -p .ai/harness/failures
612
- mkdir -p .ai/harness/planning
613
- mkdir -p .ai/harness/runs
614
-
615
- timestamp="$(date +%Y%m%d-%H%M)"
616
- timestamp_human="$(date '+%Y-%m-%d %H:%M')"
617
- plan_base="$(basename "$plan_file")"
618
- slug="$(plan_slug_from_path "$plan_file")"
619
- original_artifact_stem="$(plan_original_artifact_stem_from_path "$plan_file")"
620
- artifact_stem="$(plan_artifact_stem_from_path "$plan_file")"
621
- contract_file="tasks/contracts/${artifact_stem}.contract.md"
622
- review_file="tasks/reviews/${artifact_stem}.review.md"
623
- notes_file="tasks/notes/${artifact_stem}.notes.md"
624
- previous_source_plan="$(get_todo_source_plan || true)"
625
- parent_run_id="${HOOK_RUN_ID:-${CLAUDE_RUN_ID:-${CODEX_RUN_ID:-run-${timestamp}}}}"
626
- capability_id="$(extract_capability_id "$plan_file")"
627
- capability_id="${capability_id:-root}"
628
-
629
- rewrite_plan_artifact_references "$plan_file" "$original_artifact_stem" "$artifact_stem"
630
-
631
- if [[ -f "tasks/todos.md" ]] \
632
- && grep -q '[^[:space:]]' tasks/todos.md \
633
- && ! grep -Eq '^> \*\*Status\*\*:[[:space:]]*Backlog[[:space:]]*$' tasks/todos.md; then
634
- archive_file="$(unique_archive_path "tasks/archive/todo-${timestamp}-${slug}.md")"
635
- {
636
- echo "> **Archived**: $(date '+%Y-%m-%d %H:%M')"
637
- echo "> **Related Plan**: ${plan_file}"
638
- echo "> **Outcome**: Converted to deferred-goal ledger"
639
- echo "> **Source Plan**: ${previous_source_plan:-"(none)"}"
640
- echo "> **Parent Run ID**: ${parent_run_id}"
641
- echo
642
- cat tasks/todos.md
643
- } > "$archive_file"
644
- fi
645
-
646
- if [[ ! -f "tasks/todos.md" ]] || ! grep -Eq '^> \*\*Status\*\*:[[:space:]]*Backlog[[:space:]]*$' tasks/todos.md; then
647
- {
648
- echo "# Deferred Goal Ledger"
649
- echo
650
- echo "> **Status**: Backlog"
651
- echo "> **Updated**: ${timestamp_human}"
652
- echo "> **Scope**: Medium/long-term goals deferred from active plan execution"
653
- echo
654
- echo "Current plan tasks live in \`${plan_file}\` under \`## Task Breakdown\`."
655
- echo "Do not duplicate that execution checklist here. Record only work intentionally deferred beyond this slice, with the tradeoff and revisit trigger."
656
- echo
657
- echo "## Deferred Goals"
658
- echo
659
- echo "| Goal | Why Deferred | Tradeoff | Revisit Trigger |"
660
- echo "|------|--------------|----------|-----------------|"
661
- echo "| (none) | No deferred medium/long-term goal recorded for this projection. | Keep this sprint bounded. | Add a row when a real follow-up is postponed. |"
662
- } > tasks/todos.md
663
- else
664
- todo_tmp="$(mktemp)"
665
- awk -v timestamp_human="$timestamp_human" -v plan_file="$plan_file" '
666
- /^\> \*\*Updated\*\*:/ {
667
- print "> **Updated**: " timestamp_human
668
- next
669
- }
670
- /^Current plan tasks live in `/ {
671
- print "Current plan tasks live in `" plan_file "` under `## Task Breakdown`."
672
- next
673
- }
674
- { print }
675
- ' tasks/todos.md > "$todo_tmp"
676
- mv "$todo_tmp" tasks/todos.md
677
- fi
678
-
679
- rm -f .claude/.task-state.json
680
-
681
- if [[ -f ".claude/templates/review.template.md" ]]; then
682
- :
683
- else
684
- mkdir -p .claude/templates
685
- cat > .claude/templates/review.template.md <<'REVIEW_TEMPLATE_EOF'
686
- # Task Review: {{TASK_SLUG}}
687
-
688
- > **Status**: Pending
689
- > **Plan**: {{PLAN_FILE}}
690
- > **Contract**: {{CONTRACT_FILE}}
691
- > **Notes File**: {{NOTES_FILE}}
692
- > **Checks File**: {{CHECKS_FILE}}
693
- > **Last Updated**: {{TIMESTAMP}}
694
- > **Recommendation**: fail
695
-
696
- ## Human Review Card
697
-
698
- - Verdict: pending
699
- - Change type: code-change | docs-only | ledger-closeout | migration | eval-only | delegated-run
700
- - Intended files changed:
701
- - Actual files changed:
702
- - Commands passed:
703
- - External acceptance: unavailable
704
- - Residual risks:
705
- - Reviewer action required: inspect diff and card
706
- - Rollback:
707
-
708
- ## Mode Evidence
709
-
710
- - Selected route:
711
- - P1/P2/P3 evidence:
712
- - Root cause or plan evidence:
713
-
714
- ## Verification Evidence
715
-
716
- - Forge /review run:
717
- - Commands run:
718
- - Manual checks:
719
- - Supporting artifacts:
720
- - Implementation notes reviewed:
721
- - Run snapshot:
722
-
723
- ## External Acceptance Advice
724
-
725
- > **External Acceptance**: unavailable
726
- > **External Reviewer**:
727
- > **External Source**:
728
- > **External Started**:
729
- > **External Completed**:
730
-
731
- - P1 blockers:
732
- - P2 advisories:
733
- - Acceptance checklist:
734
-
735
- ## Behavior Diff Notes
736
-
737
- - ...
738
-
739
- ## Residual Risks / Follow-ups
740
-
741
- - ...
742
-
743
- ## Scorecard
744
-
745
- | Dimension | Score | Notes |
746
- |-----------|-------|-------|
747
- | Functionality | 0/10 | |
748
- | Product depth | 0/10 | |
749
- | Design quality | 0/10 | |
750
- | Code quality | 0/10 | |
751
-
752
- ## Failing Items
753
-
754
- - ...
755
-
756
- ## Retest Steps
757
-
758
- - Re-run:
759
- - Re-check:
760
-
761
- ## Summary
762
-
763
- - ...
764
- REVIEW_TEMPLATE_EOF
765
- fi
766
-
767
- render_contract_file "$plan_file" "$contract_file" "$review_file" "$notes_file" "$slug" "$timestamp_human" "$capability_id"
768
- render_implementation_notes_file "$plan_file" "$contract_file" "$review_file" "$notes_file" "$slug" "$timestamp_human"
769
- sed \
770
- -e "s/{{TASK_SLUG}}/${slug}/g" \
771
- -e "s|{{PLAN_FILE}}|${plan_file}|g" \
772
- -e "s|{{CONTRACT_FILE}}|${contract_file}|g" \
773
- -e "s|{{NOTES_FILE}}|${notes_file}|g" \
774
- -e "s|{{CHECKS_FILE}}|.ai/harness/checks/latest.json|g" \
775
- -e "s/{{TIMESTAMP}}/${timestamp_human}/g" \
776
- .claude/templates/review.template.md > "$review_file"
777
-
778
- if [[ ! -f ".ai/harness/checks/latest.json" ]]; then
779
- echo "{}" > .ai/harness/checks/latest.json
780
- fi
781
-
782
- set_plan_status "$plan_file" "Executing"
783
- if declare -F set_active_plan >/dev/null 2>&1; then
784
- set_active_plan "$plan_file"
785
- else
786
- mkdir -p .ai/harness .claude
787
- printf '%s' "$plan_file" > .ai/harness/active-plan
788
- printf '%s' "$plan_file" > .claude/.active-plan
789
- pwd -P > .ai/harness/active-worktree
790
- fi
791
-
792
- if declare -F workflow_clear_pending_orchestration >/dev/null 2>&1; then
793
- workflow_clear_pending_orchestration
794
- else
795
- rm -f .ai/harness/planning/pending.json
796
- fi
797
-
798
- echo "Prepared sprint artifacts from $plan_file"
799
- echo "Left tasks/todos.md as deferred-goal ledger; execute the plan's own ## Task Breakdown."
4
+ exec "$SCRIPT_DIR/lib/run-forge-helper.sh" "plan-to-todo.sh" "$@"