@moretea-labs/forge 1.8.1 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/AGENTS.md +5 -2
  2. package/CHANGELOG.md +20 -0
  3. package/README.en.md +24 -3
  4. package/README.md +10 -6
  5. package/README.zh-CN.md +5 -3
  6. package/THIRD_PARTY_NOTICES.md +1 -2
  7. package/adapters/chatgpt/browser-delivery-runtime.ts +5 -3
  8. package/adapters/chatgpt/provider-delivery.ts +1 -1
  9. package/adapters/chatgpt/work-conversation-binding-store.ts +20 -1
  10. package/adapters/computer/chatgpt-extension-target.ts +295 -50
  11. package/adapters/computer/chrome-extension/background.js +227 -71
  12. package/adapters/computer/chrome-extension/content.js +181 -157
  13. package/adapters/computer/chrome-extension/manifest.json +3 -1
  14. package/adapters/computer/desktop-operator-provider.ts +18 -6
  15. package/adapters/computer/interaction-target-authority.ts +39 -9
  16. package/adapters/mcp/access-mode.ts +18 -39
  17. package/adapters/mcp/auth.ts +2 -6
  18. package/adapters/mcp/instructions.ts +2 -2
  19. package/adapters/mcp/multi-repository.ts +7 -28
  20. package/adapters/mcp/runtime-gateway/context-adapter.ts +79 -40
  21. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +7 -15
  22. package/adapters/mcp/runtime-gateway/execution-tools.ts +7 -13
  23. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +16 -3
  24. package/adapters/mcp/runtime-gateway/process-tools.ts +3 -21
  25. package/adapters/mcp/runtime-gateway/router.ts +3 -5
  26. package/adapters/mcp/runtime-gateway/routing-policy.ts +17 -10
  27. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1 -1
  28. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +14 -9
  29. package/adapters/mcp/runtime-gateway/runtime-tools.ts +1 -5
  30. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +36 -1
  31. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +58 -4
  32. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +7 -3
  33. package/adapters/mcp/runtime-gateway/work-adapter.ts +16 -16
  34. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +0 -17
  35. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +69 -12
  36. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +26 -2
  37. package/adapters/mcp/server.ts +24 -3
  38. package/adapters/mcp/setup.ts +4 -10
  39. package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
  40. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +672 -2935
  41. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +1 -1
  42. package/adapters/mcp/tool-mapping/repository-tools.ts +52 -86
  43. package/adapters/mcp/toolset-names.ts +11 -42
  44. package/adapters/mcp/toolset.ts +16 -90
  45. package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
  46. package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
  47. package/adapters/mcp/transports/http-observation.ts +18 -6
  48. package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
  49. package/adapters/mcp/transports/http.ts +54 -14
  50. package/adapters/mcp/types.ts +0 -6
  51. package/assets/hooks/lib/session-state.sh +0 -38
  52. package/assets/hooks/post-bash.sh +1 -1
  53. package/assets/hooks/post-tool-observer.sh +0 -5
  54. package/assets/hooks/prompt-guard.sh +0 -55
  55. package/assets/partials/04-project-structure.partial.md +1 -1
  56. package/assets/partials/07-footer.partial.md +1 -1
  57. package/assets/partials-agents/02-operating-mode.partial.md +1 -1
  58. package/assets/partials-agents/08-deep-docs.partial.md +1 -1
  59. package/assets/reference-configs/agentic-development-flow.md +1 -1
  60. package/assets/reference-configs/external-tooling.md +0 -76
  61. package/assets/reference-configs/release-deploy.md +1 -1
  62. package/assets/templates/helpers/architecture-queue.sh +1 -1
  63. package/assets/templates/helpers/check-agent-tooling.sh +1 -327
  64. package/assets/templates/helpers/check-task-workflow.sh +1 -1
  65. package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
  66. package/assets/templates/helpers/migrate-project-template.sh +2 -2
  67. package/assets/workflow-contract.v1.json +0 -2
  68. package/docs/README.md +5 -2
  69. package/docs/architecture/CURRENT.md +114 -30
  70. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
  71. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +15 -2
  72. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +4 -2
  73. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +109 -4
  74. package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
  75. package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
  76. package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
  77. package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
  78. package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
  79. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
  80. package/docs/architecture/domains/public-surface.md +3 -5
  81. package/docs/architecture/domains/verification.md +5 -5
  82. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +2 -2
  83. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
  84. package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
  85. package/docs/forge-plugin-management.md +14 -2
  86. package/docs/operations/controller-browser-plugin.md +23 -0
  87. package/docs/operations/features.md +6 -7
  88. package/docs/operations/features.zh-CN.md +1 -1
  89. package/docs/operations/github-repository.md +4 -4
  90. package/docs/operations/github-semantic-release-projection.md +20 -0
  91. package/docs/operations/homebrew.md +2 -2
  92. package/docs/operations/mcp-tool-exposure.md +13 -54
  93. package/docs/operations/runtime-performance-diagnostics.md +8 -0
  94. package/docs/operations/standalone-disaster-recovery.md +1 -1
  95. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  96. package/docs/tutorials/03-first-repository-task.md +2 -0
  97. package/docs/wiki/Computer-and-Plugins.md +78 -0
  98. package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
  99. package/docs/wiki/Home.md +16 -2
  100. package/docs/wiki/Implementation.md +24 -12
  101. package/docs/wiki/Installation.md +28 -32
  102. package/docs/wiki/Integrations.md +4 -0
  103. package/docs/wiki/Quick-Start.md +35 -22
  104. package/docs/wiki/Releases-and-Upgrades.md +15 -25
  105. package/docs/wiki/_Sidebar.md +5 -1
  106. package/package.json +1 -12
  107. package/packages/kernel/controller/infrastructure/controller-session-store.ts +63 -38
  108. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +10 -0
  109. package/packages/kernel/scheduler/application/eligibility.ts +4 -1
  110. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +13 -10
  111. package/packages/kernel/work/application/work-service.ts +1 -0
  112. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  113. package/packages/kernel/work/domain/state-machine.ts +9 -2
  114. package/packages/kernel/work/infrastructure/work-contract-store.ts +28 -1
  115. package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
  116. package/packages/plugin-runtime/computer/conversation-target.ts +17 -7
  117. package/scripts/assemble-template.ts +11 -72
  118. package/scripts/check-mcp-compatibility.ts +55 -74
  119. package/scripts/check-package-identity.mjs +0 -5
  120. package/scripts/check-runtime-architecture.mjs +305 -28
  121. package/scripts/init-project.sh +0 -46
  122. package/scripts/install-ios-hid-toolchain.sh +60 -0
  123. package/scripts/install-standalone-recovery.ts +1 -1
  124. package/scripts/lib/project-init-lib.sh +3 -3
  125. package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
  126. package/scripts/open-source-audit-allowlist.txt +0 -1
  127. package/scripts/run-governed-gate.ts +2 -0
  128. package/scripts/smoke-ios-physical-device.ts +38 -10
  129. package/scripts/smoke-mcp-http-runtime.ts +7 -8
  130. package/scripts/smoke-mcp-tool-surface.ts +27 -41
  131. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +6 -3
  132. package/scripts/sync-generated-authority.mjs +0 -1
  133. package/src/cli/agent-jobs/executor-health.ts +1 -1
  134. package/src/cli/agent-jobs/integration.ts +2 -2
  135. package/src/cli/chatgpt-browser/file-policy.ts +2 -2
  136. package/src/cli/commands/doctor.ts +1 -143
  137. package/src/cli/commands/global-runtime.ts +3 -196
  138. package/src/cli/commands/init-hook.ts +6 -23
  139. package/src/cli/commands/init.ts +3 -252
  140. package/src/cli/commands/mcp.ts +0 -5
  141. package/src/cli/commands/prompt-guard-decision.ts +0 -2
  142. package/src/cli/commands/recovery.ts +2 -14
  143. package/src/cli/commands/repository.ts +17 -1
  144. package/src/cli/commands/setup-execution.ts +41 -0
  145. package/src/cli/controller/completion-orchestrator.ts +1 -1
  146. package/src/cli/controller/composite-operations.ts +1 -1
  147. package/src/cli/controller/context/instruction-context.ts +1 -1
  148. package/src/cli/controller/context/known-paths.ts +2 -2
  149. package/src/cli/controller/context/query-planning.ts +11 -4
  150. package/src/cli/controller/context/rule-resolution.ts +2 -2
  151. package/src/cli/controller/context/source-materializer.ts +2 -2
  152. package/src/cli/controller/context/structural-provider.ts +84 -0
  153. package/src/cli/controller/context/structural.ts +6 -6
  154. package/src/cli/controller/context/types.ts +8 -9
  155. package/src/cli/controller/context-pack.ts +97 -76
  156. package/src/cli/controller/operational-plan.ts +1 -1
  157. package/src/cli/controller/systemd-user.ts +4 -10
  158. package/src/cli/editing/edit-session.ts +17 -5
  159. package/src/cli/github/github.ts +4 -4
  160. package/src/cli/github/semantic-projection.ts +174 -0
  161. package/src/cli/hook/prompt-intents.ts +0 -9
  162. package/src/cli/index.ts +1 -43
  163. package/src/cli/local-bridge/connector-freshness.ts +1 -12
  164. package/src/cli/local-bridge/console-automations.ts +1 -1
  165. package/src/cli/local-bridge/console-view-models.ts +1 -1
  166. package/src/cli/local-bridge/facade-api.ts +0 -2
  167. package/src/cli/repositories/command-classifier.ts +0 -9
  168. package/src/cli/repositories/command-scope.ts +2 -2
  169. package/src/cli/repositories/locks.ts +20 -0
  170. package/src/cli/repositories/registry.ts +2 -1
  171. package/src/cli/repositories/safe-patch.ts +2 -12
  172. package/src/cli/repositories/structured-git.ts +39 -3
  173. package/src/cli/repository/inspector.ts +185 -343
  174. package/src/effects/process-runner.ts +17 -1
  175. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  176. package/src/runtime/context/semantic-navigation-contract.ts +7 -0
  177. package/src/runtime/context/semantic-navigation.ts +1 -1
  178. package/src/runtime/control-plane/cleanup-artifact-retention.ts +4 -4
  179. package/src/runtime/control-plane/execution/work-delivery-service.ts +150 -31
  180. package/src/runtime/control-plane/execution/work-handle-authority.ts +12 -4
  181. package/src/runtime/control-plane/execution/work-handle-store.ts +53 -1
  182. package/src/runtime/control-plane/execution/work-operation-service.ts +20 -10
  183. package/src/runtime/control-plane/execution/work-preparation-service.ts +108 -4
  184. package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
  185. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +28 -13
  186. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +5 -1
  187. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +1 -1
  188. package/src/runtime/control-plane/facade/capability-registry.ts +2 -0
  189. package/src/runtime/control-plane/facade/work-continuation.ts +1 -1
  190. package/src/runtime/control-plane/generated-cache-retention.ts +114 -63
  191. package/src/runtime/control-plane/global-scheduler/maintenance.ts +20 -8
  192. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +1 -11
  193. package/src/runtime/control-plane/governance/external-effects.ts +1 -1
  194. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +1 -0
  195. package/src/runtime/control-plane/runtime-cleanup.ts +12 -93
  196. package/src/runtime/evidence/sensitive-output.ts +22 -2
  197. package/src/runtime/execution/jobs/child-reference.ts +11 -0
  198. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
  199. package/src/runtime/execution/process-runtime/command-facade.ts +3 -3
  200. package/src/runtime/execution/process-runtime/runtime.ts +20 -16
  201. package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
  202. package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
  203. package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
  204. package/src/runtime/execution/workers/executor.ts +1 -2
  205. package/src/runtime/maintenance/cleanup.ts +41 -5
  206. package/src/runtime/plugins/action-application.ts +12 -1
  207. package/src/runtime/plugins/app-store-connect-adapter.ts +252 -4
  208. package/src/runtime/plugins/browser-adapter.ts +381 -313
  209. package/src/runtime/plugins/browser-macos-bridge.ts +114 -112
  210. package/src/runtime/plugins/browser-manifest-surface.ts +2 -1
  211. package/src/runtime/plugins/browser-registration.ts +2 -0
  212. package/src/runtime/plugins/browser-runtime.ts +26 -35
  213. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +11 -2
  214. package/src/runtime/plugins/computer-registration.ts +76 -9
  215. package/src/runtime/plugins/github-adapter.ts +30 -3
  216. package/src/runtime/plugins/gmail-adapter.ts +166 -1
  217. package/src/runtime/plugins/google-shared.ts +10 -5
  218. package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
  219. package/src/runtime/plugins/ios-adapter.ts +45 -40
  220. package/src/runtime/plugins/ios-agent-device.ts +54 -4
  221. package/src/runtime/plugins/ios-device-ownership.ts +103 -0
  222. package/src/runtime/plugins/ios-physical-device.ts +497 -79
  223. package/src/runtime/plugins/local-system-adapter.ts +1 -99
  224. package/src/runtime/plugins/store.ts +80 -7
  225. package/src/runtime/plugins/types.ts +4 -0
  226. package/src/runtime/projections/git-status-sampler.ts +2 -19
  227. package/src/runtime/recovery/actions.ts +1 -1
  228. package/src/runtime/recovery/lifecycle-inventory.ts +1 -11
  229. package/src/runtime/recovery/probe.ts +2 -2
  230. package/src/runtime/release/release-coordinator.ts +20 -4
  231. package/src/runtime/root/controller-progression-composition.ts +67 -5
  232. package/src/runtime/root/package-connector-service.ts +123 -11
  233. package/src/runtime/root/package-runtime-release.ts +6 -18
  234. package/src/runtime/root/package-runtime-service.ts +7 -13
  235. package/src/runtime/root/release-execution-canary.ts +18 -5
  236. package/src/runtime/root/release-manifest.ts +0 -34
  237. package/src/runtime/root/release-materialize.ts +0 -78
  238. package/src/runtime/root/runtime.ts +1 -2
  239. package/src/runtime/root/scheduled-controller-composition.ts +2 -1
  240. package/src/runtime/root/service.ts +90 -11
  241. package/src/runtime/root/types.ts +0 -6
  242. package/src/runtime/root/workflow-supervisor-composition.ts +207 -19
  243. package/src/runtime/root/workflow-supervisor-runtime.ts +365 -10
  244. package/src/runtime/safe-tooling/google-credential-store.ts +1 -11
  245. package/src/runtime/safe-tooling/ios-development.ts +22 -8
  246. package/src/runtime/safe-tooling/job-summary.ts +1 -1
  247. package/src/runtime/safe-tooling/workspace-auth.ts +4 -1
  248. package/src/runtime/shared/atomic-text-file.ts +21 -0
  249. package/src/runtime/shared/json-files.ts +8 -3
  250. package/src/runtime/standalone-recovery/core.ts +189 -174
  251. package/src/runtime/standalone-recovery/entry.ts +62 -30
  252. package/src/runtime/standalone-recovery/operation-lock.ts +11 -1
  253. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +1 -0
  254. package/src/runtime/workflow/schedules/engine.ts +36 -14
  255. package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
  256. package/src/runtime/workflow/schedules/work-continuation.ts +51 -6
  257. package/supervisor/client.ts +31 -14
  258. package/supervisor/control-plane.ts +210 -115
  259. package/supervisor/forge-validators.ts +88 -21
  260. package/supervisor/native-browser-adapter.ts +393 -28
  261. package/supervisor/native-messaging/host.ts +21 -2
  262. package/supervisor/protocol.ts +74 -26
  263. package/supervisor/server.ts +16 -8
  264. package/supervisor/store.ts +476 -57
  265. package/supervisor/types.ts +19 -13
  266. package/SKILL.md +0 -427
  267. package/adapters/computer/chatgpt-target-router.ts +0 -103
  268. package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +0 -87
  269. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
  270. package/adapters/mcp/toolset-selection.ts +0 -41
  271. package/agents/openai.yaml +0 -4
  272. package/assets/skill-hooks.json +0 -41
  273. package/assets/skill-version.json +0 -189
  274. package/assets/skills/claude-review/SKILL.md +0 -231
  275. package/assets/skills/codex-review/SKILL.md +0 -103
  276. package/assets/templates/helpers/check-skill-version.ts +0 -193
  277. package/scripts/check-skill-version.ts +0 -5
  278. package/scripts/ensure-codegraph.sh +0 -16
  279. package/scripts/run-skill-hook.ts +0 -244
  280. package/scripts/sync-codex-installed-copies.sh +0 -182
  281. package/src/cli/commands/tools.ts +0 -167
  282. package/src/cli/mcp/access-mode.ts +0 -2
  283. package/src/cli/mcp/access-tools.ts +0 -2
  284. package/src/cli/mcp/audit.ts +0 -2
  285. package/src/cli/mcp/auth.ts +0 -2
  286. package/src/cli/mcp/instructions.ts +0 -2
  287. package/src/cli/mcp/legacy-context.ts +0 -2
  288. package/src/cli/mcp/legacy-tool-service.ts +0 -2
  289. package/src/cli/mcp/multi-repository.ts +0 -2
  290. package/src/cli/mcp/oauth.ts +0 -2
  291. package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
  292. package/src/cli/mcp/paths.ts +0 -2
  293. package/src/cli/mcp/policy.ts +0 -2
  294. package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
  295. package/src/cli/mcp/proxy-env.ts +0 -2
  296. package/src/cli/mcp/readiness-projection.ts +0 -2
  297. package/src/cli/mcp/redaction.ts +0 -2
  298. package/src/cli/mcp/repo.ts +0 -2
  299. package/src/cli/mcp/repository-tools.ts +0 -2
  300. package/src/cli/mcp/server.ts +0 -2
  301. package/src/cli/mcp/setup.ts +0 -2
  302. package/src/cli/mcp/tool-capability-cache.ts +0 -2
  303. package/src/cli/mcp/tool-contract.ts +0 -2
  304. package/src/cli/mcp/tools.ts +0 -2
  305. package/src/cli/mcp/toolset-names.ts +0 -2
  306. package/src/cli/mcp/toolset-selection.ts +0 -2
  307. package/src/cli/mcp/toolset.ts +0 -2
  308. package/src/cli/mcp/transports/http.ts +0 -2
  309. package/src/cli/mcp/transports/session-registry.ts +0 -2
  310. package/src/cli/mcp/transports/stdio.ts +0 -2
  311. package/src/cli/mcp/types.ts +0 -2
  312. package/src/cli/mcp/umbrella-tools.ts +0 -2
  313. package/src/cli/tools/codegraph.ts +0 -695
  314. package/src/core/adoption/helper-wrapper-plan.ts +0 -159
  315. package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
  316. package/src/runtime/context/codegraph-read-provider.ts +0 -611
  317. package/src/runtime/context/codegraph-sidecar.cjs +0 -248
  318. package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
  319. package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
  320. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
  321. package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
  322. package/src/runtime/gateway/mcp/process-tools.ts +0 -2
  323. package/src/runtime/gateway/mcp/router.ts +0 -2
  324. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
  325. package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
  326. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
  327. package/src/runtime/plugins/browser-provider-registry.ts +0 -2
  328. package/src/runtime/plugins/computer-chatgpt-macos-target.ts +0 -891
@@ -50,6 +50,48 @@ The provider release is independently versioned from the Forge Runtime release a
50
50
 
51
51
  `interactionMayOwnTarget()` and the target-alias rules are the current migration fence: old records that cannot prove they refer to a different phone fail closed rather than allowing CoreDevice and agent-device to acquire the same device concurrently.
52
52
 
53
+ ## 2026-10-16 pre-migration stabilization
54
+
55
+ Before T10 service extraction, the in-process implementation now closes the highest-risk ownership/lifecycle gaps without introducing a second provider:
56
+
57
+ - physical iPhone ownership uses one Controller-global lock keyed by the hardware UDID shared by CoreDevice and XCTest (not CoreDevice's transport-local identifier), so neither provider nor repository scope can create a second mutation owner;
58
+ - active same-app CoreDevice interactions are reusable and their device ownership lease is renewed by activity; Runtime restart can reclaim an unexpired session after the previous owner process dies;
59
+ - physical mutation actions execute in the Forge Runtime so the RemoteXPC/HID worker can persist across consecutive actions instead of being recreated by every lightweight action process;
60
+ - agent-device physical actions share the same exact-device fence, while Simulator remains outside the physical-device ownership domain;
61
+ - plugin discovery includes the current repository overlay when a repository context is already selected, and iOS health reports development and physical-device readiness independently rather than treating Xcode/Simulator readiness as the physical-phone health authority.
62
+
63
+ These are stabilization changes to the existing ownership boundary, not a new iOS-specific control plane. T10/T11 remain responsible for moving live provider/transport handles behind the independently operated `ios-device` service.
64
+
65
+ ### Low-round-trip observe / act / observe (2026-10-16)
66
+
67
+ Measured real-device CoreDevice launch and screenshot calls are each on the order of 1 second, while complete navigation is dominated by multiple controller/tool/model turns. Reduce the **number of round trips**, not the number of foreground safety checks:
68
+
69
+ - `physical_device_open({ observe_after_open: true })` and same-app session reuse optionally capture an initial screenshot in the same action; launch status is still not proof of foreground.
70
+ - After independently inspecting the actual screenshot, `physical_device_confirm_foreground({ interaction_id, observation_id, bundle_id })` explicitly binds the target app. Only then may `physical_device_batch({ observation_id, steps, capture_after: true })` perform bounded input and capture the next screenshot. An observation ID alone never confirms the app; every subsequent captured screenshot requires its own confirmation. No unknown mutation is replayed.
71
+ - `physical_device_observed_tap/swipe({ observation_id, ..., capture_after: true })` supports the same fused follow-up screenshot for system UI navigation.
72
+ - All three variants call the **existing CoreDevice screenshot implementation**; no second image provider, autonomous app navigation engine, device state store, or XCUITest runner is introduced. Optional capture returns the same bounded Controller-owned PNG artifact.
73
+ - If an input succeeds but the follow-up screenshot fails, return `postActionCapture.status=failed`, `mutationAlreadyApplied=true`, and allow **only** a new screenshot. Never retry the tap, swipe, or batch merely because screenshot failed.
74
+
75
+ The optimization should be judged by real elapsed *open → observe → input → observe* time, tool-round-trip count and same-device correctness; unit tests and device readiness are necessary but not sufficient proof of shopping-app E2E reliability.
76
+
77
+ ### 2026-10-16 RemoteXPC HID toolchain correction
78
+
79
+ The paired iPhone 17 (iOS 27.0.1) accepted JD launch and screenshot observation, but the Unicode search path failed at `pasteboard_set_text` with `IncompleteReadError: 0 bytes read on a total of 9 expected bytes`. The input ledger marked the clipboard write as dispatched, so the failed input was not replayed.
80
+
81
+ The existing worker correctly uses a single pasteboard connection for snapshot, write, and restoration. `pymobiledevice3 10.2.1` numbers consecutive RemoteXPC reply-bearing requests incorrectly; inspecting `11.24.0` establishes an odd-message-ID correction and the required HID/pasteboard exports are compatible. Pin the single Controller-owned toolchain to `11.24.0` rather than adding a second transport or local protocol workaround. Offline verification of this candidate does not constitute live iPhone Unicode input acceptance or authorize runtime activation.
82
+
83
+ ### Unified Computer ingress (2026-10-16)
84
+
85
+ Physical CoreDevice action descriptors, scopes and exact-phone authorization are exposed through the existing `computer` plugin. They delegate to the unchanged `ios-physical-device` executor and Controller-global UDID lock. The `ios` plugin retains iOS development, Simulator, and explicit agent-device/XCTest actions but no longer advertises CoreDevice app actions; the old `executeIosPluginAction` direct physical-device dispatch is retired and fails before any CoreDevice effect. The public typed action route remains `plugin_action_execute`; this introduces no second device provider, transport, session store, or replay authority. Existing `ios-device` interaction identity and target verification are unchanged.
86
+
87
+ ### Physical foreground drift witnessed during source acceptance
88
+
89
+ A source-side JD acceptance opened and observed the correct iPhone App through `computer` and the existing CoreDevice provider, but a later script captured a *new, unreviewed* screenshot and applied coordinates derived from an earlier JD image. The device foreground had meanwhile changed to the user's ChatGPT App. The observed tap succeeded against that other App, so **fresh observation IDs alone are not foreground identity proof**. The root control failure also existed in `physical_device_batch`, where supplying `observation_id` bypassed explicit foreground confirmation; this path now fails closed until `physical_device_confirm_foreground` has bound the same observation and bundle. The session was closed by exact interaction ID and its global device lock was released; no further text input was sent. Do not replay the tap. The next app-specific attempt must separate model-reviewed observation from mutation, use the established `physical_device_confirm_foreground` authority for in-app gestures, and abort if user foreground changes. The live 11.24.0 HID tap is verified, but Unicode clipboard input, shopping SKU prices and personal medical document export are not. Standalone smoke tests must stop their retained HID worker, or their process can time out despite completing the CoreDevice open and screenshot.
90
+
91
+ ### Explicitly approved app-document access
92
+
93
+ The Computer plugin exposes CoreDevice app-document filenames and single-file exports only for the exact owned iPhone/app interaction, with independent strong confirmations. CoreDevice `appDataContainer/Documents` is not universal iPhone Files, iCloud or hospital data access. Exports are bounded private Controller artifacts verified by size and SHA-256, with no additional transport, writer, cloud upload or deletion. Actual medical documents remain unverified until the device is connected, consent is supplied and file evidence succeeds.
94
+
53
95
  ## Existing module migration map
54
96
 
55
97
  `KEEP` means the responsibility stays in Forge. `MOVE` means the responsibility belongs in the independent `ios-device` provider. `REWRITE` means the current in-process module is useful evidence/behavior but is not itself the final service boundary. `DELETE` is conditional on the stated removal criterion.
@@ -133,7 +133,19 @@ from isolated B. `cutover_eligible` is impossible while A and B collide on Home
133
133
  or port. Before the first production activation, a transient failure to obtain a
134
134
  fresh Stable A verification leaves the same ReleaseSession `cutover_eligible` so
135
135
  the exact candidate can be retried after observation recovers; proven Stable A
136
- identity drift is a real precondition failure. `cutover_attempting` permits
136
+ identity drift is a real precondition failure. After those exact pre-cutover
137
+ checks and immutable Candidate promotion, Recovery may arm a bounded mechanical
138
+ drain marker in the existing Package Connector service root. The marker is tied
139
+ to the exact serving Stable A Connector generation (`releaseId`, `installedAt`,
140
+ and endpoint) plus the Recovery owner lifetime; that generation rejects new MCP
141
+ POST/stream admission with retryable 503 while already-admitted responses,
142
+ initialization and the existing session-idle window drain. The zero-active
143
+ request/stream gate is unchanged. A Candidate or rollback Connector rebind
144
+ changes the service generation before strict MCP verification, so the
145
+ replacement process is not trapped behind the predecessor marker. Recovery
146
+ clears the marker on every cutover exit; owner-liveness and TTL checks bound any
147
+ orphaned marker. This marker is transport fencing only, not ReleaseSession
148
+ state, release intent or another lifecycle owner. `cutover_attempting` permits
137
149
  exactly one fenced production cutover; verified return to exact A terminalizes
138
150
  `rolled_back` and is never retried. If observation is interrupted after the
139
151
  rollback authority commit but before the ReleaseSession phase write,
@@ -194,7 +206,7 @@ summaries, never tokens, raw database payloads or browser messages.
194
206
  | known-good bundle | Standalone Recovery | bounded live attestations; prune only after state commit | validate release + DB + service contract offline |
195
207
  | RuntimeReleaseAuthority | Runtime Root physical release store | schema 2; active/previous release identity and previous SQLite backup only | physical publish/rollback; no release-phase or transaction intent |
196
208
  | ReleaseSession | Release domain / stateless ReleaseCoordinator | wire schema 1 + current semantic epoch 2; `known_good`, `rolled_back`, `failed`; bounded session retention is physical cleanup | revision CAS resumes the same session; Recovery provider executes physical effects |
197
- | Candidate B Home | ReleaseSession semantic authority / Recovery physical provider | explicit terminal cleanup only after evidence retention | no deletion/rebuild of A; B can be inspected independently |
209
+ | Candidate B Home | ReleaseSession semantic authority / Recovery physical provider | explicit retired cleanup after evidence retention; soaking and terminal sessions are physically reclaimable only after candidate owner quiescence | no deletion/rebuild of A; B can be inspected independently |
198
210
  | Process Runtime terminal lease | Process Runtime lease authority | terminal evidence and lease release are separate idempotent phases | terminal observation/wait/cancel and full maintenance retry exact lease release until settled |
199
211
 
200
212
  All bundle and session data is local Controller state. It contains no secrets:
@@ -218,4 +230,5 @@ the service contract records a token *path*, while each B token is an independen
218
230
  - no-op automatic reconciliation does not fork a Recovery worker, and terminal source revisions are not autonomously replayed;
219
231
  - definitive runaway-CPU rejection restores Stable A through the existing ReleaseSession rollback authority rather than repeating soak measurement;
220
232
  - terminal Process observation and full maintenance both reconcile any exact leftover workspace lease; `completed_unknown` cannot permanently fence a checkout;
233
+ - periodic Runtime maintenance is the production retention caller; its rotating removal phase reaches release history without starving the other cleanup classes, while committed Runtime authority protects active/previous release trees, the serving Connector release and the previous rollback SQLite backup; historical known-good evidence alone does not pin release trees;
221
234
  - final live release testing remains a separate, one-shot governed operation.
@@ -26,7 +26,9 @@ No Runtime/Recovery release transition is part of this decision.
26
26
 
27
27
  ## Thin capability substrate consolidation (2026-09-24)
28
28
 
29
- ### 0. Execution target and host-local command lane (2026-09-26, Slice 2 partial)
29
+ ### 0. Execution target and host-local command lane (historical 2026-09-26 Slice 2)
30
+
31
+ **Command entrypoints superseded on 2026-10-15 by `1861b541d`.** The only model-visible general terminal tool is `execute_command`, defaulting to repository/workspace placement with explicit `scope=host` subject to the original `process:exec` Grant. `dry_run=true` replaces separate preview; process lifecycle tools attach to handles. The old `repository_command_execute`, `process_exec`, `work_execute`, `repository_command_preview` and the `local_system` generic command action are no longer public. The bullets below record the historical slice, **not current tool-selection guidance**. Canonical entry and gates: `adapters/mcp/tool-mapping/repository-tools.ts`, `adapters/mcp/server.ts`, `adapters/mcp/toolset-names.ts`, `scripts/check-runtime-architecture.mjs`.
30
32
 
31
33
  - `ProcessScope` is the canonical Process/Operation storage scope. Repository placement is optional context; the ForgeInstance scope is a sibling partition (`<controllerHome>/instance`) so a non-repository process never needs a synthetic repository identity.
32
34
  - The Process Runtime owns an instance-level handle index (`process_handle_index`) recording processId -> target (`forge_instance` | `repository`) -> principal. Attachment resolves its target from the handle, never by scanning repositories or replaying placement inputs.
@@ -39,7 +41,7 @@ No Runtime/Recovery release transition is part of this decision.
39
41
  - Done — semantic storage identity (Slice 1 remainder): Requirement was already ForgeInstance-scoped (`scope: 'controller'`). Plan is repository-optional: `PlanContract.repoId` (and its revision/summary/input carriers) is optional provenance, `PlanContractStoreLocation` accepts a portable `scopeKey` (`semantic` is the reserved ForgeInstance scope, mirroring the workspace/instance partitions), and `plan_create` with zero enabled repositories creates the Plan in that scope — one repository stays authoritative, several keep the explicit ambiguity error. Plan and Work were already resolvable by stable id across scopes without a repository (`findControlPlaneRecordsByKey`). Work remains repository-bound on purpose: its execution semantics (WorkHandle, leases, checkout/delivery) have no meaning without a target, so its `repoId` is not a fake identity. `rh_status` is now instance-scoped: with zero or several repositories the summary resolves no repository target, reports `repositoryContext: null`, keeps runtime/tool-surface/source-coherence readiness, lists active Plans from the semantic scope, reports Work/handoff sections as unavailable rather than inventing a repository, downgrades `detail_level: detail` to the instance summary (reporting `requestedDetailLevel`), and fails closed with `REPOSITORY_CONTEXT_REQUIRED_FOR_REPAIR`/`..._FOR_DETAIL` only where repository context is genuinely required. `rh_inbox` (legacy Handoff) stays repository-scoped until Slice 7 replaces it with UserRequest.
40
42
  - Done — ephemeral workspace scope and typed command target: `workspace_*` is a reserved workspace scope key (`controller-home.ts` `WORKSPACE_SCOPE_PREFIX`/`scopedOperationRoot`). An arbitrary workspace is now a `RepositoryCommandScopeTarget` (`workspaceScopeKey` + root + workspace checkout coordinate) instead of a fabricated `RepositoryRecord`; `resolveEphemeralWorkspaceTarget` no longer builds a repository record. Process/Operation records, lightweight receipts, logs, GC, handle-index targets, command audit, git-command audit, access policy, approval requests, work-handle mirrors and execution leases for a workspace target live in `<controllerHome>/workspaces/<workspaceId>`, and attachment resolves by handle or by the workspace id. Repository and `__controller__` scopes keep their established roots and payload fields byte-for-byte; repository-semantic checks (bound-session mutation, default-branch delivery, work-handle authority, `repositoryGitStatus`) now run only when a repository target exists. Workspace preview/execute payloads report `scopeId` + `workspace` and never a `repoId`. Bounded read-only fallbacks still resolve facts written to the old repository location (process records, lightweight receipts, access policy, approval requests). Residual: `ResolvedExecutionIdentity.repositoryId` still carries the workspace scope key as its required field name, and the controller lock scope key for a workspace is still spelled `{ scope: 'repository', repoId }`; both are naming/typing debt rather than repository identity or repository storage. Repository-semantic behavior for a workspace target (mutation authority, delivery guards) is now explicitly "not applicable" rather than evaluated against a fabricated repository.
41
43
  - Open obligation — Grant target matching: exact matching with explicit wildcard only is blocked by `PluginCapabilityAuthorizationGrant.repoId` and `target.identityFingerprint` being optional while plugin queries always normalize `repoId`. Making matching exact requires migrating the stored plugin grants and the query normalization together; tightening only `grant-store.ts` would deny live plugin capabilities.
42
- - Still open in this slice: generalizing the durable Process/result/artifact/evidence stores to domain-handle scope, making `repository_command_execute` a translation-only facade over the host lane, and the instance-scoped recovery *apply* split (its audit record and several repository-repair actions still require RepositoryContext).
44
+ - Historical remaining items: generalizing durable Process/result/artifact/evidence stores to domain-handle scope and the instance-scoped recovery *apply* split (its audit record and several repository-repair actions still require RepositoryContext). The earlier `repository_command_execute` facade proposal was retired rather than preserved as another execution layer; the single `execute_command` uses the existing Process Runtime.
43
45
 
44
46
  ### 1. Mode-free capability surface
45
47
  - Capabilities (`read`, `search`, `edit`, `command`, `process`, `git`, `workspace`, `browser`, `computer`, `plugin`, `API`, `agent`, `schedule`, `release`, `recovery`) remain domain-shaped public capabilities and compose without mandatory Requirement, Plan, Work, task-size thresholds, or mode tokens.
@@ -9,6 +9,8 @@ monitors its exact provider effect, commits the model's structured receipt, and
9
9
  reserves the next fixed prompt for CONTINUE. DONE and NEEDS_USER retain their
10
10
  configured semantic validators; STOPPED remains explicit operator authority.
11
11
 
12
+ The Supervisor Effect prompt carries immutable task identity, outcome objective and terminal receipt; it is not a per-turn checklist, execution-time budget, or reason to perform a status probe before work. Ordinary CONTINUE turns should resume substantive work for as long as safe, useful actions remain. A terminal C receipt is a protocol acknowledgment, not evidence of productive progress; observed tool calls and deliverables are separate evidence. JSON metadata and Project instructions do not grant a missing ChatGPT App capability.
13
+
12
14
  The first Work-bound enrollment still requires authenticated launcher admission,
13
15
  canonical Work lookup and a prepared ControllerRound. Before consulting that lower
14
16
  admission gate, the Runtime checks whether the exact conversation already has a
@@ -50,7 +52,7 @@ orphan deletion, a new relay index, or a second cleanup lifecycle.
50
52
  | Evidence / privacy | Existing causal completion hashes, allowlisted provider evidence and redaction; no page-body persistence added. |
51
53
  | Capacity / time / performance | Existing send lane, bounded scanner and observation budgets. Provider-wide inventory/backpressure may delay the consumer globally; exact-conversation target failures are task-local and cannot back off unrelated Supervisor tasks. |
52
54
  | Topology / portability | Same in-process Runtime/Supervisor owner and native Browser adapter; no process, credential flow or platform dependency added. |
53
- | Release / rollback | ReleaseSession verifies isolated Candidate B, then cutover retains rollback authority during soak. The new Stable release cannot become known-good until the Supervisor ledger proves exact-active-release CONTINUE → CONTINUE → DONE across a Runtime reconnect. No component activation or manual live database repair. |
55
+ | Release / rollback | ReleaseSession verifies isolated Candidate B, then cutover retains rollback authority during soak. The new Stable release cannot become known-good until the canonical Supervisor ledger proves a causal CONTINUE → CONTINUE → DONE on the exact active release: one dispatch and applied receipt per source effect, terminal_done after the third assistant_completion, and at least two Runtime incarnations. A bounded disposable acceptance task supplies this proof; long-running production Work need not terminate. Historical receipts before the active-release boundary never qualify. No component activation or manual live database repair. |
54
56
 
55
57
  ## Predecessor obligations
56
58
 
@@ -116,6 +118,29 @@ DONE, NEEDS_USER and explicit STOPPED retire owned resources; after restart the
116
118
  same owner reconstructs ownership from exact task identity and window.name.
117
119
  An adopted user tab loses only the Supervisor marker and stays open.
118
120
 
121
+ An operator-STOPPED bootstrap may have written an entire machine-authored effect to a
122
+ Project composer without clicking Send. A subsequent bootstrap for that **same Project**
123
+ may replace the residue only if the canonical Supervisor ledger proves the prior task is
124
+ STOPPED, the prior effect has zero dispatch generations, and its last pre-Send failure
125
+ durably attests that exact, single visible editor (classification=current_effect,
126
+ send_clicked=false, matching full text length and SHA-256 fingerprint). The permitted editor payload must either match the canonical
127
+ immutable effect bytes exactly or match that persisted pre-Send observation's
128
+ full length and fingerprint exactly. This dual exact check handles a corrected
129
+ ProseMirror reader that no longer synthesizes layout newlines inside auto-linked
130
+ URLs, without ignoring any other whitespace or allowing arbitrary human edits.
131
+ New observations reconstruct text from the direct ProseMirror paragraphs' text
132
+ nodes rather than CSS-rendered layout text. The sole Chrome extension
133
+ rechecks the stopped effect marker and a fresh exact editor fingerprint immediately
134
+ before its prepare-only replacement. If ChatGPT hydrates this exact STOPPED-owned draft
135
+ after the first bootstrap snapshot, the same pinned Computer target may obtain
136
+ one fresh read-only observation following a `composer_not_empty` prepare refusal
137
+ and attempt exactly one guarded second **prepare**, still before any Send
138
+ generation. Unknown mutation, foreign text or missing precise evidence remain
139
+ blocked; no task, effect or provider is duplicated. This grants no replay or
140
+ new provider authority. Ambiguous/applied/possibly-sent effects, user or foreign drafts,
141
+ and a generating assistant always fail closed. A successful prepare still requires the
142
+ normal exact-effect Send and completion checks; never count typing as delivery.
143
+
119
144
  When delivery or read-only observation is due, complete supported-browser
120
145
  inventory must prove the exact enrolled conversation absent before the owner
121
146
  opens its persisted conversation URL. An unreadable inventory, foreign owner,
@@ -215,9 +240,25 @@ Newly rendered Supervisor prompts use the typed outer automation metadata alread
215
240
  present on Forge tools: exact `automation_task_id`,
216
241
  `automation_type=autonomous_continuation`, and `automation_status`. Intermediate
217
242
  calls use `working`; the final Forge call for the turn uses `continue`, `done` or
218
- `needs_user`. Receipt processing still derives the exact source effect from the
219
- canonical Supervisor task and reserves the successor transactionally; tool payloads
220
- do not choose another task/effect/conversation. The historical
243
+ `needs_user`. The provider-facing continuation is intentionally close to a
244
+ human "continue working" request: the model reads the previous result and
245
+ live project evidence, chooses useful actions and keeps executing while meaningful
246
+ authorized work remains. It does not prescribe an existing Work, checkout,
247
+ sequence or phase as a mandatory path, nor treat one successful check or tool
248
+ call as completion. Parallel user and autonomous efforts may share an outcome
249
+ without sharing a Work; models assess ownership and live source evidence,
250
+ while Forge enforces mechanical writer/resource boundaries at execution. The
251
+ prompt discourages repeated status-only rounds and requests actual results and
252
+ remaining gaps. This is model guidance, not a semantic scoring gate, new state
253
+ store or second Work/progress authority. An `automation:*` or `receipt:*` causal checkpoint
254
+ is retained in the durable completion ledger but omitted from model-facing
255
+ `continuity.summary`: it is a transport reference, not an engineering handoff.
256
+ Meaningful non-receipt checkpoints and recovery/correction reasons remain
257
+ bounded advisory context. No elapsed-time quota, forced operation count,
258
+ semantic scoring gate, extra state store, or new lifecycle authority is added.
259
+ Receipt processing still derives the exact source effect from the canonical
260
+ Supervisor task and reserves the successor transactionally; tool payloads do
261
+ not choose another task/effect/conversation. The historical
221
262
  `rh_work repair` / `automation.receipt:*` parser remains a bounded migration reader
222
263
  only for prompts already issued before cutover and must not be used by new prompt
223
264
  producers or become a second replay authority.
@@ -235,3 +276,67 @@ scenarios. Whole-Runtime activation follows canonical gates; actual productive
235
276
  successive turns remain separate live acceptance evidence. Original exhausted
236
277
  records are preserved and may only receive the existing explicit operator
237
278
  recovery after the exact provider turn is proven settled or failed.
279
+
280
+ ## Chrome attachment continuity (20261015)
281
+
282
+ Computer owns browser/profile selection and tab attachments. The extension keeps
283
+ one random provider instance id in `chrome.storage.local`, scoped by Chrome to
284
+ that extension/profile. Worker suspension, extension reload and browser restart
285
+ therefore preserve profile identity. The id is removed on extension uninstall;
286
+ there is no task/effect state, credential, URL, or conversation content in this
287
+ cache. The existing Computer Controller authority remains the only durable
288
+ attachment writer. The extension owns only this constant-size transport identity,
289
+ requires the standard storage permission and grants no new host access. Discovery
290
+ and target-command heartbeats derive their source identity from this same
291
+ persisted profile id; a worker restart must not orphan discovery or change
292
+ the physical-tab binding. See the
293
+ [Chrome storage contract](https://developer.chrome.com/docs/extensions/reference/api/storage#storage_areas).
294
+
295
+ The native Browser primitive treats Runtime's process lookup as liveness
296
+ only. Desktop Operator exclusively establishes exact Chrome GUI PID and Tab ID
297
+ authority through ScriptingBridge and revalidates bundle/executable identity.
298
+ Independent headless Chrome roots may coexist; zero or multiple GUI roots fail
299
+ closed in Desktop Operator before Apple Events. Runtime must not re-implement
300
+ process selection by counting every pgrep match or fall back to another
301
+ provider.
302
+
303
+ A missing pinned profile stays unavailable even when another profile is the sole
304
+ live provider. Within the same profile, Chrome tab id takes precedence over
305
+ window id so moving a tab between windows preserves attachment. An existing pin
306
+ at another conversation URL is identity drift. Only a positive Chrome tab-missing
307
+ result permits recovery through complete exact-conversation inventory: reuse the
308
+ unique existing conversation tab, or reopen the persisted conversation URL when
309
+ absent. This preserves the existing disposable-resource restoration rule without
310
+ creating a new ChatGPT conversation. Ambiguous matches and unreadable inventory
311
+ remain unresolved; they do not authorize profile replacement or another tab.
312
+ Bootstrap recovery still requires the same live provider's positive missing-tab
313
+ proof and the existing Computer binding CAS.
314
+
315
+ Tab creation and conversation hydration are separate outcomes. An ensure failure
316
+ may return its exact physical attachment alongside the error. The existing
317
+ Computer surface lease stores that attachment before reporting failure; page
318
+ readiness and Send remain unavailable. A subsequent worker uses that binding
319
+ instead of creating another Project tab. Claimed commands without a result stay
320
+ unknown and cannot authorize provider fallback or another tab creation. The
321
+ optional failure binding is backward compatible; only updated extensions supply
322
+ it. No database schema, lifecycle, process, retry budget, external send, or second
323
+ writer is added. Existing leases, redacted receipts, task terminalization,
324
+ tombstone retention, backpressure and unknown-effect fences remain. Complete
325
+ Runtime release/rollback includes the adapter contract and matching extension.
326
+
327
+ Incident evidence: read-only Runtime calls on 2026-10-15 observed 188 historical
328
+ Supervisor tasks and zero active tasks; recent retrieved acceptance tasks were
329
+ terminal. That inventory is not evidence of current autonomous sends. Computer
330
+ reported 227 saved records, 221 unverified and six dead native records; metadata
331
+ is not proof of a live tab. Existing discovery stays observation-only and never
332
+ enrolls historical conversations. A source reproduction combined unavailable
333
+ content scripts with worker restart: the old code changed instance id, returned
334
+ no binding, and created two tabs for one bootstrap key. The candidate retained
335
+ one instance and returned the failed page's binding, keeping one tab and sending
336
+ nothing. A separate Controller probe verified failed-binding persistence, broker
337
+ restart reuse and no commands to a foreign profile. These are bounded adapter
338
+ facts; live release acceptance remains separate.
339
+
340
+ ### Live Chrome content contract at Bootstrap
341
+
342
+ A projected Chrome extension on disk is not evidence that an existing Chrome tab has loaded the same content script. Before Supervisor consumes an exact, single-use authorization to back up and replace an unrelated Project composer draft, the actual pinned tab must attest `composerReplacementContract=exact-backed-up-project-draft-v1` in its read-only snapshot. An absent attestation is a task-local `COMPUTER_CHATGPT_BOOTSTRAP_LOADED_SCRIPT_STALE` pre-send failure, not permission to clear the editor, switch providers, create a replacement tab, or record Send. The Chrome background independently checks this exact-tab capability when preparing a guarded draft replacement. The original draft and one-use authorization remain intact when the loaded script is stale; after reloading the extension, the original unspent effect may be rearmed only within its existing bounded operator-retry contract. Projection checks and MCP health cannot substitute for this live evidence. Final release acceptance still requires independent actual multi-turn work to DONE.
@@ -0,0 +1,19 @@
1
+ # Exact code-symbol discovery within bounded Context retrieval
2
+
3
+ `docs/architecture/CURRENT.md` remains the sole architecture authority. This note records a focused Context Plane implementation decision and test contract; it adds no store, cache, result state, or secondary search authority.
4
+
5
+ ## Observed defect
6
+
7
+ A request containing two exact source symbols could split them into common word fragments or treat both as one literal query. Early broad matches then filled the candidate window and prevented later exact hits from entering. Separately, the Git inventory's alphabetic first-800-file cap made files beyond that prefix unsearchable by the lexical pass. Increasing the scan cap would add disk/CPU cost without fixing symbol priority.
8
+
9
+ ## Existing-authority correction
10
+
11
+ - Parse explicit code-shaped tokens into independent bounded exact queries. Preserve caller-provided ordinary literal phrases (`return 42`) as search queries as well. Keep camel-case fragments as nonbinding discovery hints, not mandatory matches.
12
+ - Preserve later exact hits when broad candidate capacity is reached, and reserve the highest-ranked candidate for each matched exact symbol before ordinary ranked results.
13
+ - Use Git's read-only tracked-file grep only to **prioritize candidate paths** when the inventory exceeds the existing scan cap. The original policy-checked repository source matcher validates each file and enforces exact identifier boundaries. Git grep supplies no policy, semantic completion, persistence, or source identity authority.
14
+ - Apply equivalent search admission and cache identity in synchronous and asynchronous Context paths. Neither path increases the existing actual-file scan cap or accepts forbidden paths from Git hints.
15
+ - Context results remain bounded evidence, not completeness proof. Git hints may omit untracked files and max-files/snippet caps still apply; explicit known paths and progressively narrowed source requests remain the existing precise retrieval surfaces.
16
+
17
+ ## Verification
18
+
19
+ Regression fixtures place two complete symbol declarations after more than 800 broad distractors, with multiple longer-prefix false positives. Both synchronous and asynchronous Context materialization must select the two exact target files and inspect fewer than 30 candidate source files. Process Runtime timeout observations independently release monitor waiters and abort listeners, with no post-timeout cancellation of a live command.
@@ -0,0 +1,37 @@
1
+ # Checkout-local Xcode cache reuse and reclamation
2
+
3
+ Status: accepted contract for the storage repair candidate; activation is a separate complete Runtime release decision.
4
+ Evidence: local 2026-10-09 disk audit reclaimed 60.39 GiB of generated Xcode subdirectories across 384 directories; issue #194 records the bounded-retention gap.
5
+
6
+ ## Root causes and decision
7
+
8
+ The existing iOS producer already used stable build buckets, but the key included device identity and tests used a separate scheme-only bucket. Build and test now reuse the same checkout-local container/scheme/configuration/platform bucket. Simulator identities, test selectors and invocation timestamps do not create another cache. Device and simulator platforms and configurations remain separate; Xcode owns source, SDK and toolchain invalidation. Cross-checkout mutable DerivedData sharing is forbidden because absolute paths and concurrent writers differ.
9
+
10
+ The existing Runtime maintenance owner reclaims generated caches on its five-minute retention cadence, with one repository and the existing 1,000-entry/eight-removal budget per pass. Repository, checkout, namespace and nested directory rotations consume independent visit ordinals; a global sequence must not couple these selection layers.
11
+
12
+ Discovery uses Xcode's info.plist plus known rebuildable directories, including arbitrary preview bucket names under existing owned namespaces. Reclamation deletes only Build, ModuleCache.noindex, Index.noindex, CompilationCache.noindex, SDKExplicitPrecompiledModules and SDKStatCaches.noindex. Logs, result bundles, SourcePackages, metadata, unknown contents and tracked content remain. This replaces the unsafe whole-DerivedData deletion contract.
13
+
14
+ ## Cross-cutting closure
15
+
16
+ | Area | Owner and behavior |
17
+ | --- | --- |
18
+ | Identity / scope | Existing repository registry and active managed checkouts; existing .forge/ios, .ai/harness, .repo-harness and .tmp namespaces only. A cache name alone is not ownership or disposable-content proof. |
19
+ | Authority / trust | Existing Runtime maintenance write claim and explicit full-maintenance action. No new daemon, registry, schema, credential or permission authority. Symlink ancestors and unprovable Git/process inventory stop deletion. |
20
+ | Concurrency / fencing | Existing plugin workspace claims serialize canonical build/test operations. Maintenance protects processes referencing the cache and conservatively protects checkout-scoped or unscoped xcodebuild commands. Producer refreshes bucket last-use before and after execution; six-hour periodic grace remains. External shell activity is observable process evidence, not a Forge lease; this is conservative protection rather than a transactional filesystem lock. |
21
+ | Lifecycle / retention | Reusable cache lives within its checkout. Rebuildable children expire after idle grace and are regenerated by Xcode. Source checkout and evidence lifecycle remain separate. Missing process inventory yields a bounded diagnostic and no reclamation. |
22
+ | Persistence / integrity / recovery | No database migration. Deleting disposable children is idempotent; interrupted passes leave a valid surviving bucket for the next scan/build. Existing source, Git, dependency and evidence backups retain their owners. |
23
+ | Evidence / privacy | Existing cleanup reports record removed paths, protection reasons and budget exhaustion; no source, credential or process text persistence added. Result bundles use the existing collision-resistant artifact stamp. |
24
+ | Capacity / time / performance | Stable keys reduce cache production. Existing bounded scan/removal budgets protect scheduler latency; rotation prevents protected early entries from permanently starving later directories. Grace uses the newer bucket/child mtime and completed reuse refreshes last-use. This is idle reclamation, not a hard global disk quota. |
25
+ | Topology / portability / release | Same in-process Runtime maintenance owner; no additional process. iOS commands remain Darwin-only. Deploy/rollback is the complete Runtime release under existing authority; source delivery alone does not activate the fix. |
26
+
27
+ ## Preserved and deferred boundaries
28
+
29
+ KEEP existing bounded budgets, active-process protection, Git ownership checks, evidence retention and complete Runtime rollback.
30
+ CHANGE whole-directory deletion to typed disposable children; cache key to compatible build/test reuse; correlated/deep-only cache scheduling to independent five-minute rotation.
31
+ DEFER relocating existing iOS build caches into Controller Home: install/build product paths and checkout fencing need one coherent owner migration. This candidate creates no additional cache root and does not duplicate or copy legacy buckets.
32
+ DEFER arbitrary external /private/tmp builds and third-party caches: neither naming nor age grants Forge deletion ownership. Use the canonical build/test producer for managed builds; manual external runs should reuse an explicit per-checkout cache and remove it at their own terminal boundary.
33
+ DEFER cloud transfer of cold recovery bundles until verified upload/restore and local-retention authority exist. Rebuildable caches are not cloud backup data.
34
+
35
+ ## Verification
36
+
37
+ Extend retained iOS producer and generated-cache safety scenarios; do not add tests during Kernel V2 suite freeze. Verify cache reuse across simulators/build/test, platform/configuration separation, unique result bundles, arbitrary-name recognition, nested evidence/dependency preservation and independent rotation. Run affected type and repository/architecture checks before source delivery.