@moretea-labs/forge 1.5.1 → 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 (434) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +46 -0
  3. package/CLAUDE.md +2 -0
  4. package/DESIGN.md +7 -2
  5. package/README.md +4 -4
  6. package/README.zh-CN.md +2 -2
  7. package/SKILL.md +2 -2
  8. package/THIRD_PARTY_NOTICES.md +1 -1
  9. package/agents/openai.yaml +1 -1
  10. package/assets/hooks/hook-input.sh +11 -8
  11. package/assets/hooks/lib/session-state.sh +10 -7
  12. package/assets/hooks/lib/workflow-state.sh +13 -177
  13. package/assets/hooks/post-tool-observer.sh +8 -2
  14. package/assets/hooks/pre-edit-guard.sh +8 -39
  15. package/assets/hooks/prompt-guard.sh +7 -83
  16. package/assets/hooks/session-start-context.sh +56 -1
  17. package/assets/partials/05-workflow.partial.md +1 -1
  18. package/assets/partials-agents/03-orchestration.partial.md +1 -1
  19. package/assets/plugin-registry.v1.json +54 -3
  20. package/assets/reference-configs/document-generation.md +1 -1
  21. package/assets/reference-configs/harness-overview.md +1 -1
  22. package/assets/reference-configs/hook-operations.md +1 -1
  23. package/assets/reference-configs/sprint-contracts.md +3 -3
  24. package/assets/skill-version.json +2 -2
  25. package/assets/templates/contract.template.md +2 -7
  26. package/assets/templates/helpers/capture-plan.sh +2 -2
  27. package/assets/templates/helpers/check-task-workflow.sh +4 -4
  28. package/assets/templates/helpers/contract-worktree.sh +1 -21
  29. package/assets/templates/helpers/ensure-task-workflow.sh +13 -38
  30. package/assets/templates/helpers/migrate-project-template.sh +22 -45
  31. package/assets/templates/helpers/new-plan.sh +1 -1
  32. package/assets/templates/helpers/plan-to-todo.sh +12 -37
  33. package/assets/templates/helpers/ship-worktrees.sh +2 -29
  34. package/assets/templates/helpers/sprint-backlog.sh +6 -6
  35. package/assets/templates/helpers/verify-contract.sh +1 -111
  36. package/assets/templates/helpers/verify-sprint.sh +3 -180
  37. package/assets/templates/plan.template.md +1 -1
  38. package/assets/templates/review.template.md +9 -34
  39. package/assets/workflow-contract.v1.json +10 -19
  40. package/docs/README.md +10 -10
  41. package/docs/architecture/CURRENT.md +170 -0
  42. package/docs/architecture/EVOLUTION.md +42 -0
  43. package/docs/architecture/current/README.md +4 -156
  44. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
  45. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
  46. package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
  47. package/docs/architecture/history/README.md +7 -0
  48. package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
  49. package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
  50. package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
  51. package/docs/architecture/history.md +3 -34
  52. package/docs/architecture/index.md +15 -98
  53. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  54. package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
  55. package/docs/architecture/versions/1.6.md +38 -0
  56. package/docs/architecture/versions/1.7.md +41 -0
  57. package/docs/forge-chatgpt-browser-engine.md +2 -2
  58. package/docs/forge-chatgpt-mcp-setup.md +4 -28
  59. package/docs/forge-chatgpt-supervised-automation.md +3 -3
  60. package/docs/forge-github-issue-launcher.md +1 -1
  61. package/docs/forge-runtime-self-healing-loop.md +1 -1
  62. package/docs/operations/controller-browser-plugin.md +38 -22
  63. package/docs/operations/controller-performance-and-502.md +124 -0
  64. package/docs/operations/controller-reliability-runbook.md +1 -1
  65. package/docs/operations/features.md +3 -3
  66. package/docs/operations/github-repository.md +1 -1
  67. package/docs/operations/homebrew.md +2 -2
  68. package/docs/operations/mcp-tool-exposure.md +5 -3
  69. package/docs/tutorials/01-install-and-start.md +1 -1
  70. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  71. package/docs/wiki/Architecture.md +6 -6
  72. package/docs/wiki/Implementation.md +2 -2
  73. package/docs/wiki/Installation.md +1 -1
  74. package/docs/wiki/Integrations.md +2 -2
  75. package/docs/wiki/Quick-Start.md +1 -1
  76. package/docs/wiki/Work-Lifecycle.md +1 -1
  77. package/package.json +29 -10
  78. package/scripts/activate-source-baseline.ts +17 -13
  79. package/scripts/benchmark-background-check-overlap.ts +228 -0
  80. package/scripts/benchmark-mcp-host.sh +117 -0
  81. package/scripts/benchmark-mcp-transport.ts +170 -0
  82. package/scripts/benchmark-quality-harness.ts +146 -0
  83. package/scripts/benchmark-route-session-concurrency.ts +207 -6
  84. package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
  85. package/scripts/benchmark-typescript-navigation.ts +186 -0
  86. package/scripts/benchmark-work-efficiency.ts +334 -0
  87. package/scripts/capture-plan.sh +3 -3
  88. package/scripts/check-agent-tooling.sh +8 -35
  89. package/scripts/check-architecture-sync.sh +17 -86
  90. package/scripts/check-mcp-compatibility.ts +14 -0
  91. package/scripts/check-public-docs.sh +14 -1
  92. package/scripts/check-runtime-architecture.mjs +107 -64
  93. package/scripts/check-stable-baseline.ts +92 -0
  94. package/scripts/check-task-workflow.sh +4 -4
  95. package/scripts/contract-worktree.sh +1 -21
  96. package/scripts/ensure-task-workflow.sh +22 -55
  97. package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
  98. package/scripts/install-standalone-recovery.ts +24 -0
  99. package/scripts/lib/project-init-lib.sh +15 -44
  100. package/scripts/migrate-chatgpt-automation-schedules.ts +64 -0
  101. package/scripts/migrate-project-template.sh +23 -1179
  102. package/scripts/new-plan.sh +1 -1
  103. package/scripts/plan-to-todo.sh +11 -36
  104. package/scripts/run-governed-gate.ts +2 -1
  105. package/scripts/ship-worktrees.sh +2 -29
  106. package/scripts/smoke-ios-physical-device.ts +4 -2
  107. package/scripts/smoke-runtime-recovery.ts +1 -35
  108. package/scripts/smoke-schedule-engine.ts +1 -20
  109. package/scripts/sprint-backlog.sh +1 -1
  110. package/scripts/verify-contract.sh +1 -111
  111. package/scripts/verify-forge-runtime.sh +0 -1
  112. package/scripts/verify-sprint.sh +3 -180
  113. package/scripts/workflow-contract.ts +1 -5
  114. package/src/cli/commands/chatgpt.ts +31 -2
  115. package/src/cli/commands/init-hook.ts +3 -3
  116. package/src/cli/commands/mcp.ts +9 -5
  117. package/src/cli/commands/plugin.ts +37 -10
  118. package/src/cli/commands/recovery.ts +25 -3
  119. package/src/cli/commands/runtime.ts +55 -3
  120. package/src/cli/commands/security.ts +12 -1
  121. package/src/cli/commands/setup-profile.ts +31 -21
  122. package/src/cli/controller/check-runner.ts +106 -3
  123. package/src/cli/controller/composite-result.ts +1 -1
  124. package/src/cli/controller/context/focus.ts +51 -0
  125. package/src/cli/controller/context/instruction-context.ts +114 -0
  126. package/src/cli/controller/context/known-paths.ts +76 -0
  127. package/src/cli/controller/context/query-planning.ts +110 -0
  128. package/src/cli/controller/context/rule-resolution.ts +532 -0
  129. package/src/cli/controller/context/source-materializer.ts +278 -0
  130. package/src/cli/controller/context/structural.ts +16 -0
  131. package/src/cli/controller/context/types.ts +286 -0
  132. package/src/cli/controller/context-pack.ts +898 -430
  133. package/src/cli/controller/launch-agents.ts +77 -2
  134. package/src/cli/controller/operational-plan.ts +2 -2
  135. package/src/cli/controller/work-mode.ts +6 -4
  136. package/src/cli/editing/edit-session.ts +60 -7
  137. package/src/cli/github/github.ts +133 -0
  138. package/src/cli/hook/prompt-guard-decision.ts +17 -18
  139. package/src/cli/hook/prompt-intents.ts +1 -1
  140. package/src/cli/installer/managed-entries.ts +15 -1
  141. package/src/cli/local-bridge/console-automations.ts +225 -67
  142. package/src/cli/local-bridge/console-view-models.ts +3 -35
  143. package/src/cli/local-bridge/facade-api.ts +2 -217
  144. package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
  145. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +153 -3
  146. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
  147. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +183 -3
  148. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +1 -1
  149. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +4 -3
  150. package/src/cli/local-bridge/frontend/src/lib/api.ts +18 -11
  151. package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
  152. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +1 -1
  153. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +4 -3
  154. package/src/cli/local-bridge/frontend/src/styles.css +27 -11
  155. package/src/cli/local-bridge/frontend/src/types.ts +8 -7
  156. package/src/cli/local-bridge/job-store.ts +1 -490
  157. package/src/cli/local-bridge/server.ts +29 -532
  158. package/src/cli/local-bridge/ui-dist/app.css +1 -1
  159. package/src/cli/local-bridge/ui-dist/app.js +5101 -4967
  160. package/src/cli/mcp/auth.ts +5 -5
  161. package/src/cli/mcp/instructions.ts +3 -2
  162. package/src/cli/mcp/legacy-tool-service.ts +0 -189
  163. package/src/cli/mcp/multi-repository.ts +16 -5
  164. package/src/cli/mcp/oauth.ts +175 -26
  165. package/src/cli/mcp/paths.ts +8 -2
  166. package/src/cli/mcp/repository-tools.ts +356 -101
  167. package/src/cli/mcp/server.ts +625 -54
  168. package/src/cli/mcp/tool-capability-cache.ts +1 -1
  169. package/src/cli/mcp/toolset-selection.ts +1 -1
  170. package/src/cli/mcp/toolset.ts +42 -5
  171. package/src/cli/mcp/transports/http.ts +125 -15
  172. package/src/cli/mcp/transports/session-registry.ts +67 -5
  173. package/src/cli/mcp/types.ts +3 -3
  174. package/src/cli/repositories/command-classifier.ts +209 -14
  175. package/src/cli/repositories/command-executor.ts +55 -521
  176. package/src/cli/repositories/command-process.ts +108 -0
  177. package/src/cli/repositories/command-scope.ts +99 -41
  178. package/src/cli/repositories/controller-home.ts +7 -8
  179. package/src/cli/repositories/git-command-executor.ts +2 -0
  180. package/src/cli/repositories/locks.ts +53 -16
  181. package/src/cli/repositories/repository-snapshot.ts +121 -0
  182. package/src/cli/repositories/safe-patch.ts +6 -4
  183. package/src/cli/repositories/selected-path-actions.ts +17 -9
  184. package/src/cli/repositories/structured-git.ts +110 -10
  185. package/src/cli/repository/inspector.ts +565 -62
  186. package/src/cli/repository/session-cache.ts +58 -17
  187. package/src/cli/v81-entry.ts +1 -4
  188. package/src/effects/fs-transaction.ts +85 -17
  189. package/src/runtime/context/codegraph-read-provider.ts +233 -2
  190. package/src/runtime/context/codegraph-sidecar.cjs +74 -40
  191. package/src/runtime/context/generic-lsp-provider.ts +355 -0
  192. package/src/runtime/context/lsp-client.ts +283 -0
  193. package/src/runtime/context/semantic-navigation.ts +275 -0
  194. package/src/runtime/context/swift-navigation.ts +565 -0
  195. package/src/runtime/context/typescript-navigation.ts +226 -0
  196. package/src/runtime/control-plane/dispatch-priority.ts +28 -0
  197. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +196 -2
  198. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
  199. package/src/runtime/control-plane/execution/execution-identity.ts +65 -14
  200. package/src/runtime/control-plane/execution/session-store.ts +18 -0
  201. package/src/runtime/control-plane/execution/validation.ts +15 -2
  202. package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
  203. package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
  204. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
  205. package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
  206. package/src/runtime/control-plane/execution/work-task-receipt.ts +54 -11
  207. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +175 -8
  208. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -21
  209. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +87 -9
  210. package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
  211. package/src/runtime/control-plane/facade/controller-round-relay.ts +991 -0
  212. package/src/runtime/control-plane/facade/controller-session-store.ts +144 -14
  213. package/src/runtime/control-plane/facade/goal-workloop-access.ts +9 -2
  214. package/src/runtime/control-plane/facade/goal-workloop.ts +885 -105
  215. package/src/runtime/control-plane/facade/index.ts +1 -0
  216. package/src/runtime/control-plane/facade/plan-contract-store.ts +211 -26
  217. package/src/runtime/control-plane/facade/requirement-board.ts +24 -8
  218. package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
  219. package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
  220. package/src/runtime/control-plane/facade/types.ts +55 -11
  221. package/src/runtime/control-plane/facade/work-contract-store.ts +204 -73
  222. package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
  223. package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
  224. package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
  225. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
  226. package/src/runtime/control-plane/global-scheduler/maintenance.ts +145 -0
  227. package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
  228. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
  229. package/src/runtime/control-plane/global-scheduler/scheduler.ts +273 -542
  230. package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
  231. package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
  232. package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
  233. package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
  234. package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
  235. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
  236. package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
  237. package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
  238. package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
  239. package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
  240. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +50 -0
  241. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +642 -51
  242. package/src/runtime/control-plane/launcher/launch-reservation-store.ts +40 -0
  243. package/src/runtime/control-plane/launcher/thin-launcher.ts +194 -10
  244. package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
  245. package/src/runtime/control-plane/persistence/requirement-store.ts +15 -11
  246. package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
  247. package/src/runtime/control-plane/release-retention.ts +62 -2
  248. package/src/runtime/control-plane/routing/route-policy.ts +7 -16
  249. package/src/runtime/control-plane/runtime-status-client.ts +0 -2
  250. package/src/runtime/diagnostics/mcp-timing.ts +19 -0
  251. package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
  252. package/src/runtime/diagnostics/performance.ts +24 -1
  253. package/src/runtime/evidence/event-ledger.ts +1 -1
  254. package/src/runtime/execution/jobs/store.ts +58 -4
  255. package/src/runtime/execution/jobs/types.ts +1 -1
  256. package/src/runtime/execution/managed-workspace.ts +203 -1
  257. package/src/runtime/execution/process-runtime/check-facade.ts +52 -14
  258. package/src/runtime/execution/process-runtime/check-result.ts +63 -2
  259. package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
  260. package/src/runtime/execution/process-runtime/command-facade.ts +346 -40
  261. package/src/runtime/execution/process-runtime/gc.ts +98 -12
  262. package/src/runtime/execution/process-runtime/lightweight-managed.ts +1184 -0
  263. package/src/runtime/execution/process-runtime/persisted-check.ts +57 -6
  264. package/src/runtime/execution/process-runtime/resource-claims.ts +97 -8
  265. package/src/runtime/execution/process-runtime/runtime.ts +59 -4
  266. package/src/runtime/execution/process-runtime/store.ts +7 -0
  267. package/src/runtime/execution/process-runtime/types.ts +2 -0
  268. package/src/runtime/execution/thin-harness/async-process.ts +12 -2
  269. package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
  270. package/src/runtime/execution/workers/executor.ts +0 -48
  271. package/src/runtime/gateway/mcp/execution-tools.ts +1219 -126
  272. package/src/runtime/gateway/mcp/process-tools.ts +83 -37
  273. package/src/runtime/gateway/mcp/router.ts +185 -83
  274. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +546 -0
  275. package/src/runtime/gateway/mcp/runtime-tools.ts +2555 -1616
  276. package/src/runtime/model-clients/deepseek-adapter.ts +0 -32
  277. package/src/runtime/plugins/app-store-connect-adapter.ts +123 -19
  278. package/src/runtime/plugins/browser-adapter.ts +2925 -318
  279. package/src/runtime/plugins/browser-automation-service.ts +10 -0
  280. package/src/runtime/plugins/browser-handoff-host.ts +6 -31
  281. package/src/runtime/plugins/browser-handoff.ts +92 -5
  282. package/src/runtime/plugins/browser-macos-bridge.ts +586 -45
  283. package/src/runtime/plugins/browser-node-bridge.ts +6 -34
  284. package/src/runtime/plugins/browser-provider-registry.ts +109 -0
  285. package/src/runtime/plugins/browser-runtime-contract.ts +152 -0
  286. package/src/runtime/plugins/browser-runtime.ts +183 -0
  287. package/src/runtime/plugins/browser-session-authority.ts +332 -0
  288. package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
  289. package/src/runtime/plugins/desktop-operator-registration.ts +15 -12
  290. package/src/runtime/plugins/external-adapter.ts +324 -3
  291. package/src/runtime/plugins/external-registration.ts +84 -5
  292. package/src/runtime/plugins/external-unix-socket.ts +7 -1
  293. package/src/runtime/plugins/first-party-registry.ts +4 -2
  294. package/src/runtime/plugins/github-adapter.ts +125 -0
  295. package/src/runtime/plugins/gmail-adapter.ts +28 -2
  296. package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
  297. package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
  298. package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
  299. package/src/runtime/plugins/ios-adapter.ts +106 -16
  300. package/src/runtime/plugins/ios-agent-device.ts +234 -64
  301. package/src/runtime/plugins/ios-physical-device.ts +1143 -392
  302. package/src/runtime/plugins/lightweight-action.ts +153 -0
  303. package/src/runtime/plugins/local-system-adapter.ts +125 -8
  304. package/src/runtime/plugins/macos-capability-broker.ts +55 -9
  305. package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
  306. package/src/runtime/plugins/plugin-management-adapter.ts +181 -0
  307. package/src/runtime/plugins/resend-adapter.ts +1 -1
  308. package/src/runtime/plugins/store.ts +366 -24
  309. package/src/runtime/plugins/types.ts +39 -2
  310. package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
  311. package/src/runtime/projections/git-status-sampler.ts +16 -16
  312. package/src/runtime/projections/materialized-view.ts +28 -10
  313. package/src/runtime/recovery/actions.ts +0 -10
  314. package/src/runtime/recovery/classifier.ts +0 -9
  315. package/src/runtime/recovery/maintenance-executor.ts +415 -18
  316. package/src/runtime/recovery/probe.ts +0 -1
  317. package/src/runtime/recovery/types.ts +0 -1
  318. package/src/runtime/root/mcp-transport.ts +180 -10
  319. package/src/runtime/root/package-connector-service.ts +186 -8
  320. package/src/runtime/root/package-runtime-release.ts +143 -17
  321. package/src/runtime/root/package-runtime-service.ts +430 -22
  322. package/src/runtime/root/release-manifest.ts +7 -2
  323. package/src/runtime/root/release-materialize.ts +162 -19
  324. package/src/runtime/root/release-store.ts +48 -11
  325. package/src/runtime/root/runtime.ts +23 -5
  326. package/src/runtime/root/service.ts +100 -27
  327. package/src/runtime/root/types.ts +2 -0
  328. package/src/runtime/safe-tooling/index.ts +0 -1
  329. package/src/runtime/safe-tooling/ios-development.ts +321 -63
  330. package/src/runtime/safe-tooling/types.ts +0 -30
  331. package/src/runtime/shared/trusted-executable.ts +62 -0
  332. package/src/runtime/shared/trusted-node-executable.ts +48 -0
  333. package/src/runtime/standalone-recovery/core.ts +702 -94
  334. package/src/runtime/standalone-recovery/entry.ts +99 -23
  335. package/src/runtime/standalone-recovery/installer.ts +19 -3
  336. package/src/runtime/standalone-recovery/service-labels.ts +2 -0
  337. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
  338. package/src/runtime/workflow/schedules/browser-probe.ts +258 -0
  339. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +40 -0
  340. package/src/runtime/workflow/schedules/engine.ts +509 -80
  341. package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
  342. package/src/runtime/workflow/schedules/settlement.ts +48 -4
  343. package/src/runtime/workflow/schedules/store.ts +131 -10
  344. package/src/runtime/workflow/schedules/types.ts +6 -3
  345. package/src/runtime/workflow/schedules/work-continuation.ts +120 -34
  346. package/src/testing/test-governance.ts +8 -40
  347. package/assets/reference-configs/heartbeat-triage.md +0 -57
  348. package/assets/templates/helpers/harness-trace-grade.sh +0 -150
  349. package/assets/templates/helpers/heartbeat-triage.sh +0 -361
  350. package/assets/templates/helpers/maintenance-triage.sh +0 -167
  351. package/bin/forge-desktop-helper.mjs +0 -204
  352. package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
  353. package/docs/architecture/current/architecture-invariants.md +0 -331
  354. package/docs/architecture/current/automation-and-schedule-engine.md +0 -453
  355. package/docs/architecture/current/codegraph-context-provider.md +0 -226
  356. package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
  357. package/docs/architecture/current/controller-repository-decoupling.md +0 -148
  358. package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -354
  359. package/docs/architecture/current/entity-model.md +0 -592
  360. package/docs/architecture/current/external-plugin-governance.md +0 -396
  361. package/docs/architecture/current/failure-recovery.md +0 -447
  362. package/docs/architecture/current/governance.md +0 -213
  363. package/docs/architecture/current/human-interaction-plane.md +0 -87
  364. package/docs/architecture/current/implementation-status.md +0 -128
  365. package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
  366. package/docs/architecture/current/legacy-governance.md +0 -58
  367. package/docs/architecture/current/local-workspace-target-grants.md +0 -70
  368. package/docs/architecture/current/migration-roadmap.md +0 -105
  369. package/docs/architecture/current/multi-repository-execution.md +0 -371
  370. package/docs/architecture/current/operations-runbook.md +0 -45
  371. package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
  372. package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
  373. package/docs/architecture/current/repository-access-modes.md +0 -102
  374. package/docs/architecture/current/route-policy.md +0 -15
  375. package/docs/architecture/current/route-session-concurrency.md +0 -85
  376. package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
  377. package/docs/architecture/current/runtime-directory-map.md +0 -49
  378. package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
  379. package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
  380. package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
  381. package/docs/architecture/current/system-overview.md +0 -144
  382. package/docs/architecture/current/target-requirements-traceability.md +0 -202
  383. package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
  384. package/docs/architecture/current/thin-harness-v1.md +0 -311
  385. package/docs/architecture/current/verification-and-release-gates.md +0 -391
  386. package/docs/forge-autonomous-goal-loop.md +0 -9
  387. package/docs/forge-provider-configuration.md +0 -7
  388. package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -83
  389. package/docs/operations/controller-desktop-plugin.md +0 -112
  390. package/docs/operations/gmail-assistant-routines.md +0 -186
  391. package/docs/operations/personal-assistant-operator-guide.md +0 -61
  392. package/docs/operations/provider-configuration.md +0 -31
  393. package/scripts/harness-trace-grade.sh +0 -150
  394. package/scripts/heartbeat-triage.sh +0 -361
  395. package/scripts/maintenance-triage.sh +0 -167
  396. package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
  397. package/src/cli/repositories/goal-registry.ts +0 -239
  398. package/src/runtime/assistant/action-proposals.ts +0 -279
  399. package/src/runtime/assistant/intent.ts +0 -395
  400. package/src/runtime/assistant/model-provider.ts +0 -460
  401. package/src/runtime/assistant/openapi.ts +0 -223
  402. package/src/runtime/assistant/policy.ts +0 -89
  403. package/src/runtime/assistant/readiness.ts +0 -258
  404. package/src/runtime/assistant/routine-runtime.ts +0 -477
  405. package/src/runtime/assistant/schedule-binding.ts +0 -171
  406. package/src/runtime/assistant/standing-grants.ts +0 -375
  407. package/src/runtime/assistant/store.ts +0 -243
  408. package/src/runtime/assistant/types.ts +0 -135
  409. package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
  410. package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
  411. package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
  412. package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
  413. package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
  414. package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
  415. package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
  416. package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
  417. package/src/runtime/control-plane/goal-loop/index.ts +0 -13
  418. package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
  419. package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
  420. package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
  421. package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
  422. package/src/runtime/control-plane/goal-loop/types.ts +0 -378
  423. package/src/runtime/control-plane/startup-recovery.ts +0 -198
  424. package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
  425. package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
  426. package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
  427. package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
  428. package/src/runtime/plugins/desktop-adapter.ts +0 -374
  429. package/src/runtime/safe-tooling/browser-safe.ts +0 -133
  430. package/src/runtime/workflow/findings/store.ts +0 -204
  431. package/src/runtime/workflow/findings/types.ts +0 -58
  432. package/src/runtime/workflow/portfolio/engine.ts +0 -20
  433. package/src/runtime/workflow/portfolio/store.ts +0 -185
  434. package/src/runtime/workflow/portfolio/types.ts +0 -29
package/AGENTS.md CHANGED
@@ -43,6 +43,8 @@ Treat ChatGPT as the controller and Forge as its repository execution layer. Cha
43
43
 
44
44
  ## Operating Rules
45
45
 
46
+ - After a managed repository change is verified and committed/merged, push the delivered target branch to its configured remote promptly. Do not leave a successfully delivered commit only on local refs unless the user explicitly requested local-only delivery or the push is blocked by safety, permissions, authentication, or branch policy; surface the exact blocker when a push cannot complete.
47
+ - Treat the Google Cloud `forge-cloud` VM experiment as retired infrastructure. Do not restart or reuse that VM for Forge Cloud. Any future remote Forge maintainer must use a separately evaluated host/transport and must demonstrate better latency and reliability than the local Forge path before adoption.
46
48
  - Sync `tasks/` whenever substantive repo changes are made.
47
49
  - Use `tasks/notes/<plan-stem>.notes.md` only for non-obvious slice decisions, deviations, tradeoffs, and open questions; `<plan-stem>` is the active plan filename without `plan-` and `.md` (for example `20260531-0045-governance-workflow`). Do not use notes as durable memory or a task log, and archive/promote them deliberately when the slice closes.
48
50
  - Treat hook execution as central-first: trusted repos run `~/.forge/hooks/` (bash shim) or the packaged CLI copy; this self-host repo pins `"hook_source": "repo"` in `.ai/harness/policy.json` so `.ai/hooks/` stays the live development runtime, with `assets/hooks/` as the product source mirrored on install. User-level `~/.claude/settings.json` and `~/.codex/hooks.json` are the host adapters.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,52 @@ All notable public Forge changes are recorded here. Release entries are tied to
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## 1.7.0 - 2026-08-27
8
+
9
+ ### Persistent autonomous control
10
+
11
+ - Add the durable Schedule → Work → ChatGPT conversation continuation contract, explicit round dispositions, effect-only Work/finalization semantics, and tab settlement after Controller release instead of immediately after prompt dispatch.
12
+ - Keep transient Browser/connector readiness failures on bounded backoff without permanently disabling schedules, while authentication, consent, destructive actions, and other hard boundaries remain fail-closed.
13
+ - Make real timer-origin continuation and the Continuous Evolution Supervisor a stable-release gate rather than treating schedule configuration alone as proof of autonomous operation.
14
+
15
+ ### Browser Runtime V3
16
+
17
+ - Promote Browser Runtime V3 as the current browser architecture with one Controller Home BrowserSession authority, stable plugin-owned native tab identity, background-safe navigation, exact rebind, and explicit physical-input fallback.
18
+ - Harden native replacement with strict postconditions, HTTP(S) settlement that rejects transitional `about:*` pages, destination-origin authorization, and preservation of user-owned tabs.
19
+ - Improve Chrome/Vivaldi provider behavior, postcondition evidence, restart/rebind handling, and visual evidence integration without adding a second Browser authority.
20
+
21
+ ### Capabilities, plugins, and iOS
22
+
23
+ - Add deterministic natural-intent capability discovery while keeping `plugin_action_execute` as the sole typed plugin executor and preserving the stable ChatGPT facade.
24
+ - Add controller-global plugin profiles with repository overlays, including reusable App Store Connect credential references without copying private-key contents into repository state or tool output.
25
+ - Add typed physical-device iOS build destinations and opt-in Xcode provisioning updates using file-backed App Store Connect key references, with bounded/redacted execution evidence.
26
+
27
+ ### Runtime, recovery, and governance
28
+
29
+ - Continue converging Work/Plan/finalizer lifecycle authority, target-advancement validation, process/session fencing, source coherence, and whole-Runtime immutable activation/rollback under the independent Recovery boundary.
30
+ - Keep ChatGPT as the semantic controller and Forge as the deterministic execution/control plane, with Direct-first execution and durable Work/Plan state only where continuity, isolation, recovery, scheduling, or external effects require it.
31
+ - Tighten maintained architecture/documentation authority and capability-closure governance so stale Work or superseded design documents do not become parallel current truth.
32
+
33
+ ## 1.6.0 - 2026-08-16
34
+
35
+ ### Architecture V2 and execution governance
36
+
37
+ - Complete the V2 Direct / bounded Work / Plan execution model, including isolated Work materialization, authoritative finalization, dead-Plan recovery, duplicate-writer prevention, and safer Work validation.
38
+ - Decouple durable Work ownership from transient MCP transport sessions so scheduled and interactive ChatGPT execution can resume against stable controller leases and checkout identity.
39
+ - Add bounded impact context and CodeGraph-aware retrieval while keeping routing, semantic context, and repository authority converged on one deterministic control path.
40
+
41
+ ### Performance and Runtime
42
+
43
+ - Reduce controller hot-path overhead with canonical repository-root reuse, exact-file retrieval fast paths, Runtime proxy session reuse, batched Process identity probes, narrower service claims, and read-only SQLite diagnostics.
44
+ - Preserve resumable Process/check execution while improving persisted-check retry idempotency, stale-process handling, worktree reconciliation, and release/runtime identity safety.
45
+ - Keep the stable 19-tool ChatGPT surface while moving more domain behavior behind typed capability and plugin contracts.
46
+
47
+ ### Automation and plugins
48
+
49
+ - Add Forge-native ChatGPT workflows, schedules, Work-bound browser watchers, cross-session workflow attribution, and more reliable ChatGPT mode/reasoning selection.
50
+ - Add trusted external-plugin registration lifecycle support and official Forge Figma Bridge catalog installation; retire the bundled desktop helper in favor of the external provider boundary.
51
+ - Improve plugin scope/compatibility handling, browser URL behavior, image artifact delivery, Gmail Unicode subjects, and automation history/configuration surfaces.
52
+
7
53
  ## 1.5.1 - 2026-08-13
8
54
 
9
55
  ### ChatGPT Secure Tunnel and package setup
package/CLAUDE.md CHANGED
@@ -43,6 +43,8 @@ Treat ChatGPT as the controller and Forge as its repository execution layer. Cha
43
43
 
44
44
  ## Operating Rules
45
45
 
46
+ - After a managed repository change is verified and committed/merged, push the delivered target branch to its configured remote promptly. Do not leave a successfully delivered commit only on local refs unless the user explicitly requested local-only delivery or the push is blocked by safety, permissions, authentication, or branch policy; surface the exact blocker when a push cannot complete.
47
+ - Treat the Google Cloud `forge-cloud` VM experiment as retired infrastructure. Do not restart or reuse that VM for Forge Cloud. Any future remote Forge maintainer must use a separately evaluated host/transport and must demonstrate better latency and reliability than the local Forge path before adoption.
46
48
  - Sync `tasks/` whenever substantive repo changes are made.
47
49
  - Use `tasks/notes/<plan-stem>.notes.md` only for non-obvious slice decisions, deviations, tradeoffs, and open questions; `<plan-stem>` is the active plan filename without `plan-` and `.md` (for example `20260531-0045-governance-workflow`). Do not use notes as durable memory or a task log, and archive/promote them deliberately when the slice closes.
48
50
  - Treat hook execution as central-first: trusted repos run `~/.forge/hooks/` (bash shim) or the packaged CLI copy; this self-host repo pins `"hook_source": "repo"` in `.ai/harness/policy.json` so `.ai/hooks/` stays the live development runtime, with `assets/hooks/` as the product source mirrored on install. User-level `~/.claude/settings.json` and `~/.codex/hooks.json` are the host adapters.
package/DESIGN.md CHANGED
@@ -218,9 +218,14 @@ Dark, persistent and quiet. It contains Forge identity, grouped navigation, and
218
218
  ### Command bar
219
219
  Each route owns a compact command bar: eyebrow, title, one-line purpose, refreshed time and route actions. `Open ChatGPT` remains globally available but visually secondary.
220
220
 
221
+ ## Page composition rules
222
+ Each workspace has **one dominant information region** and at most one contextual secondary region. Pages are not collections of cards; layout, typography, aligned columns, whitespace and hairlines establish hierarchy before enclosure.
223
+
224
+ Collections use rows or tables. A selected entity uses one contextual detail pane. Configuration uses titled sections with field rows. Metrics stay inline or in compact definition rows unless direct metric comparison is the task. Normal state is visually neutral; semantic color is reserved for exceptions, attention and explicit interaction.
225
+
221
226
  ## Core component grammar
222
227
  ### Metric strip
223
- Overview may show at most four coarse operational facts in one horizontal strip. Metrics share one surface and divider rhythm; they are not separate cards.
228
+ Metric strips are exceptional. Use them only when comparing coarse operational facts is itself useful; never make equal metric cards the default page composition.
224
229
 
225
230
  ### Data list
226
231
  Primary scanning surface for Work, Capabilities and Repositories. Rows use hairline separators and bounded one-line context.
@@ -236,7 +241,7 @@ Use a 7px dot plus short text. Filled badges are exceptional.
236
241
 
237
242
  ## Page grammar
238
243
  ### Overview
239
- Command bar, one four-column metric strip, a deduplicated attention list capped to actionable groups, and a compact persistent-goals summary. No prompt composer, run timeline or grid of equal cards.
244
+ Overview is a **cross-workspace status and attention surface**, not a collection manager. Keep it single-column and lightweight: first surface a bounded, deduplicated Needs attention list across Work, Automations, Capabilities, Repositories and System; then show one compact Workspace summary row for each owning workspace. Overview does not enumerate ordinary Work, group content by repository, expose collection filters or open a detail pane. It routes the user to the owning workspace for management. Healthy state stays compact and neutral. Activity feeds require authoritative event semantics and must never be inferred from `updatedAt` or other incidental timestamps. No prompt composer, run timeline, repository portfolio, equal metric grid or decorative posture hero.
240
245
 
241
246
  ### Automations
242
247
  Use a configuration-first table with Name, Schedule, Scope, Delivery, Status, Last and Next; filters Enabled / Paused / Attention / All; selected detail pane with exact source and Run/Pause/Resume. Never duplicate report body.
package/README.md CHANGED
@@ -48,7 +48,7 @@ Setup persists progress and guides the selected path through the user-level Pack
48
48
 
49
49
  Then follow [Install and start](docs/tutorials/01-install-and-start.md) and [Connect ChatGPT](docs/tutorials/02-connect-chatgpt.md). A repository is optional during initial setup; add one later with `forge adopt --repo /path/to/your-project`. Upgrade an existing install with `npm install -g @moretea-labs/forge@latest`, verify with `forge --version`, then run `forge setup next` to reconcile newer Runtime/connector setup contracts.
50
50
 
51
- For a reviewed source checkout: `git clone https://github.com/moretea-labs/forge.git && cd forge && npm ci --ignore-scripts --no-audit --no-fund && npm install -g . --omit=optional --no-audit --no-fund`.
51
+ For a reviewed source checkout: `git clone https://github.com/moretea-labs/forge.git && cd forge && bun install --frozen-lockfile && npm install -g . --omit=optional --no-audit --no-fund`.
52
52
 
53
53
  ## Built in, and extensible
54
54
 
@@ -58,7 +58,7 @@ Forge ships typed local/browser/desktop/iOS/GitHub/Gmail/Calendar/Tasks/App Stor
58
58
 
59
59
  Local read/write grants are explicit and expiring; remote or destructive effects are distinguished from ordinary local work; high-impact actions require stronger confirmation. Full Access reduces repetitive prompts for normal work without removing the hard boundaries around secrets, destructive actions, and outside-workspace access. See [Security](SECURITY.md) and the [Security Model](docs/wiki/Security-Model.md).
60
60
 
61
- **Docs:** [Wiki](docs/wiki/Home.md) · [Support](SUPPORT.md) · [Contributing](CONTRIBUTING.md) · [Changelog](CHANGELOG.md). Current stable release: `1.5.1`; stable installs use npm `latest`.
61
+ **Docs:** [Wiki](docs/wiki/Home.md) · [Support](SUPPORT.md) · [Contributing](CONTRIBUTING.md) · [Changelog](CHANGELOG.md). Current stable release: `1.7.0`; stable installs use npm `latest`.
62
62
 
63
63
  ---
64
64
  <a id="zh-cn"></a>
@@ -103,10 +103,10 @@ forge setup next # 按每次显示的 Next 动作继续
103
103
 
104
104
  远程主控的 setup 会继续引导 Package Runtime、远程连接、主控配置和连接验证;对 ChatGPT,`--tunnel auto` 现在明确表示 **优先 OpenAI Secure MCP Tunnel**。Forge 保持 Canonical Runtime 私有,并安装一个仅监听 loopback 的 OAuth Gateway,再由官方 `tunnel-client` 出站连接 OpenAI。只有 Secure Tunnel 不可用时才显式选择 Cloudflare Tunnel、Tailscale Funnel、已有 HTTPS `/mcp` 或暂缓远程连接。本地 Codex/Claude 主控不需要 tunnel。ChatGPT App/connector 是应用身份,Secure Tunnel 只是网络传输层,因此切换网络不会产生另一套 Forge 工具 schema。
105
105
 
106
- 继续阅读[安装与启动](docs/tutorials/01-install-and-start.zh-CN.md)和[连接 ChatGPT](docs/tutorials/02-connect-chatgpt.zh-CN.md)。仓库不是首次 setup 的前置条件,需要开发能力时再运行 `forge adopt --repo /path/to/your-project`。已安装用户升级:`npm install -g @moretea-labs/forge@latest`,确认 `forge --version` 后运行 `forge setup next` 让新版 setup 自动补齐 Runtime/connector 配置。源码安装:`git clone https://github.com/moretea-labs/forge.git && cd forge && npm ci --ignore-scripts --no-audit --no-fund && npm install -g . --omit=optional --no-audit --no-fund`。
106
+ 继续阅读[安装与启动](docs/tutorials/01-install-and-start.zh-CN.md)和[连接 ChatGPT](docs/tutorials/02-connect-chatgpt.zh-CN.md)。仓库不是首次 setup 的前置条件,需要开发能力时再运行 `forge adopt --repo /path/to/your-project`。已安装用户升级:`npm install -g @moretea-labs/forge@latest`,确认 `forge --version` 后运行 `forge setup next` 让新版 setup 自动补齐 Runtime/connector 配置。源码安装:`git clone https://github.com/moretea-labs/forge.git && cd forge && bun install --frozen-lockfile && npm install -g . --omit=optional --no-audit --no-fund`。
107
107
 
108
108
  Forge 内置本机、Browser、Desktop、iOS、GitHub、Gmail、Calendar、Tasks、App Store Connect、Resend 等类型化能力;公开 Provider 目录还有 **Forge Desktop Operator / Forge Design / Personal Knowledge Assistant**。详见[功能清单](docs/operations/features.zh-CN.md)与[插件管理](docs/forge-plugin-management.md)。
109
109
 
110
110
  安全上,普通本地修改、远程影响、破坏性操作、密钥和工作区外访问是不同边界;Full Access 不会取消高风险确认。详见[安全说明](SECURITY.md)和[安全模型](docs/wiki/Security-Model.md)。
111
111
 
112
- **文档:** [Wiki](docs/wiki/Home.md) · [支持](SUPPORT.md) · [贡献](CONTRIBUTING.md) · [更新日志](CHANGELOG.md)。当前稳定版为 `1.5.1`,稳定安装使用 npm `latest`。
112
+ **文档:** [Wiki](docs/wiki/Home.md) · [支持](SUPPORT.md) · [贡献](CONTRIBUTING.md) · [更新日志](CHANGELOG.md)。当前稳定版为 `1.7.0`,稳定安装使用 npm `latest`。
package/README.zh-CN.md CHANGED
@@ -62,7 +62,7 @@ forge setup next # 按每次显示的 Next 动作继续
62
62
 
63
63
  ```bash
64
64
  git clone https://github.com/moretea-labs/forge.git && cd forge
65
- npm ci --ignore-scripts --no-audit --no-fund
65
+ bun install --frozen-lockfile
66
66
  npm install -g . --omit=optional --no-audit --no-fund
67
67
  ```
68
68
 
@@ -78,4 +78,4 @@ Forge 把读取、普通本地写入、远程操作、破坏性操作、工作
78
78
 
79
79
  [中文文档中心](docs/README.zh-CN.md) · [Wiki](docs/wiki/Home.md) · [SUPPORT.md](SUPPORT.md) · [CONTRIBUTING.md](CONTRIBUTING.md) · [CHANGELOG.md](CHANGELOG.md)
80
80
 
81
- 当前稳定版本是 `1.5.1`,稳定安装使用 npm `latest`。
81
+ 当前稳定版本是 `1.7.0`,稳定安装使用 npm `latest`。
package/SKILL.md CHANGED
@@ -40,8 +40,8 @@ Automatic routing remains authoritative when the user does not provide a mode di
40
40
 
41
41
  A leading mode directive is an opt-in instruction to ChatGPT's Forge router. It applies only to the current request, is removed from the objective before execution, and never bypasses permissions, Runtime authority, protected-path rules, approvals, or destructive/remote-write confirmation.
42
42
 
43
- - `-plan` or `/plan`: force the reviewed planning path. Planning is read-only: inspect repository state and call `controller_context_pack` with `structural_context=required` so CodeGraph symbol/reference/dependency/impact evidence is used when the index is ready; load only relevant architecture/ADR/design/README material, then create or revise the existing PlanContract. Review the PlanContract before approval. Do not start mutation until the reviewed plan is approved and execution is explicitly bound to an approved plan step. If CodeGraph is unavailable or stale, keep the degraded evidence warning visible and use bounded current-source context instead of pretending graph coverage exists.
44
- - `-debug` or `/debug`: force evidence-first debugging. Reproduce or characterize the failure, then prefer `controller_context_pack` with `structural_context=auto` to isolate callers, dependencies, and the smallest causal surface before patching and focused verification. The directive does not force an Agent or durable Work; existing routing still chooses Direct, bounded Work, or an optional worker from the actual scope and risk.
43
+ - `-plan` or `/plan`: force the reviewed planning path. Planning is read-only: inspect repository state and call `rh_context` search with `structural_context=required` so CodeGraph symbol/reference/dependency/impact evidence is used when the index is ready; load only relevant architecture/ADR/design/README material, then create or revise the existing PlanContract. Review the PlanContract before approval. Do not start mutation until the reviewed plan is approved and execution is explicitly bound to an approved plan step. If CodeGraph is unavailable or stale, keep the degraded evidence warning visible and use bounded current-source context instead of pretending graph coverage exists.
44
+ - `-debug` or `/debug`: force evidence-first debugging. Reproduce or characterize the failure, then prefer repeated `rh_context` search with `structural_context=auto` to isolate callers, dependencies, and the smallest causal surface before patching and focused verification. The directive does not force an Agent or durable Work; existing routing still chooses Direct, bounded Work, or an optional worker from the actual scope and risk.
45
45
 
46
46
  A bare directive with no objective should return/explain that mode's working contract and must not mutate repository state. Mode directives are not sticky across turns unless the user repeats them or explicitly asks to continue the same active Plan/Work.
47
47
 
@@ -1,6 +1,6 @@
1
1
  # Third-party notices
2
2
 
3
- This inventory covers the direct runtime and development dependencies declared by `@moretea-labs/forge@1.5.1`.
3
+ This inventory covers the direct runtime and development dependencies declared by `@moretea-labs/forge@1.7.0`.
4
4
 
5
5
  License values come from `package-lock.json` where available. For lock entries without a license field, the declared license was verified from package metadata during release preparation. This file is informational and does not replace the license text distributed by each dependency.
6
6
 
@@ -1,4 +1,4 @@
1
1
  interface:
2
2
  display_name: "forge"
3
3
  short_description: "Operate Forge workflows for repository planning, execution, verification, migration, audit, and repair"
4
- default_prompt: "Use Forge to inspect this repository, choose the smallest appropriate workflow, and carry out or plan the requested work with bounded evidence and verification."
4
+ default_prompt: "Use Forge to inspect this repository, choose the smallest appropriate workflow, and carry out or plan the requested work with bounded evidence and verification. After verified repository delivery, promptly push the committed/merged target branch to its configured remote unless the user explicitly requested local-only delivery or the push is blocked; report any blocker precisely."
@@ -26,10 +26,12 @@ hook_read_stdin_once() {
26
26
 
27
27
  if [[ -t 0 ]]; then
28
28
  HOOK_STDIN_JSON=""
29
+ export HOOK_STDIN_JSON
29
30
  return
30
31
  fi
31
32
 
32
33
  HOOK_STDIN_JSON="$(cat 2>/dev/null || true)"
34
+ export HOOK_STDIN_JSON
33
35
  }
34
36
 
35
37
  hook_json_extract_with_bun() {
@@ -275,11 +277,6 @@ hook_get_session_id() {
275
277
  local arg="${1:-}"
276
278
  local parsed=""
277
279
 
278
- if [[ -n "${HOOK_SESSION_ID:-}" ]]; then
279
- printf '%s' "$HOOK_SESSION_ID"
280
- return
281
- fi
282
-
283
280
  parsed="$(hook_json_get '.session_id' '')"
284
281
  if [[ -n "$parsed" ]]; then
285
282
  HOOK_SESSION_ID="$parsed"
@@ -296,13 +293,19 @@ hook_get_session_id() {
296
293
  return
297
294
  fi
298
295
 
299
- if [[ -n "${CLAUDE_SESSION_ID:-${CODEX_SESSION_ID:-}}" ]]; then
300
- HOOK_SESSION_ID="${CLAUDE_SESSION_ID:-${CODEX_SESSION_ID:-}}"
301
- export HOOK_SESSION_ID
296
+ if [[ -n "${HOOK_SESSION_ID:-}" ]]; then
302
297
  printf '%s' "$HOOK_SESSION_ID"
303
298
  return
304
299
  fi
305
300
 
301
+ parsed="${CLAUDE_SESSION_ID:-${CODEX_SESSION_ID:-${SESSION_KEY:-}}}"
302
+ if [[ -n "$parsed" ]]; then
303
+ HOOK_SESSION_ID="$parsed"
304
+ export HOOK_SESSION_ID
305
+ printf '%s' "$parsed"
306
+ return
307
+ fi
308
+
306
309
  printf '%s' ""
307
310
  }
308
311
 
@@ -17,16 +17,15 @@ session_state_new_session_id() {
17
17
  session_state_resolve_key() {
18
18
  local session_id_file="$1"
19
19
  local arg="${2:-}"
20
- local session_key="${HOOK_SESSION_ID:-}"
20
+ local session_key=""
21
21
 
22
- if [[ -z "$session_key" ]] && declare -F hook_get_session_id >/dev/null 2>&1; then
22
+ # An event payload is more specific than ambient host state. This matters for
23
+ # forwarded or replayed hook input, where the parent process can belong to a
24
+ # different host session than the event being handled.
25
+ if declare -F hook_get_session_id >/dev/null 2>&1; then
23
26
  session_key="$(hook_get_session_id "$arg")"
24
27
  fi
25
28
 
26
- if [[ -z "$session_key" ]]; then
27
- session_key="${CLAUDE_SESSION_ID:-${CODEX_SESSION_ID:-${SESSION_KEY:-}}}"
28
- fi
29
-
30
29
  if [[ -n "$session_key" ]]; then
31
30
  mkdir -p "$(dirname "$session_id_file")" 2>/dev/null || true
32
31
  printf '%s\n' "$session_key" > "$session_id_file" 2>/dev/null || true
@@ -34,10 +33,14 @@ session_state_resolve_key() {
34
33
  return
35
34
  fi
36
35
 
37
- if [[ -z "$session_key" ]] && [[ -s "$session_id_file" ]]; then
36
+ if [[ -s "$session_id_file" ]]; then
38
37
  session_key="$(cat "$session_id_file" 2>/dev/null || true)"
39
38
  fi
40
39
 
40
+ if [[ -z "$session_key" ]]; then
41
+ session_key="${HOOK_SESSION_ID:-${CLAUDE_SESSION_ID:-${CODEX_SESSION_ID:-${SESSION_KEY:-}}}}"
42
+ fi
43
+
41
44
  if [[ -z "$session_key" ]]; then
42
45
  session_key="$(session_state_new_session_id)"
43
46
  mkdir -p "$(dirname "$session_id_file")" 2>/dev/null || true
@@ -575,16 +575,21 @@ workflow_cleanup_candidate() {
575
575
  [[ -e "$metadata" ]] || continue
576
576
  slug="$(basename "$metadata" .json)"
577
577
  [[ -n "$slug" ]] || continue
578
- printf '%s\t%s\t\n' "$slug" "${branch_prefix}${slug}"
579
- return 0
578
+ branch="${branch_prefix}${slug}"
579
+ # Controller metadata can outlive a terminal worktree after a Home
580
+ # migration. It is not cleanup work unless a Git branch or worktree still
581
+ # exists; otherwise it must never keep a fresh resume packet stale.
582
+ if git show-ref --verify --quiet "refs/heads/${branch}"; then
583
+ printf '%s\t%s\t\n' "$slug" "$branch"
584
+ return 0
585
+ fi
580
586
  done
581
587
 
582
588
  return 1
583
589
  }
584
590
 
585
591
  workflow_next_action() {
586
- local active_plan task_state total done next_pending contract_file review_file checks_file checks_error
587
- local external_status external_state external_reviewer external_source external_message expected_source
592
+ local active_plan task_state total done next_pending contract_file checks_file checks_error
588
593
  local target current_branch slug candidate branch worktree command message
589
594
 
590
595
  active_plan="$(get_active_plan || true)"
@@ -602,38 +607,19 @@ workflow_next_action() {
602
607
  fi
603
608
 
604
609
  contract_file="$(workflow_active_contract || true)"
605
- review_file="$(workflow_active_review || true)"
606
610
  checks_file="$(workflow_checks_file)"
607
611
 
608
- if [[ -z "$review_file" || ! -f "$review_file" ]]; then
609
- printf 'review\t/review\tStage the completed module diff first; then run /review and record a sprint review before finishing this worktree.\n'
610
- return 0
611
- fi
612
-
613
- if ! workflow_review_recommends_pass "$review_file"; then
614
- printf 'review\t/review\tStage the completed module diff first; then run /review until %s records Recommendation: pass.\n' "$review_file"
615
- return 0
616
- fi
617
-
618
612
  if [[ -z "$contract_file" || ! -f "$contract_file" ]]; then
619
613
  printf 'check\t/check\tStage the completed module diff first; then regenerate the active sprint contract and run /review.\n'
620
614
  return 0
621
615
  fi
622
616
 
623
- external_status="$(workflow_external_acceptance_status "$review_file")"
624
- IFS=$'\t' read -r external_state external_reviewer external_source external_message <<< "$external_status"
625
- if [[ "$external_state" != "pass" && "$external_state" != "manual_override" ]]; then
626
- expected_source="$(workflow_external_acceptance_expected_source)"
627
- printf 'check\t/check\tStage the completed module diff first; then %s Run external acceptance via %s and record ## External Acceptance Advice in %s.\n' "${external_message:-External acceptance is missing.}" "$expected_source" "$review_file"
628
- return 0
629
- fi
630
-
631
617
  if [[ ! -f "$checks_file" ]]; then
632
618
  printf 'review\t/review\tStage the completed module diff first; then run /review and verify-sprint so %s exists.\n' "$checks_file"
633
619
  return 0
634
620
  fi
635
621
 
636
- if ! checks_error="$(workflow_checks_pass "$checks_file" "$contract_file" "$review_file")"; then
622
+ if ! checks_error="$(workflow_checks_pass "$checks_file" "$contract_file")"; then
637
623
  printf 'check\t/check\tStage the completed module diff first; then resolve check evidence: %s\n' "$checks_error"
638
624
  return 0
639
625
  fi
@@ -641,7 +627,7 @@ workflow_next_action() {
641
627
  target="$(workflow_target_branch)"
642
628
  current_branch="$(workflow_current_branch)"
643
629
  if workflow_is_linked_worktree && [[ -n "$current_branch" && "$current_branch" != "$target" ]]; then
644
- printf 'finish\tbash scripts/contract-worktree.sh finish\tReview/checks pass; finish and fast-forward merge this contract worktree.\n'
630
+ printf 'review\t/review\tCheck evidence passed. Freshly review user intent, affected domains, downstream consumers, and state transitions; then finish this contract worktree.\n'
645
631
  return 0
646
632
  fi
647
633
  fi
@@ -1282,151 +1268,10 @@ workflow_write_run_summary() {
1282
1268
  EOF_RUN
1283
1269
  }
1284
1270
 
1285
- workflow_review_recommends_pass() {
1286
- local review_file="${1:-}"
1287
- [[ -n "$review_file" && -f "$review_file" ]] || return 1
1288
- grep -Eq '^> \*\*Recommendation\*\*:[[:space:]]*pass[[:space:]]*$' "$review_file"
1289
- }
1290
-
1291
- workflow_external_acceptance_expected_reviewer() {
1292
- local host="${HOOK_HOST:-}"
1293
-
1294
- if [[ -z "$host" ]]; then
1295
- if [[ -n "${CODEX_RUN_ID:-}${CODEX_SESSION_ID:-}${CODEX_THREAD_ID:-}${CODEX_SHELL:-}${CODEX_INTERNAL_ORIGINATOR_OVERRIDE:-}" ]]; then
1296
- host="codex"
1297
- elif [[ -n "${CLAUDE_RUN_ID:-}${CLAUDE_SESSION_ID:-}" ]]; then
1298
- host="claude"
1299
- else
1300
- host="claude"
1301
- fi
1302
- fi
1303
-
1304
- if [[ "$host" == "codex" ]]; then
1305
- printf 'Claude'
1306
- else
1307
- printf 'Codex'
1308
- fi
1309
- }
1310
-
1311
- workflow_external_acceptance_source_for_reviewer() {
1312
- local reviewer="${1:-}"
1313
- case "$(printf '%s' "$reviewer" | tr '[:upper:]' '[:lower:]')" in
1314
- claude) printf 'claude-review' ;;
1315
- *) printf 'codex-review' ;;
1316
- esac
1317
- }
1318
-
1319
- workflow_external_acceptance_expected_source() {
1320
- local reviewer="${1:-}"
1321
- reviewer="${reviewer:-$(workflow_external_acceptance_expected_reviewer)}"
1322
- workflow_external_acceptance_source_for_reviewer "$reviewer"
1323
- }
1324
-
1325
- workflow_external_acceptance_section() {
1326
- local review_file="${1:-}"
1327
- [[ -n "$review_file" && -f "$review_file" ]] || return 1
1328
- awk '
1329
- /^##[[:space:]]+External Acceptance Advice[[:space:]]*$/ { in_section = 1; next }
1330
- /^##[[:space:]]+/ && in_section { exit }
1331
- in_section { print }
1332
- ' "$review_file"
1333
- }
1334
-
1335
- workflow_external_acceptance_field() {
1336
- local section="${1:-}"
1337
- local label="${2:-}"
1338
- printf '%s\n' "$section" |
1339
- sed -nE "s/^> \\*\\*${label}\\*\\*:[[:space:]]*([^[:space:]].*)[[:space:]]*$/\\1/p" |
1340
- head -n 1 |
1341
- sed -E 's/[[:space:]]+$//'
1342
- }
1343
-
1344
- workflow_external_acceptance_status() {
1345
- local review_file="${1:-}"
1346
- local expected_reviewer="${2:-}"
1347
- local expected_source section acceptance reviewer source p1_blockers manual_override
1348
- local acceptance_lc reviewer_lc source_lc expected_reviewer_lc expected_source_lc p1_lc
1349
-
1350
- expected_reviewer="${expected_reviewer:-$(workflow_external_acceptance_expected_reviewer)}"
1351
- expected_source="$(workflow_external_acceptance_expected_source "$expected_reviewer")"
1352
-
1353
- if [[ -z "$review_file" || ! -f "$review_file" ]]; then
1354
- printf 'missing\t-\t-\tExternal acceptance review file is missing: %s\n' "${review_file:-tasks/reviews/<slug>.review.md}"
1355
- return 0
1356
- fi
1357
-
1358
- section="$(workflow_external_acceptance_section "$review_file" || true)"
1359
- if [[ -z "$section" ]]; then
1360
- printf 'missing\t-\t-\tExternal acceptance section is missing from %s.\n' "$review_file"
1361
- return 0
1362
- fi
1363
-
1364
- acceptance="$(workflow_external_acceptance_field "$section" "External Acceptance")"
1365
- reviewer="$(workflow_external_acceptance_field "$section" "External Reviewer")"
1366
- source="$(workflow_external_acceptance_field "$section" "External Source")"
1367
- p1_blockers="$(
1368
- printf '%s\n' "$section" |
1369
- sed -nE 's/^- P1 blockers:[[:space:]]*([^[:space:]].*)[[:space:]]*$/\1/p' |
1370
- head -n 1 |
1371
- sed -E 's/[[:space:]]+$//'
1372
- )"
1373
- manual_override="$(
1374
- printf '%s\n' "$section" |
1375
- sed -nE 's/^-?[[:space:]]*Manual Override:[[:space:]]*([^[:space:]].*)[[:space:]]*$/\1/p' |
1376
- head -n 1 |
1377
- sed -E 's/[[:space:]]+$//'
1378
- )"
1379
-
1380
- if [[ -n "$manual_override" ]]; then
1381
- printf 'manual_override\t%s\t%s\tManual override recorded for external acceptance: %s\n' "${reviewer:--}" "${source:--}" "$manual_override"
1382
- return 0
1383
- fi
1384
-
1385
- acceptance_lc="$(printf '%s' "$acceptance" | tr '[:upper:]' '[:lower:]')"
1386
- reviewer_lc="$(printf '%s' "$reviewer" | tr '[:upper:]' '[:lower:]')"
1387
- source_lc="$(printf '%s' "$source" | tr '[:upper:]' '[:lower:]')"
1388
- expected_reviewer_lc="$(printf '%s' "$expected_reviewer" | tr '[:upper:]' '[:lower:]')"
1389
- expected_source_lc="$(printf '%s' "$expected_source" | tr '[:upper:]' '[:lower:]')"
1390
- p1_lc="$(printf '%s' "$p1_blockers" | tr '[:upper:]' '[:lower:]')"
1391
-
1392
- if [[ "$acceptance_lc" != "pass" ]]; then
1393
- printf 'fail\t%s\t%s\tExternal acceptance is %s; expected pass from %s via %s.\n' "${reviewer:--}" "${source:--}" "${acceptance:-missing}" "$expected_reviewer" "$expected_source"
1394
- return 0
1395
- fi
1396
-
1397
- if [[ "$reviewer_lc" != "$expected_reviewer_lc" ]]; then
1398
- printf 'fail\t%s\t%s\tExternal reviewer is %s; expected %s.\n' "${reviewer:--}" "${source:--}" "${reviewer:-missing}" "$expected_reviewer"
1399
- return 0
1400
- fi
1401
-
1402
- if [[ "$source_lc" != "$expected_source_lc" ]]; then
1403
- printf 'fail\t%s\t%s\tExternal source is %s; expected %s.\n' "${reviewer:--}" "${source:--}" "${source:-missing}" "$expected_source"
1404
- return 0
1405
- fi
1406
-
1407
- if [[ "$p1_lc" != "none" ]]; then
1408
- printf 'fail\t%s\t%s\tExternal acceptance has P1 blockers: %s\n' "${reviewer:--}" "${source:--}" "${p1_blockers:-missing}"
1409
- return 0
1410
- fi
1411
-
1412
- printf 'pass\t%s\t%s\tExternal acceptance passed.\n' "$reviewer" "$source"
1413
- }
1414
-
1415
- workflow_external_acceptance_pass() {
1416
- local review_file="${1:-}"
1417
- local expected_reviewer="${2:-}"
1418
- local row status
1419
-
1420
- row="$(workflow_external_acceptance_status "$review_file" "$expected_reviewer")"
1421
- status="${row%%$'\t'*}"
1422
- [[ "$status" == "pass" || "$status" == "manual_override" ]]
1423
- }
1424
-
1425
1271
  workflow_checks_pass() {
1426
1272
  local checks_file="${1:-}"
1427
1273
  local contract_file="${2:-}"
1428
- local review_file="${3:-}"
1429
- local status source exit_code check_contract check_review
1274
+ local status source exit_code check_contract
1430
1275
 
1431
1276
  if [[ -z "$checks_file" || ! -s "$checks_file" ]]; then
1432
1277
  echo "Structured checks file is missing or empty: ${checks_file:-"(none)"}"
@@ -1438,7 +1283,6 @@ workflow_checks_pass() {
1438
1283
  source="$(jq -r '.source // empty' "$checks_file" 2>/dev/null || true)"
1439
1284
  exit_code="$(jq -r '.exit_code // empty' "$checks_file" 2>/dev/null || true)"
1440
1285
  check_contract="$(jq -r '.contract.file // .contract // empty' "$checks_file" 2>/dev/null || true)"
1441
- check_review="$(jq -r '.review.file // .review // empty' "$checks_file" 2>/dev/null || true)"
1442
1286
 
1443
1287
  if [[ "$status" != "pass" ]]; then
1444
1288
  echo "Structured checks are not passing in $checks_file (status=${status:-missing})."
@@ -1456,10 +1300,6 @@ workflow_checks_pass() {
1456
1300
  echo "Structured checks are stale for contract ${check_contract:-missing}; expected $contract_file."
1457
1301
  return 1
1458
1302
  fi
1459
- if [[ -n "$review_file" && "$check_review" != "$review_file" ]]; then
1460
- echo "Structured checks are stale for review ${check_review:-missing}; expected $review_file."
1461
- return 1
1462
- fi
1463
1303
  return 0
1464
1304
  fi
1465
1305
 
@@ -1479,10 +1319,6 @@ workflow_checks_pass() {
1479
1319
  echo "Structured checks do not reference current contract $contract_file."
1480
1320
  return 1
1481
1321
  fi
1482
- if [[ -n "$review_file" ]] && ! grep -Fq "\"file\":\"$review_file\"" "$checks_file" && ! grep -Fq "\"file\": \"$review_file\"" "$checks_file"; then
1483
- echo "Structured checks do not reference current review $review_file."
1484
- return 1
1485
- fi
1486
1322
  }
1487
1323
 
1488
1324
  workflow_contract_allows_path() {
@@ -1512,7 +1348,7 @@ workflow_contract_allows_path() {
1512
1348
  section="allowed_paths"
1513
1349
  continue
1514
1350
  ;;
1515
- exit_criteria:|files_exist:|tests_pass:|commands_succeed:|files_contain:|artifacts_exist:|qa_scores:|manual_checks:)
1351
+ exit_criteria:|files_exist:|tests_pass:|commands_succeed:|files_contain:|artifacts_exist:)
1516
1352
  section=""
1517
1353
  continue
1518
1354
  ;;
@@ -47,9 +47,15 @@ case "$tool_name" in
47
47
  ;;
48
48
  esac
49
49
 
50
- if [[ -n "${CODEX_SESSION_ID:-${CODEX_AGENT_NAME:-}}" ]] || [[ "$session_source" =~ [Cc]odex ]]; then
50
+ # An event source is explicit evidence. Inherited host variables are only a
51
+ # fallback for payloads that omit it, such as local compatibility shims.
52
+ if [[ "$session_source" =~ [Cc]odex ]]; then
51
53
  host="codex"
52
- elif [[ -n "${CLAUDE_SESSION_ID:-${CLAUDE_AGENT_NAME:-}}" ]] || [[ "$session_source" =~ [Cc]laude ]]; then
54
+ elif [[ "$session_source" =~ [Cc]laude ]]; then
55
+ host="claude"
56
+ elif [[ -n "${CODEX_SESSION_ID:-${CODEX_AGENT_NAME:-}}" ]]; then
57
+ host="codex"
58
+ elif [[ -n "${CLAUDE_SESSION_ID:-${CLAUDE_AGENT_NAME:-}}" ]]; then
53
59
  host="claude"
54
60
  fi
55
61
 
@@ -79,17 +79,13 @@ is_workflow_surface_path() {
79
79
 
80
80
  edit_plan_gate_mode() {
81
81
  local mode="${FORGE_EDIT_PLAN_GATE:-}"
82
- if [[ -z "$mode" ]]; then
83
- mode="$(workflow_policy_get '.guards.edit_plan_gate' 'advice')"
84
- fi
85
- printf '%s' "$mode"
82
+ [[ -z "$mode" ]] && mode="$(workflow_policy_get '.guards.edit_plan_gate' 'advice')"
83
+ [[ "$mode" == "off" ]] && printf 'off' || printf 'advice'
86
84
  }
87
85
 
88
- # Edit-layer plan gate: the deterministic enforcement point for "no
89
- # implementation edits without an approved plan". The prompt layer only
90
- # advises (natural-language intent guessing is unreliable); this gate keys
91
- # off path + plan state. Modes: advice (default) | enforce | off, via
92
- # FORGE_EDIT_PLAN_GATE or policy .guards.edit_plan_gate.
86
+ # Plan/spec lifecycle is Controller context, never write authorization. This
87
+ # compatibility hook may advise; real enforcement remains path/private-surface,
88
+ # authorization, lease and fencing boundaries.
93
89
  run_edit_plan_gate() {
94
90
  local mode gate_plan gate_status
95
91
  mode="$(edit_plan_gate_mode)"
@@ -99,31 +95,13 @@ run_edit_plan_gate() {
99
95
 
100
96
  if [[ ! -f "docs/spec.md" ]]; then
101
97
  echo "[SpecGuard] Implementation edit without docs/spec.md: $FILE_PATH"
102
- if [[ "$mode" == "advice" ]]; then
103
- echo "[SpecGuard] Advisory: run bash scripts/new-spec.sh and capture stable product intent."
104
- else
105
- hook_structured_error \
106
- "SpecGuard" \
107
- "Implementation edit to $FILE_PATH without docs/spec.md." \
108
- "Run bash scripts/new-spec.sh and capture stable product intent before implementing." \
109
- "missing_artifact"
110
- exit 2
111
- fi
98
+ echo "[SpecGuard] Advisory: capture stable product intent when it materially helps this change."
112
99
  fi
113
100
 
114
101
  gate_plan="$(get_active_plan || true)"
115
102
  if [[ -z "$gate_plan" || ! -f "$gate_plan" ]]; then
116
103
  echo "[PlanStatusGuard] No active plan covers implementation edit: $FILE_PATH"
117
- if [[ "$mode" == "advice" ]]; then
118
- echo "[PlanStatusGuard] Advisory: capture the approved plan with bash scripts/capture-plan.sh --slug <slug> --title <title> --status Approved --execute"
119
- else
120
- hook_structured_error \
121
- "PlanStatusGuard" \
122
- "Implementation edit to $FILE_PATH without an active plan." \
123
- "Capture the approved planning output with bash scripts/capture-plan.sh --slug <slug> --title <title> --status Approved --execute, or set policy .guards.edit_plan_gate to advice/off for this repo." \
124
- "missing_artifact"
125
- exit 2
126
- fi
104
+ echo "[PlanStatusGuard] Advisory: use a Plan only when ChatGPT has chosen staged/dependency coordination."
127
105
  return 0
128
106
  fi
129
107
 
@@ -131,16 +109,7 @@ run_edit_plan_gate() {
131
109
  case "$gate_status" in
132
110
  Draft|Annotating)
133
111
  echo "[PlanStatusGuard] Plan status is '$gate_status' in $gate_plan; implementation edit: $FILE_PATH"
134
- if [[ "$mode" == "advice" ]]; then
135
- echo "[PlanStatusGuard] Advisory: complete the annotation cycle and move the plan to Approved before implementation."
136
- else
137
- hook_structured_error \
138
- "PlanStatusGuard" \
139
- "Implementation edit to $FILE_PATH while plan status is $gate_status in $gate_plan." \
140
- "Complete the annotation cycle and move the plan to Approved before implementation." \
141
- "state_violation"
142
- exit 2
143
- fi
112
+ echo "[PlanStatusGuard] Advisory: this Plan is not execution-ready; ordinary Direct work remains independent."
144
113
  ;;
145
114
  esac
146
115
  }