@moretea-labs/forge 1.6.0 → 1.7.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 (396) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +26 -0
  3. package/CLAUDE.md +2 -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/03-orchestration.partial.md +1 -1
  17. package/assets/plugin-registry.v1.json +1 -1
  18. package/assets/reference-configs/document-generation.md +1 -1
  19. package/assets/reference-configs/harness-overview.md +1 -1
  20. package/assets/reference-configs/sprint-contracts.md +3 -3
  21. package/assets/skill-version.json +2 -2
  22. package/assets/templates/contract.template.md +2 -7
  23. package/assets/templates/helpers/capture-plan.sh +2 -2
  24. package/assets/templates/helpers/check-task-workflow.sh +4 -4
  25. package/assets/templates/helpers/contract-worktree.sh +1 -21
  26. package/assets/templates/helpers/ensure-task-workflow.sh +11 -36
  27. package/assets/templates/helpers/migrate-project-template.sh +22 -45
  28. package/assets/templates/helpers/new-plan.sh +1 -1
  29. package/assets/templates/helpers/plan-to-todo.sh +12 -37
  30. package/assets/templates/helpers/ship-worktrees.sh +2 -29
  31. package/assets/templates/helpers/verify-contract.sh +1 -111
  32. package/assets/templates/helpers/verify-sprint.sh +3 -180
  33. package/assets/templates/plan.template.md +1 -1
  34. package/assets/templates/review.template.md +9 -34
  35. package/assets/workflow-contract.v1.json +10 -19
  36. package/docs/README.md +10 -10
  37. package/docs/architecture/CURRENT.md +170 -0
  38. package/docs/architecture/EVOLUTION.md +42 -0
  39. package/docs/architecture/current/README.md +4 -156
  40. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
  41. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
  42. package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
  43. package/docs/architecture/history/README.md +7 -0
  44. package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
  45. package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
  46. package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
  47. package/docs/architecture/history.md +3 -34
  48. package/docs/architecture/index.md +15 -98
  49. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  50. package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
  51. package/docs/architecture/versions/1.6.md +38 -0
  52. package/docs/architecture/versions/1.7.md +41 -0
  53. package/docs/forge-chatgpt-browser-engine.md +2 -2
  54. package/docs/forge-chatgpt-mcp-setup.md +4 -28
  55. package/docs/forge-chatgpt-supervised-automation.md +3 -3
  56. package/docs/forge-github-issue-launcher.md +1 -1
  57. package/docs/forge-runtime-self-healing-loop.md +1 -1
  58. package/docs/operations/controller-browser-plugin.md +26 -6
  59. package/docs/operations/controller-performance-and-502.md +124 -0
  60. package/docs/operations/controller-reliability-runbook.md +1 -1
  61. package/docs/operations/features.md +2 -2
  62. package/docs/operations/github-repository.md +1 -1
  63. package/docs/operations/homebrew.md +2 -2
  64. package/docs/operations/mcp-tool-exposure.md +5 -3
  65. package/docs/wiki/Architecture.md +6 -6
  66. package/docs/wiki/Implementation.md +2 -2
  67. package/docs/wiki/Integrations.md +2 -2
  68. package/docs/wiki/Work-Lifecycle.md +1 -1
  69. package/package.json +29 -10
  70. package/scripts/activate-source-baseline.ts +17 -13
  71. package/scripts/benchmark-background-check-overlap.ts +228 -0
  72. package/scripts/benchmark-mcp-host.sh +117 -0
  73. package/scripts/benchmark-mcp-transport.ts +170 -0
  74. package/scripts/benchmark-quality-harness.ts +146 -0
  75. package/scripts/benchmark-route-session-concurrency.ts +207 -6
  76. package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
  77. package/scripts/benchmark-typescript-navigation.ts +186 -0
  78. package/scripts/benchmark-work-efficiency.ts +334 -0
  79. package/scripts/capture-plan.sh +3 -3
  80. package/scripts/check-agent-tooling.sh +8 -35
  81. package/scripts/check-architecture-sync.sh +17 -86
  82. package/scripts/check-mcp-compatibility.ts +14 -0
  83. package/scripts/check-runtime-architecture.mjs +107 -64
  84. package/scripts/check-stable-baseline.ts +92 -0
  85. package/scripts/check-task-workflow.sh +4 -4
  86. package/scripts/contract-worktree.sh +1 -21
  87. package/scripts/ensure-task-workflow.sh +22 -55
  88. package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
  89. package/scripts/install-standalone-recovery.ts +24 -0
  90. package/scripts/lib/project-init-lib.sh +15 -44
  91. package/scripts/migrate-project-template.sh +23 -1179
  92. package/scripts/new-plan.sh +1 -1
  93. package/scripts/plan-to-todo.sh +11 -36
  94. package/scripts/run-governed-gate.ts +2 -1
  95. package/scripts/ship-worktrees.sh +2 -29
  96. package/scripts/smoke-ios-physical-device.ts +4 -2
  97. package/scripts/smoke-runtime-recovery.ts +1 -35
  98. package/scripts/smoke-schedule-engine.ts +1 -20
  99. package/scripts/verify-contract.sh +1 -111
  100. package/scripts/verify-forge-runtime.sh +0 -1
  101. package/scripts/verify-sprint.sh +3 -180
  102. package/scripts/workflow-contract.ts +1 -5
  103. package/src/cli/commands/init-hook.ts +3 -3
  104. package/src/cli/commands/mcp.ts +9 -5
  105. package/src/cli/commands/plugin.ts +1 -1
  106. package/src/cli/commands/recovery.ts +25 -3
  107. package/src/cli/commands/runtime.ts +55 -3
  108. package/src/cli/commands/security.ts +12 -1
  109. package/src/cli/commands/setup-profile.ts +31 -21
  110. package/src/cli/controller/check-runner.ts +106 -3
  111. package/src/cli/controller/composite-result.ts +1 -1
  112. package/src/cli/controller/context/focus.ts +51 -0
  113. package/src/cli/controller/context/instruction-context.ts +114 -0
  114. package/src/cli/controller/context/known-paths.ts +76 -0
  115. package/src/cli/controller/context/query-planning.ts +110 -0
  116. package/src/cli/controller/context/rule-resolution.ts +532 -0
  117. package/src/cli/controller/context/source-materializer.ts +278 -0
  118. package/src/cli/controller/context/structural.ts +16 -0
  119. package/src/cli/controller/context/types.ts +286 -0
  120. package/src/cli/controller/context-pack.ts +785 -469
  121. package/src/cli/controller/launch-agents.ts +77 -2
  122. package/src/cli/controller/operational-plan.ts +2 -2
  123. package/src/cli/controller/work-mode.ts +6 -4
  124. package/src/cli/editing/edit-session.ts +60 -7
  125. package/src/cli/github/github.ts +133 -0
  126. package/src/cli/installer/managed-entries.ts +15 -1
  127. package/src/cli/local-bridge/console-automations.ts +54 -78
  128. package/src/cli/local-bridge/console-view-models.ts +1 -35
  129. package/src/cli/local-bridge/facade-api.ts +0 -217
  130. package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
  131. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +23 -13
  132. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
  133. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +6 -4
  134. package/src/cli/local-bridge/frontend/src/lib/api.ts +1 -6
  135. package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
  136. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +2 -2
  137. package/src/cli/local-bridge/frontend/src/styles.css +1 -1
  138. package/src/cli/local-bridge/frontend/src/types.ts +5 -8
  139. package/src/cli/local-bridge/job-store.ts +1 -490
  140. package/src/cli/local-bridge/server.ts +0 -513
  141. package/src/cli/local-bridge/ui-dist/app.css +1 -1
  142. package/src/cli/local-bridge/ui-dist/app.js +3703 -3757
  143. package/src/cli/mcp/auth.ts +5 -5
  144. package/src/cli/mcp/instructions.ts +3 -2
  145. package/src/cli/mcp/legacy-tool-service.ts +0 -189
  146. package/src/cli/mcp/multi-repository.ts +16 -5
  147. package/src/cli/mcp/oauth.ts +175 -26
  148. package/src/cli/mcp/repository-tools.ts +247 -107
  149. package/src/cli/mcp/server.ts +537 -111
  150. package/src/cli/mcp/tool-capability-cache.ts +1 -1
  151. package/src/cli/mcp/toolset-selection.ts +1 -1
  152. package/src/cli/mcp/toolset.ts +42 -5
  153. package/src/cli/mcp/transports/http.ts +101 -14
  154. package/src/cli/mcp/transports/session-registry.ts +43 -5
  155. package/src/cli/mcp/types.ts +3 -3
  156. package/src/cli/repositories/command-classifier.ts +101 -19
  157. package/src/cli/repositories/command-executor.ts +55 -521
  158. package/src/cli/repositories/command-process.ts +108 -0
  159. package/src/cli/repositories/command-scope.ts +99 -41
  160. package/src/cli/repositories/controller-home.ts +7 -8
  161. package/src/cli/repositories/git-command-executor.ts +2 -0
  162. package/src/cli/repositories/locks.ts +53 -16
  163. package/src/cli/repositories/repository-snapshot.ts +121 -0
  164. package/src/cli/repositories/selected-path-actions.ts +17 -9
  165. package/src/cli/repositories/structured-git.ts +61 -3
  166. package/src/cli/repository/inspector.ts +553 -63
  167. package/src/cli/repository/session-cache.ts +58 -17
  168. package/src/cli/v81-entry.ts +1 -4
  169. package/src/effects/fs-transaction.ts +85 -17
  170. package/src/runtime/context/codegraph-read-provider.ts +233 -2
  171. package/src/runtime/context/codegraph-sidecar.cjs +74 -40
  172. package/src/runtime/context/generic-lsp-provider.ts +355 -0
  173. package/src/runtime/context/lsp-client.ts +283 -0
  174. package/src/runtime/context/semantic-navigation.ts +275 -0
  175. package/src/runtime/context/swift-navigation.ts +565 -0
  176. package/src/runtime/context/typescript-navigation.ts +226 -0
  177. package/src/runtime/control-plane/dispatch-priority.ts +28 -0
  178. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +47 -8
  179. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
  180. package/src/runtime/control-plane/execution/session-store.ts +18 -0
  181. package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
  182. package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
  183. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
  184. package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
  185. package/src/runtime/control-plane/execution/work-task-receipt.ts +54 -11
  186. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +143 -8
  187. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +22 -14
  188. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +85 -8
  189. package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
  190. package/src/runtime/control-plane/facade/controller-round-relay.ts +991 -0
  191. package/src/runtime/control-plane/facade/controller-session-store.ts +132 -1
  192. package/src/runtime/control-plane/facade/goal-workloop-access.ts +2 -0
  193. package/src/runtime/control-plane/facade/goal-workloop.ts +686 -129
  194. package/src/runtime/control-plane/facade/index.ts +1 -0
  195. package/src/runtime/control-plane/facade/plan-contract-store.ts +185 -20
  196. package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
  197. package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
  198. package/src/runtime/control-plane/facade/types.ts +22 -5
  199. package/src/runtime/control-plane/facade/work-contract-store.ts +175 -73
  200. package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
  201. package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
  202. package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
  203. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
  204. package/src/runtime/control-plane/global-scheduler/maintenance.ts +145 -0
  205. package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
  206. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
  207. package/src/runtime/control-plane/global-scheduler/scheduler.ts +273 -542
  208. package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
  209. package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
  210. package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
  211. package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
  212. package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
  213. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
  214. package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
  215. package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
  216. package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
  217. package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
  218. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +50 -0
  219. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +355 -116
  220. package/src/runtime/control-plane/launcher/launch-reservation-store.ts +40 -0
  221. package/src/runtime/control-plane/launcher/thin-launcher.ts +194 -10
  222. package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
  223. package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
  224. package/src/runtime/control-plane/release-retention.ts +62 -2
  225. package/src/runtime/control-plane/routing/route-policy.ts +7 -16
  226. package/src/runtime/control-plane/runtime-status-client.ts +0 -2
  227. package/src/runtime/diagnostics/mcp-timing.ts +13 -0
  228. package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
  229. package/src/runtime/diagnostics/performance.ts +24 -1
  230. package/src/runtime/evidence/event-ledger.ts +1 -1
  231. package/src/runtime/execution/jobs/store.ts +58 -4
  232. package/src/runtime/execution/jobs/types.ts +1 -1
  233. package/src/runtime/execution/managed-workspace.ts +203 -1
  234. package/src/runtime/execution/process-runtime/check-facade.ts +51 -4
  235. package/src/runtime/execution/process-runtime/check-result.ts +53 -0
  236. package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
  237. package/src/runtime/execution/process-runtime/command-facade.ts +345 -40
  238. package/src/runtime/execution/process-runtime/gc.ts +38 -6
  239. package/src/runtime/execution/process-runtime/lightweight-managed.ts +1184 -0
  240. package/src/runtime/execution/process-runtime/persisted-check.ts +47 -4
  241. package/src/runtime/execution/process-runtime/resource-claims.ts +10 -6
  242. package/src/runtime/execution/process-runtime/runtime.ts +43 -3
  243. package/src/runtime/execution/process-runtime/store.ts +1 -0
  244. package/src/runtime/execution/process-runtime/types.ts +2 -0
  245. package/src/runtime/execution/thin-harness/async-process.ts +12 -2
  246. package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
  247. package/src/runtime/execution/workers/executor.ts +0 -48
  248. package/src/runtime/gateway/mcp/execution-tools.ts +1192 -114
  249. package/src/runtime/gateway/mcp/process-tools.ts +83 -37
  250. package/src/runtime/gateway/mcp/router.ts +184 -82
  251. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +546 -0
  252. package/src/runtime/gateway/mcp/runtime-tools.ts +2224 -1589
  253. package/src/runtime/plugins/app-store-connect-adapter.ts +123 -19
  254. package/src/runtime/plugins/browser-adapter.ts +2901 -241
  255. package/src/runtime/plugins/browser-automation-service.ts +10 -0
  256. package/src/runtime/plugins/browser-handoff.ts +92 -2
  257. package/src/runtime/plugins/browser-macos-bridge.ts +582 -49
  258. package/src/runtime/plugins/browser-node-bridge.ts +6 -34
  259. package/src/runtime/plugins/browser-provider-registry.ts +109 -0
  260. package/src/runtime/plugins/browser-runtime-contract.ts +152 -0
  261. package/src/runtime/plugins/browser-runtime.ts +183 -0
  262. package/src/runtime/plugins/browser-session-authority.ts +332 -0
  263. package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
  264. package/src/runtime/plugins/desktop-operator-registration.ts +8 -2
  265. package/src/runtime/plugins/external-adapter.ts +324 -3
  266. package/src/runtime/plugins/external-unix-socket.ts +7 -1
  267. package/src/runtime/plugins/first-party-registry.ts +2 -0
  268. package/src/runtime/plugins/github-adapter.ts +125 -0
  269. package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
  270. package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
  271. package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
  272. package/src/runtime/plugins/ios-adapter.ts +106 -16
  273. package/src/runtime/plugins/ios-agent-device.ts +234 -64
  274. package/src/runtime/plugins/ios-physical-device.ts +1143 -392
  275. package/src/runtime/plugins/lightweight-action.ts +153 -0
  276. package/src/runtime/plugins/local-system-adapter.ts +123 -6
  277. package/src/runtime/plugins/macos-capability-broker.ts +55 -9
  278. package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
  279. package/src/runtime/plugins/plugin-management-adapter.ts +49 -8
  280. package/src/runtime/plugins/resend-adapter.ts +1 -1
  281. package/src/runtime/plugins/store.ts +269 -29
  282. package/src/runtime/plugins/types.ts +35 -2
  283. package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
  284. package/src/runtime/projections/git-status-sampler.ts +16 -16
  285. package/src/runtime/projections/materialized-view.ts +28 -10
  286. package/src/runtime/recovery/maintenance-executor.ts +393 -28
  287. package/src/runtime/root/mcp-transport.ts +180 -10
  288. package/src/runtime/root/package-connector-service.ts +186 -8
  289. package/src/runtime/root/package-runtime-release.ts +143 -17
  290. package/src/runtime/root/package-runtime-service.ts +430 -22
  291. package/src/runtime/root/release-manifest.ts +7 -2
  292. package/src/runtime/root/release-materialize.ts +19 -0
  293. package/src/runtime/root/release-store.ts +48 -11
  294. package/src/runtime/root/runtime.ts +23 -5
  295. package/src/runtime/root/service.ts +100 -29
  296. package/src/runtime/root/types.ts +2 -0
  297. package/src/runtime/safe-tooling/ios-development.ts +321 -63
  298. package/src/runtime/shared/trusted-executable.ts +62 -0
  299. package/src/runtime/shared/trusted-node-executable.ts +48 -0
  300. package/src/runtime/standalone-recovery/core.ts +700 -92
  301. package/src/runtime/standalone-recovery/entry.ts +99 -23
  302. package/src/runtime/standalone-recovery/installer.ts +19 -3
  303. package/src/runtime/standalone-recovery/service-labels.ts +2 -0
  304. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
  305. package/src/runtime/workflow/schedules/browser-probe.ts +81 -3
  306. package/src/runtime/workflow/schedules/engine.ts +287 -151
  307. package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
  308. package/src/runtime/workflow/schedules/settlement.ts +48 -4
  309. package/src/runtime/workflow/schedules/store.ts +131 -10
  310. package/src/runtime/workflow/schedules/types.ts +2 -4
  311. package/src/runtime/workflow/schedules/work-continuation.ts +26 -13
  312. package/src/testing/test-governance.ts +8 -40
  313. package/assets/reference-configs/heartbeat-triage.md +0 -57
  314. package/assets/templates/helpers/harness-trace-grade.sh +0 -150
  315. package/assets/templates/helpers/heartbeat-triage.sh +0 -361
  316. package/assets/templates/helpers/maintenance-triage.sh +0 -167
  317. package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
  318. package/docs/architecture/current/architecture-invariants.md +0 -331
  319. package/docs/architecture/current/automation-and-schedule-engine.md +0 -459
  320. package/docs/architecture/current/codegraph-context-provider.md +0 -238
  321. package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
  322. package/docs/architecture/current/controller-repository-decoupling.md +0 -148
  323. package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -373
  324. package/docs/architecture/current/entity-model.md +0 -612
  325. package/docs/architecture/current/external-plugin-governance.md +0 -396
  326. package/docs/architecture/current/failure-recovery.md +0 -447
  327. package/docs/architecture/current/governance.md +0 -213
  328. package/docs/architecture/current/human-interaction-plane.md +0 -87
  329. package/docs/architecture/current/implementation-status.md +0 -128
  330. package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
  331. package/docs/architecture/current/legacy-governance.md +0 -58
  332. package/docs/architecture/current/local-workspace-target-grants.md +0 -70
  333. package/docs/architecture/current/migration-roadmap.md +0 -105
  334. package/docs/architecture/current/multi-repository-execution.md +0 -371
  335. package/docs/architecture/current/operations-runbook.md +0 -45
  336. package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
  337. package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
  338. package/docs/architecture/current/repository-access-modes.md +0 -102
  339. package/docs/architecture/current/route-policy.md +0 -15
  340. package/docs/architecture/current/route-session-concurrency.md +0 -85
  341. package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
  342. package/docs/architecture/current/runtime-directory-map.md +0 -49
  343. package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
  344. package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
  345. package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
  346. package/docs/architecture/current/system-overview.md +0 -169
  347. package/docs/architecture/current/target-requirements-traceability.md +0 -202
  348. package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
  349. package/docs/architecture/current/thin-harness-v1.md +0 -321
  350. package/docs/architecture/current/verification-and-release-gates.md +0 -391
  351. package/docs/forge-autonomous-goal-loop.md +0 -9
  352. package/docs/forge-provider-configuration.md +0 -7
  353. package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -93
  354. package/docs/operations/gmail-assistant-routines.md +0 -186
  355. package/docs/operations/personal-assistant-operator-guide.md +0 -61
  356. package/docs/operations/provider-configuration.md +0 -31
  357. package/scripts/harness-trace-grade.sh +0 -150
  358. package/scripts/heartbeat-triage.sh +0 -361
  359. package/scripts/maintenance-triage.sh +0 -167
  360. package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
  361. package/src/cli/repositories/goal-registry.ts +0 -239
  362. package/src/runtime/assistant/action-proposals.ts +0 -279
  363. package/src/runtime/assistant/intent.ts +0 -395
  364. package/src/runtime/assistant/model-provider.ts +0 -460
  365. package/src/runtime/assistant/openapi.ts +0 -223
  366. package/src/runtime/assistant/policy.ts +0 -89
  367. package/src/runtime/assistant/readiness.ts +0 -258
  368. package/src/runtime/assistant/routine-runtime.ts +0 -477
  369. package/src/runtime/assistant/schedule-binding.ts +0 -171
  370. package/src/runtime/assistant/standing-grants.ts +0 -375
  371. package/src/runtime/assistant/store.ts +0 -243
  372. package/src/runtime/assistant/types.ts +0 -135
  373. package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
  374. package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
  375. package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
  376. package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
  377. package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
  378. package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
  379. package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
  380. package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
  381. package/src/runtime/control-plane/goal-loop/index.ts +0 -13
  382. package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
  383. package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
  384. package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
  385. package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
  386. package/src/runtime/control-plane/goal-loop/types.ts +0 -378
  387. package/src/runtime/control-plane/startup-recovery.ts +0 -198
  388. package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
  389. package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
  390. package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
  391. package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
  392. package/src/runtime/workflow/findings/store.ts +0 -204
  393. package/src/runtime/workflow/findings/types.ts +0 -58
  394. package/src/runtime/workflow/portfolio/engine.ts +0 -20
  395. package/src/runtime/workflow/portfolio/store.ts +0 -185
  396. package/src/runtime/workflow/portfolio/types.ts +0 -29
@@ -1,61 +0,0 @@
1
- # Personal assistant operator guide
2
-
3
- This runtime is intended to be used with ChatGPT as the primary control plane. The Local Controller is the execution, policy, audit, and persistence layer.
4
-
5
- ## Recommended daily path
6
-
7
- 1. Ask ChatGPT for the goal in natural language.
8
- 2. ChatGPT calls the high-level assistant API or MCP tools.
9
- 3. The runtime plans safe plugin actions, submits durable jobs, and writes results into Assistant Inbox.
10
- 4. High-risk actions stay blocked until explicit human confirmation.
11
-
12
- ## Readiness check
13
-
14
- Use `assistant_readiness` or `GET /api/assistant/readiness` before relying on the assistant.
15
-
16
- The report separates:
17
-
18
- - live Google capability
19
- - mock-only capability
20
- - disabled plugins
21
- - routine, inbox, and memory state
22
- - recommended next actions
23
-
24
- Mock mode proves the execution path only. It does not read real Gmail, Calendar, or Tasks data.
25
-
26
- ## Gmail read self-test
27
-
28
- A low-risk Gmail read test can be submitted through either:
29
-
30
- - `plugin_action_execute` with `gmail.list_messages`
31
- - `POST /api/assistant/self-test/gmail-read`
32
- - `POST /api/assistant/intent` with an utterance such as `测试读取最近一周 Gmail`
33
-
34
- When Gmail is in mock mode, the test returns deterministic mock messages. For real Gmail, configure the plugin with provider `google-workspace` and set one of the supported token environment variables documented by the plugin health message.
35
-
36
- ## Cleanup workflow
37
-
38
- Use `runtime_cleanup_preview` or `POST /api/assistant/maintenance/cleanup-preview` first. It is non-destructive.
39
-
40
- Use cleanup apply only after reviewing the preview:
41
-
42
- - `runtime_cleanup_apply` with `confirm_cleanup=true`
43
- - `POST /api/assistant/maintenance/cleanup-apply` with `confirmCleanup=true`
44
-
45
- Cleanup is limited to explicit Forge candidates:
46
-
47
- - old `Forge-*` temp directories that are not referenced by running processes
48
- - terminal local jobs, when explicitly included
49
- - historical attention acknowledgements, when explicitly included
50
-
51
- Do not use cleanup apply as a substitute for reviewing active jobs, active leases, or running workers.
52
-
53
- ## What still needs real productization
54
-
55
- The current runtime can route assistant intents and run safe data collection jobs. A full personal-assistant product still needs:
56
-
57
- - real OAuth/token broker and refresh support
58
- - wall-clock routine scheduling
59
- - model-backed summarization of collected data
60
- - approval summaries for risky actions
61
- - cleanup apply integration in a dedicated maintenance UI
@@ -1,31 +0,0 @@
1
- # Provider configuration and routing
2
-
3
- Forge does not require or privilege a specific model vendor. A fresh installation builds neutral routing from provider kind, declared capabilities, health, and the configured provider priority. Providers with the same priority use the provider id only as a deterministic tie-breaker.
4
-
5
- ## Where configuration lives
6
-
7
- The Controller GUI and the JSON files below edit the same controller-scoped configuration:
8
-
9
- - `<controllerHome>/global/provider-config.json`: enable/disable providers, priority, model and non-secret API settings.
10
- - `<controllerHome>/global/executor-routing.json`: explicit provider order for each task intent.
11
- - `<controllerHome>/global/provider-secrets.json`: locally stored API credentials. This file is outside the repository and must never be committed.
12
-
13
- Opening the GUI or reading configuration does not rewrite these files. Existing routing and priority choices remain authoritative across upgrades.
14
-
15
- ## Precedence
16
-
17
- Provider selection applies these rules in order:
18
-
19
- 1. Per-request provider preferences and allow/deny constraints.
20
- 2. An explicit order or default in `executor-routing.json`, including changes made in the GUI routing editor.
21
- 3. Neutral generated defaults based on provider kind and `provider-config.json` priority.
22
- 4. Availability, enablement, authentication, live-call policy, safety gates, and required capabilities.
23
- 5. A ChatGPT handoff packet when no direct provider can safely run.
24
-
25
- An explicit routing order intentionally overrides the general provider priority. The GUI shows both controls so users can decide whether task types follow a specific route or the general provider preference. Use **Use automatic routing** in the routing panel to remove explicit overrides and resume generated priority-based routing; do not delete the whole controller configuration.
26
-
27
- ## Personal preferences
28
-
29
- Maintainers and users may place Grok, Codex, Claude, an API provider, or another registered provider first in their own Controller configuration. Those preferences belong under `controllerHome`; they are not open-source defaults and are not copied into the repository.
30
-
31
- Remote API calls remain double-gated: the provider must be enabled/configured in the GUI and `FORGE_ENABLE_LIVE_MODEL_PROVIDERS` must explicitly allow live calls. Without both, the API provider is proposal-only.
@@ -1,150 +0,0 @@
1
- #!/bin/bash
2
- set -euo pipefail
3
-
4
- usage() {
5
- cat <<'USAGE_EOF'
6
- Usage: scripts/harness-trace-grade.sh --run <trace.json> [--repo <repo>] [--strict]
7
- USAGE_EOF
8
- }
9
-
10
- run_file=""
11
- repo="."
12
- strict=0
13
-
14
- while [[ $# -gt 0 ]]; do
15
- case "$1" in
16
- --run)
17
- run_file="${2:-}"
18
- shift 2
19
- ;;
20
- --repo)
21
- repo="${2:-.}"
22
- shift 2
23
- ;;
24
- --strict)
25
- strict=1
26
- shift
27
- ;;
28
- --help|-h)
29
- usage
30
- exit 0
31
- ;;
32
- *)
33
- echo "Unknown argument: $1" >&2
34
- usage
35
- exit 1
36
- ;;
37
- esac
38
- done
39
-
40
- [[ -n "$run_file" ]] || { usage >&2; exit 1; }
41
- [[ -f "$run_file" ]] || { echo "Trace run file not found: $run_file" >&2; exit 1; }
42
- command -v jq >/dev/null 2>&1 || { echo "jq is required for harness trace grading" >&2; exit 1; }
43
-
44
- if REPO_ROOT="$(cd "$repo" && pwd -P 2>/dev/null)"; then
45
- :
46
- else
47
- echo "Repo path not found: $repo" >&2
48
- exit 1
49
- fi
50
-
51
- results_file="$(mktemp)"
52
- trap 'rm -f "$results_file"' EXIT
53
- : > "$results_file"
54
-
55
- record() {
56
- local id="$1"
57
- local passed="$2"
58
- local message="$3"
59
- jq -n \
60
- --arg id "$id" \
61
- --argjson passed "$passed" \
62
- --arg message "$message" \
63
- '{id: $id, passed: $passed, message: $message}' >> "$results_file"
64
- }
65
-
66
- trace_get() {
67
- local query="$1"
68
- jq -r "$query // empty" "$run_file"
69
- }
70
-
71
- schema="$(trace_get '.schema')"
72
- active_plan="$(trace_get '.active_plan')"
73
- task_profile="$(trace_get '.task_profile')"
74
- review_card_verdict="$(trace_get '.review.card.verdict')"
75
- review_card_change_type="$(trace_get '.review.card.change_type')"
76
- review_card_rollback="$(trace_get '.review.card.rollback')"
77
- commands_count="$(jq '.commands | if type == "array" then length else 0 end' "$run_file")"
78
- outside_count="$(jq '.allowed_paths_check.outside | if type == "array" then length else 0 end' "$run_file")"
79
- allowed_status="$(trace_get '.allowed_paths_check.status')"
80
-
81
- if [[ "$schema" == "forge-run-trace.v1" ]]; then
82
- record "schema.v1" true "trace schema is forge-run-trace.v1"
83
- else
84
- record "schema.v1" false "trace schema is ${schema:-missing}"
85
- fi
86
-
87
- if [[ -n "$active_plan" && -f "$REPO_ROOT/$active_plan" ]]; then
88
- record "active_plan.resolves" true "active plan resolves: $active_plan"
89
- else
90
- record "active_plan.resolves" false "active plan does not resolve: ${active_plan:-missing}"
91
- fi
92
-
93
- case "$task_profile" in
94
- code-change|docs-only|ledger-closeout|migration|eval-only|delegated-run)
95
- record "contract_profile.valid" true "contract profile is valid: $task_profile"
96
- ;;
97
- *)
98
- record "contract_profile.valid" false "contract profile is invalid: ${task_profile:-missing}"
99
- ;;
100
- esac
101
-
102
- if [[ "$review_card_verdict" == "pass" ]]; then
103
- record "review_card.pass" true "Human Review Card verdict is pass"
104
- else
105
- record "review_card.pass" false "Human Review Card verdict is ${review_card_verdict:-missing}"
106
- fi
107
-
108
- if [[ -n "$review_card_change_type" && "$review_card_change_type" == "$task_profile" ]]; then
109
- record "review_card.change_type" true "Human Review Card change type matches task profile"
110
- else
111
- record "review_card.change_type" false "Human Review Card change type ${review_card_change_type:-missing} does not match task profile ${task_profile:-missing}"
112
- fi
113
-
114
- rollback_token="$(printf '%s' "$review_card_rollback" | sed -E 's/[;,].*$//; s/[[:space:]].*$//; s/^[[:space:]]+//; s/[[:space:]]+$//' | tr '[:upper:]' '[:lower:]')"
115
- case "$rollback_token" in
116
- ""|tbd|todo|n/a|na|none|unknown|unavailable|pending|...)
117
- record "review_card.rollback" false "Human Review Card rollback is missing or not concrete"
118
- ;;
119
- *)
120
- record "review_card.rollback" true "Human Review Card rollback is concrete"
121
- ;;
122
- esac
123
-
124
- if [[ "$commands_count" -gt 0 ]] && jq -e '.commands[]? | select((.command // "") | length > 0)' "$run_file" >/dev/null; then
125
- record "commands.present" true "commands evidence is present"
126
- else
127
- record "commands.present" false "commands evidence is missing"
128
- fi
129
-
130
- if [[ "$outside_count" -eq 0 && "$allowed_status" == "pass" ]]; then
131
- record "allowed_paths.clean" true "no changed file is outside allowed paths"
132
- else
133
- record "allowed_paths.clean" false "allowed_paths status is ${allowed_status:-missing}; changed files outside allowed paths: $outside_count"
134
- fi
135
-
136
- failed="$(jq -s '[.[] | select(.passed == false)] | length' "$results_file")"
137
- total="$(jq -s 'length' "$results_file")"
138
- status="pass"
139
- [[ "$failed" -eq 0 ]] || status="fail"
140
-
141
- jq -s \
142
- --arg status "$status" \
143
- --arg run "$run_file" \
144
- --argjson total "$total" \
145
- --argjson failed "$failed" \
146
- '{status: $status, run: $run, total: $total, failed: $failed, graders: .}' "$results_file"
147
-
148
- if [[ "$strict" -eq 1 && "$failed" -ne 0 ]]; then
149
- exit 1
150
- fi
@@ -1,361 +0,0 @@
1
- #!/bin/bash
2
- set -euo pipefail
3
-
4
- usage() {
5
- cat <<'USAGE_EOF'
6
- Usage: scripts/heartbeat-triage.sh [run] [--repo PATH] [--inbox PATH] [--run-id ID] [--source manual|scheduled] [--json]
7
-
8
- Writes a heartbeat triage run to .ai/harness/triage/inbox.md. The command is
9
- safe for cron/loop schedulers: findings are recorded as inbox entries and do
10
- not make the process fail unless the runner itself is misconfigured.
11
- USAGE_EOF
12
- }
13
-
14
- command="run"
15
- repo="."
16
- inbox_path=".ai/harness/triage/inbox.md"
17
- run_id=""
18
- run_source="manual"
19
- json_output=0
20
-
21
- if [[ "${1:-}" == "run" ]]; then
22
- shift
23
- elif [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
24
- usage
25
- exit 0
26
- elif [[ "${1:-}" != "" && "${1:-}" != --* ]]; then
27
- echo "heartbeat-triage: unknown command: $1" >&2
28
- usage >&2
29
- exit 2
30
- fi
31
-
32
- while [[ $# -gt 0 ]]; do
33
- case "$1" in
34
- --repo)
35
- [[ -n "${2:-}" ]] || { echo "heartbeat-triage: --repo requires a value" >&2; exit 2; }
36
- repo="$2"
37
- shift 2
38
- ;;
39
- --inbox)
40
- [[ -n "${2:-}" ]] || { echo "heartbeat-triage: --inbox requires a value" >&2; exit 2; }
41
- inbox_path="$2"
42
- shift 2
43
- ;;
44
- --run-id)
45
- [[ -n "${2:-}" ]] || { echo "heartbeat-triage: --run-id requires a value" >&2; exit 2; }
46
- run_id="$2"
47
- shift 2
48
- ;;
49
- --source)
50
- [[ -n "${2:-}" ]] || { echo "heartbeat-triage: --source requires a value" >&2; exit 2; }
51
- run_source="$2"
52
- shift 2
53
- ;;
54
- --json)
55
- json_output=1
56
- shift
57
- ;;
58
- --help|-h)
59
- usage
60
- exit 0
61
- ;;
62
- *)
63
- echo "heartbeat-triage: unknown argument: $1" >&2
64
- usage >&2
65
- exit 2
66
- ;;
67
- esac
68
- done
69
-
70
- [[ "$command" == "run" ]] || { echo "heartbeat-triage: unsupported command: $command" >&2; exit 2; }
71
-
72
- repo="$(cd "$repo" 2>/dev/null && pwd -P)" || { echo "heartbeat-triage: repo not found: $repo" >&2; exit 2; }
73
- cd "$repo"
74
-
75
- timestamp="$(date '+%Y-%m-%dT%H:%M:%S%z')"
76
- if [[ -z "$run_id" ]]; then
77
- run_id="heartbeat-$(date '+%Y%m%dT%H%M%S')-$$"
78
- fi
79
- safe_run_id="$(printf '%s' "$run_id" | sed -E 's/[^A-Za-z0-9._-]+/-/g')"
80
-
81
- if [[ "$inbox_path" = /* ]]; then
82
- inbox_file="$inbox_path"
83
- else
84
- inbox_file="$repo/$inbox_path"
85
- fi
86
-
87
- runs_dir="$repo/.ai/harness/runs"
88
- triage_dir="$(dirname "$inbox_file")"
89
- run_file="$runs_dir/${safe_run_id}-heartbeat-triage.json"
90
- mkdir -p "$triage_dir" "$runs_dir"
91
-
92
- json_escape() {
93
- local value="$1"
94
- value="${value//\\/\\\\}"
95
- value="${value//\"/\\\"}"
96
- value="${value//$'\n'/\\n}"
97
- value="${value//$'\r'/\\r}"
98
- value="${value//$'\t'/\\t}"
99
- printf '%s' "$value"
100
- }
101
-
102
- policy_get() {
103
- local jq_path="$1"
104
- local default_value="$2"
105
-
106
- if [[ -f ".ai/harness/policy.json" ]] && command -v jq >/dev/null 2>&1; then
107
- local value
108
- value="$(jq -r "$jq_path // empty" ".ai/harness/policy.json" 2>/dev/null || true)"
109
- if [[ -n "$value" ]]; then
110
- printf '%s' "$value"
111
- return 0
112
- fi
113
- fi
114
-
115
- printf '%s' "$default_value"
116
- }
117
-
118
- helper_runtime_dir="$(policy_get '.harness.helper_runtime_dir' '.ai/harness/scripts')"
119
-
120
- helper_path() {
121
- local helper_name="$1"
122
-
123
- if [[ -f "$helper_runtime_dir/$helper_name" ]]; then
124
- printf '%s/%s' "$helper_runtime_dir" "$helper_name"
125
- return 0
126
- fi
127
-
128
- if [[ -f "scripts/$helper_name" ]]; then
129
- printf '%s/%s' "scripts" "$helper_name"
130
- return 0
131
- fi
132
-
133
- printf '%s/%s' "$helper_runtime_dir" "$helper_name"
134
- }
135
-
136
- repo_relative() {
137
- local path="$1"
138
- case "$path" in
139
- "$repo"/*) printf '%s' "${path#"$repo"/}" ;;
140
- "$repo") printf '.' ;;
141
- *) printf '%s' "$path" ;;
142
- esac
143
- }
144
-
145
- first_line() {
146
- awk 'NF { print; exit }'
147
- }
148
-
149
- date_plus_14_days() {
150
- if date -v+14d '+%Y-%m-%d' >/dev/null 2>&1; then
151
- date -v+14d '+%Y-%m-%d'
152
- elif date -d '+14 days' '+%Y-%m-%d' >/dev/null 2>&1; then
153
- date -d '+14 days' '+%Y-%m-%d'
154
- else
155
- date '+%Y-%m-%d'
156
- fi
157
- }
158
-
159
- entry_kinds=()
160
- entry_statuses=()
161
- entry_summaries=()
162
- entry_details=()
163
-
164
- add_entry() {
165
- entry_kinds+=("$1")
166
- entry_statuses+=("$2")
167
- entry_summaries+=("$3")
168
- entry_details+=("$4")
169
- }
170
-
171
- run_workflow_check() {
172
- local output status summary
173
- local check_script
174
- check_script="$(helper_path "check-task-workflow.sh")"
175
-
176
- if [[ ! -f "$check_script" ]]; then
177
- add_entry "workflow-check" "warning" "$check_script is missing" ""
178
- return 0
179
- fi
180
-
181
- set +e
182
- output="$(bash "$check_script" --strict 2>&1)"
183
- status=$?
184
- set -e
185
-
186
- if [[ "$status" -eq 0 ]]; then
187
- add_entry "workflow-check" "pass" "check-task-workflow.sh --strict passed" "$output"
188
- else
189
- summary="$(printf '%s\n' "$output" | first_line)"
190
- add_entry "workflow-check" "fail" "${summary:-check-task-workflow.sh --strict failed}" "$output"
191
- fi
192
- }
193
-
194
- extract_next_pending_from_sprint() {
195
- local sprint_file="$1"
196
- awk -F '|' '
197
- function trim(s) {
198
- gsub(/^[[:space:]]+|[[:space:]]+$/, "", s)
199
- return s
200
- }
201
- /^## Backlog[[:space:]]*$/ { in_section = 1; next }
202
- in_section && /^## / { exit }
203
- !in_section { next }
204
- /^\|[[:space:]]*[0-9]+[[:space:]]*\|/ {
205
- idx = trim($2)
206
- status = trim($3)
207
- task = trim($4)
208
- mode = trim($5)
209
- acceptance = trim($6)
210
- plan = trim($7)
211
- if (status == "[ ]") {
212
- printf "index: %s\ntask: %s\nmode: %s\nacceptance: %s\nplan: %s\n", idx, task, mode, acceptance, plan
213
- exit
214
- }
215
- }
216
- ' "$sprint_file"
217
- }
218
-
219
- find_executing_sprint() {
220
- local file status
221
- local sprints_dir
222
- sprints_dir="$(policy_get '.sprints.dir' 'plans/sprints')"
223
- [[ -d "$sprints_dir" ]] || return 1
224
- while IFS= read -r file; do
225
- status="$(awk '/\*\*Status\*\*:/ { sub(/^.*\*\*Status\*\*: */, ""); gsub(/\r/, ""); print; exit }' "$file" | xargs)"
226
- case "$status" in
227
- Executing|Approved)
228
- printf '%s\n' "$file"
229
- return 0
230
- ;;
231
- esac
232
- done < <(find "$sprints_dir" -maxdepth 1 -name '*.sprint.md' -type f | sort -r)
233
- return 1
234
- }
235
-
236
- run_sprint_next() {
237
- local output status summary sprint_file task
238
- local sprint_helper
239
- sprint_helper="$(helper_path "sprint-backlog.sh")"
240
-
241
- if [[ -f ".ai/harness/sprint/active-sprint" && -f "$sprint_helper" ]]; then
242
- set +e
243
- output="$(bash "$sprint_helper" next 2>&1)"
244
- status=$?
245
- set -e
246
- if [[ "$status" -eq 0 ]]; then
247
- task="$(printf '%s\n' "$output" | awk -F ': ' '/^task:/ { print $2; exit }')"
248
- add_entry "sprint-next" "action" "next sprint task: ${task:-unknown}" "$output"
249
- return 0
250
- fi
251
- if [[ "$status" -eq 3 ]]; then
252
- add_entry "sprint-next" "pass" "no pending sprint task" "$output"
253
- return 0
254
- fi
255
- fi
256
-
257
- if sprint_file="$(find_executing_sprint)"; then
258
- output="$(extract_next_pending_from_sprint "$sprint_file")"
259
- if [[ -n "$output" ]]; then
260
- task="$(printf '%s\n' "$output" | awk -F ': ' '/^task:/ { print $2; exit }')"
261
- add_entry "sprint-next" "action" "next sprint task: ${task:-unknown}" "$output"
262
- else
263
- add_entry "sprint-next" "pass" "no pending sprint task in $sprint_file" ""
264
- fi
265
- else
266
- add_entry "sprint-next" "info" "no active or executing sprint found" ""
267
- fi
268
- }
269
-
270
- run_drift_requests() {
271
- local details count
272
- if [[ ! -d "docs/architecture/requests" ]]; then
273
- add_entry "drift-requests" "pass" "no architecture request directory" ""
274
- return 0
275
- fi
276
-
277
- details="$(find docs/architecture/requests -maxdepth 1 -type f ! -name '.gitkeep' | sort)"
278
- if [[ -z "$details" ]]; then
279
- add_entry "drift-requests" "pass" "no pending architecture drift requests" ""
280
- return 0
281
- fi
282
-
283
- count="$(printf '%s\n' "$details" | sed '/^$/d' | wc -l | xargs)"
284
- add_entry "drift-requests" "action" "${count} pending architecture drift request(s)" "$details"
285
- }
286
-
287
- write_json_snapshot() {
288
- local target="$1"
289
- local idx
290
- {
291
- echo "{"
292
- printf ' "version": 1,\n'
293
- printf ' "kind": "forge-heartbeat-triage",\n'
294
- printf ' "run_id": "%s",\n' "$(json_escape "$run_id")"
295
- printf ' "source": "%s",\n' "$(json_escape "$run_source")"
296
- printf ' "generated_at": "%s",\n' "$(json_escape "$timestamp")"
297
- printf ' "repo": "%s",\n' "$(json_escape "$repo")"
298
- printf ' "inbox": "%s",\n' "$(json_escape "$(repo_relative "$inbox_file")")"
299
- printf ' "run_file": "%s",\n' "$(json_escape "$(repo_relative "$run_file")")"
300
- printf ' "adoption_review_due": "%s",\n' "$(json_escape "$adoption_review_due")"
301
- echo ' "entries": ['
302
- for idx in "${!entry_kinds[@]}"; do
303
- [[ "$idx" -eq 0 ]] || echo ","
304
- printf ' {"kind":"%s","status":"%s","summary":"%s","details":"%s"}' \
305
- "$(json_escape "${entry_kinds[$idx]}")" \
306
- "$(json_escape "${entry_statuses[$idx]}")" \
307
- "$(json_escape "${entry_summaries[$idx]}")" \
308
- "$(json_escape "${entry_details[$idx]}")"
309
- done
310
- echo
311
- echo ' ]'
312
- echo "}"
313
- } > "$target"
314
- }
315
-
316
- write_inbox() {
317
- local idx detail_line
318
- if [[ ! -f "$inbox_file" ]]; then
319
- {
320
- echo "# Heartbeat Triage Inbox"
321
- echo
322
- echo "<!-- managed by scripts/heartbeat-triage.sh; append-only run log -->"
323
- echo
324
- } > "$inbox_file"
325
- fi
326
-
327
- {
328
- echo "## Run ${run_id} - ${timestamp}"
329
- echo
330
- echo "- Source: ${run_source}"
331
- echo "- Run snapshot: $(repo_relative "$run_file")"
332
- echo "- Adoption review due: ${adoption_review_due}"
333
- echo
334
- echo "### Entries"
335
- echo
336
- for idx in "${!entry_kinds[@]}"; do
337
- printf -- "- [%s] %s: %s\n" "${entry_statuses[$idx]}" "${entry_kinds[$idx]}" "${entry_summaries[$idx]}"
338
- if [[ -n "${entry_details[$idx]}" ]]; then
339
- while IFS= read -r detail_line; do
340
- [[ -n "$detail_line" ]] || continue
341
- printf ' - %s\n' "$detail_line"
342
- done <<< "${entry_details[$idx]}"
343
- fi
344
- done
345
- echo
346
- } >> "$inbox_file"
347
- }
348
-
349
- adoption_review_due="$(date_plus_14_days)"
350
- run_workflow_check
351
- run_sprint_next
352
- run_drift_requests
353
- write_json_snapshot "$run_file"
354
- write_inbox
355
-
356
- if [[ "$json_output" -eq 1 ]]; then
357
- cat "$run_file"
358
- else
359
- echo "[Heartbeat] wrote $(repo_relative "$inbox_file")"
360
- echo "[Heartbeat] run snapshot: $(repo_relative "$run_file")"
361
- fi