@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.
- package/AGENTS.md +5 -2
- package/CHANGELOG.md +20 -0
- package/README.en.md +24 -3
- package/README.md +10 -6
- package/README.zh-CN.md +5 -3
- package/THIRD_PARTY_NOTICES.md +1 -2
- package/adapters/chatgpt/browser-delivery-runtime.ts +5 -3
- package/adapters/chatgpt/provider-delivery.ts +1 -1
- package/adapters/chatgpt/work-conversation-binding-store.ts +20 -1
- package/adapters/computer/chatgpt-extension-target.ts +295 -50
- package/adapters/computer/chrome-extension/background.js +227 -71
- package/adapters/computer/chrome-extension/content.js +181 -157
- package/adapters/computer/chrome-extension/manifest.json +3 -1
- package/adapters/computer/desktop-operator-provider.ts +18 -6
- package/adapters/computer/interaction-target-authority.ts +39 -9
- package/adapters/mcp/access-mode.ts +18 -39
- package/adapters/mcp/auth.ts +2 -6
- package/adapters/mcp/instructions.ts +2 -2
- package/adapters/mcp/multi-repository.ts +7 -28
- package/adapters/mcp/runtime-gateway/context-adapter.ts +79 -40
- package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +7 -15
- package/adapters/mcp/runtime-gateway/execution-tools.ts +7 -13
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +16 -3
- package/adapters/mcp/runtime-gateway/process-tools.ts +3 -21
- package/adapters/mcp/runtime-gateway/router.ts +3 -5
- package/adapters/mcp/runtime-gateway/routing-policy.ts +17 -10
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1 -1
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +14 -9
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +1 -5
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +36 -1
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +58 -4
- package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +7 -3
- package/adapters/mcp/runtime-gateway/work-adapter.ts +16 -16
- package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +0 -17
- package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +69 -12
- package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +26 -2
- package/adapters/mcp/server.ts +24 -3
- package/adapters/mcp/setup.ts +4 -10
- package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +672 -2935
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +1 -1
- package/adapters/mcp/tool-mapping/repository-tools.ts +52 -86
- package/adapters/mcp/toolset-names.ts +11 -42
- package/adapters/mcp/toolset.ts +16 -90
- package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
- package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
- package/adapters/mcp/transports/http-observation.ts +18 -6
- package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
- package/adapters/mcp/transports/http.ts +54 -14
- package/adapters/mcp/types.ts +0 -6
- package/assets/hooks/lib/session-state.sh +0 -38
- package/assets/hooks/post-bash.sh +1 -1
- package/assets/hooks/post-tool-observer.sh +0 -5
- package/assets/hooks/prompt-guard.sh +0 -55
- package/assets/partials/04-project-structure.partial.md +1 -1
- package/assets/partials/07-footer.partial.md +1 -1
- package/assets/partials-agents/02-operating-mode.partial.md +1 -1
- package/assets/partials-agents/08-deep-docs.partial.md +1 -1
- package/assets/reference-configs/agentic-development-flow.md +1 -1
- package/assets/reference-configs/external-tooling.md +0 -76
- package/assets/reference-configs/release-deploy.md +1 -1
- package/assets/templates/helpers/architecture-queue.sh +1 -1
- package/assets/templates/helpers/check-agent-tooling.sh +1 -327
- package/assets/templates/helpers/check-task-workflow.sh +1 -1
- package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
- package/assets/templates/helpers/migrate-project-template.sh +2 -2
- package/assets/workflow-contract.v1.json +0 -2
- package/docs/README.md +5 -2
- package/docs/architecture/CURRENT.md +114 -30
- package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
- package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +15 -2
- package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +4 -2
- package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +109 -4
- package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
- package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
- package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
- package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
- package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
- package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
- package/docs/architecture/domains/public-surface.md +3 -5
- package/docs/architecture/domains/verification.md +5 -5
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +2 -2
- package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
- package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
- package/docs/forge-plugin-management.md +14 -2
- package/docs/operations/controller-browser-plugin.md +23 -0
- package/docs/operations/features.md +6 -7
- package/docs/operations/features.zh-CN.md +1 -1
- package/docs/operations/github-repository.md +4 -4
- package/docs/operations/github-semantic-release-projection.md +20 -0
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +13 -54
- package/docs/operations/runtime-performance-diagnostics.md +8 -0
- package/docs/operations/standalone-disaster-recovery.md +1 -1
- package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
- package/docs/tutorials/03-first-repository-task.md +2 -0
- package/docs/wiki/Computer-and-Plugins.md +78 -0
- package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
- package/docs/wiki/Home.md +16 -2
- package/docs/wiki/Implementation.md +24 -12
- package/docs/wiki/Installation.md +28 -32
- package/docs/wiki/Integrations.md +4 -0
- package/docs/wiki/Quick-Start.md +35 -22
- package/docs/wiki/Releases-and-Upgrades.md +15 -25
- package/docs/wiki/_Sidebar.md +5 -1
- package/package.json +1 -12
- package/packages/kernel/controller/infrastructure/controller-session-store.ts +63 -38
- package/packages/kernel/identity/infrastructure/activity-projection-store.ts +10 -0
- package/packages/kernel/scheduler/application/eligibility.ts +4 -1
- package/packages/kernel/scheduler/infrastructure/schedule-store.ts +13 -10
- package/packages/kernel/work/application/work-service.ts +1 -0
- package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
- package/packages/kernel/work/domain/state-machine.ts +9 -2
- package/packages/kernel/work/infrastructure/work-contract-store.ts +28 -1
- package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
- package/packages/plugin-runtime/computer/conversation-target.ts +17 -7
- package/scripts/assemble-template.ts +11 -72
- package/scripts/check-mcp-compatibility.ts +55 -74
- package/scripts/check-package-identity.mjs +0 -5
- package/scripts/check-runtime-architecture.mjs +305 -28
- package/scripts/init-project.sh +0 -46
- package/scripts/install-ios-hid-toolchain.sh +60 -0
- package/scripts/install-standalone-recovery.ts +1 -1
- package/scripts/lib/project-init-lib.sh +3 -3
- package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
- package/scripts/open-source-audit-allowlist.txt +0 -1
- package/scripts/run-governed-gate.ts +2 -0
- package/scripts/smoke-ios-physical-device.ts +38 -10
- package/scripts/smoke-mcp-http-runtime.ts +7 -8
- package/scripts/smoke-mcp-tool-surface.ts +27 -41
- package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +6 -3
- package/scripts/sync-generated-authority.mjs +0 -1
- package/src/cli/agent-jobs/executor-health.ts +1 -1
- package/src/cli/agent-jobs/integration.ts +2 -2
- package/src/cli/chatgpt-browser/file-policy.ts +2 -2
- package/src/cli/commands/doctor.ts +1 -143
- package/src/cli/commands/global-runtime.ts +3 -196
- package/src/cli/commands/init-hook.ts +6 -23
- package/src/cli/commands/init.ts +3 -252
- package/src/cli/commands/mcp.ts +0 -5
- package/src/cli/commands/prompt-guard-decision.ts +0 -2
- package/src/cli/commands/recovery.ts +2 -14
- package/src/cli/commands/repository.ts +17 -1
- package/src/cli/commands/setup-execution.ts +41 -0
- package/src/cli/controller/completion-orchestrator.ts +1 -1
- package/src/cli/controller/composite-operations.ts +1 -1
- package/src/cli/controller/context/instruction-context.ts +1 -1
- package/src/cli/controller/context/known-paths.ts +2 -2
- package/src/cli/controller/context/query-planning.ts +11 -4
- package/src/cli/controller/context/rule-resolution.ts +2 -2
- package/src/cli/controller/context/source-materializer.ts +2 -2
- package/src/cli/controller/context/structural-provider.ts +84 -0
- package/src/cli/controller/context/structural.ts +6 -6
- package/src/cli/controller/context/types.ts +8 -9
- package/src/cli/controller/context-pack.ts +97 -76
- package/src/cli/controller/operational-plan.ts +1 -1
- package/src/cli/controller/systemd-user.ts +4 -10
- package/src/cli/editing/edit-session.ts +17 -5
- package/src/cli/github/github.ts +4 -4
- package/src/cli/github/semantic-projection.ts +174 -0
- package/src/cli/hook/prompt-intents.ts +0 -9
- package/src/cli/index.ts +1 -43
- package/src/cli/local-bridge/connector-freshness.ts +1 -12
- package/src/cli/local-bridge/console-automations.ts +1 -1
- package/src/cli/local-bridge/console-view-models.ts +1 -1
- package/src/cli/local-bridge/facade-api.ts +0 -2
- package/src/cli/repositories/command-classifier.ts +0 -9
- package/src/cli/repositories/command-scope.ts +2 -2
- package/src/cli/repositories/locks.ts +20 -0
- package/src/cli/repositories/registry.ts +2 -1
- package/src/cli/repositories/safe-patch.ts +2 -12
- package/src/cli/repositories/structured-git.ts +39 -3
- package/src/cli/repository/inspector.ts +185 -343
- package/src/effects/process-runner.ts +17 -1
- package/src/runtime/context/generic-lsp-provider.ts +1 -1
- package/src/runtime/context/semantic-navigation-contract.ts +7 -0
- package/src/runtime/context/semantic-navigation.ts +1 -1
- package/src/runtime/control-plane/cleanup-artifact-retention.ts +4 -4
- package/src/runtime/control-plane/execution/work-delivery-service.ts +150 -31
- package/src/runtime/control-plane/execution/work-handle-authority.ts +12 -4
- package/src/runtime/control-plane/execution/work-handle-store.ts +53 -1
- package/src/runtime/control-plane/execution/work-operation-service.ts +20 -10
- package/src/runtime/control-plane/execution/work-preparation-service.ts +108 -4
- package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +28 -13
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +5 -1
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +1 -1
- package/src/runtime/control-plane/facade/capability-registry.ts +2 -0
- package/src/runtime/control-plane/facade/work-continuation.ts +1 -1
- package/src/runtime/control-plane/generated-cache-retention.ts +114 -63
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +20 -8
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +1 -11
- package/src/runtime/control-plane/governance/external-effects.ts +1 -1
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +1 -0
- package/src/runtime/control-plane/runtime-cleanup.ts +12 -93
- package/src/runtime/evidence/sensitive-output.ts +22 -2
- package/src/runtime/execution/jobs/child-reference.ts +11 -0
- package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
- package/src/runtime/execution/process-runtime/command-facade.ts +3 -3
- package/src/runtime/execution/process-runtime/runtime.ts +20 -16
- package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
- package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
- package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
- package/src/runtime/execution/workers/executor.ts +1 -2
- package/src/runtime/maintenance/cleanup.ts +41 -5
- package/src/runtime/plugins/action-application.ts +12 -1
- package/src/runtime/plugins/app-store-connect-adapter.ts +252 -4
- package/src/runtime/plugins/browser-adapter.ts +381 -313
- package/src/runtime/plugins/browser-macos-bridge.ts +114 -112
- package/src/runtime/plugins/browser-manifest-surface.ts +2 -1
- package/src/runtime/plugins/browser-registration.ts +2 -0
- package/src/runtime/plugins/browser-runtime.ts +26 -35
- package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +11 -2
- package/src/runtime/plugins/computer-registration.ts +76 -9
- package/src/runtime/plugins/github-adapter.ts +30 -3
- package/src/runtime/plugins/gmail-adapter.ts +166 -1
- package/src/runtime/plugins/google-shared.ts +10 -5
- package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
- package/src/runtime/plugins/ios-adapter.ts +45 -40
- package/src/runtime/plugins/ios-agent-device.ts +54 -4
- package/src/runtime/plugins/ios-device-ownership.ts +103 -0
- package/src/runtime/plugins/ios-physical-device.ts +497 -79
- package/src/runtime/plugins/local-system-adapter.ts +1 -99
- package/src/runtime/plugins/store.ts +80 -7
- package/src/runtime/plugins/types.ts +4 -0
- package/src/runtime/projections/git-status-sampler.ts +2 -19
- package/src/runtime/recovery/actions.ts +1 -1
- package/src/runtime/recovery/lifecycle-inventory.ts +1 -11
- package/src/runtime/recovery/probe.ts +2 -2
- package/src/runtime/release/release-coordinator.ts +20 -4
- package/src/runtime/root/controller-progression-composition.ts +67 -5
- package/src/runtime/root/package-connector-service.ts +123 -11
- package/src/runtime/root/package-runtime-release.ts +6 -18
- package/src/runtime/root/package-runtime-service.ts +7 -13
- package/src/runtime/root/release-execution-canary.ts +18 -5
- package/src/runtime/root/release-manifest.ts +0 -34
- package/src/runtime/root/release-materialize.ts +0 -78
- package/src/runtime/root/runtime.ts +1 -2
- package/src/runtime/root/scheduled-controller-composition.ts +2 -1
- package/src/runtime/root/service.ts +90 -11
- package/src/runtime/root/types.ts +0 -6
- package/src/runtime/root/workflow-supervisor-composition.ts +207 -19
- package/src/runtime/root/workflow-supervisor-runtime.ts +365 -10
- package/src/runtime/safe-tooling/google-credential-store.ts +1 -11
- package/src/runtime/safe-tooling/ios-development.ts +22 -8
- package/src/runtime/safe-tooling/job-summary.ts +1 -1
- package/src/runtime/safe-tooling/workspace-auth.ts +4 -1
- package/src/runtime/shared/atomic-text-file.ts +21 -0
- package/src/runtime/shared/json-files.ts +8 -3
- package/src/runtime/standalone-recovery/core.ts +189 -174
- package/src/runtime/standalone-recovery/entry.ts +62 -30
- package/src/runtime/standalone-recovery/operation-lock.ts +11 -1
- package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +1 -0
- package/src/runtime/workflow/schedules/engine.ts +36 -14
- package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
- package/src/runtime/workflow/schedules/work-continuation.ts +51 -6
- package/supervisor/client.ts +31 -14
- package/supervisor/control-plane.ts +210 -115
- package/supervisor/forge-validators.ts +88 -21
- package/supervisor/native-browser-adapter.ts +393 -28
- package/supervisor/native-messaging/host.ts +21 -2
- package/supervisor/protocol.ts +74 -26
- package/supervisor/server.ts +16 -8
- package/supervisor/store.ts +476 -57
- package/supervisor/types.ts +19 -13
- package/SKILL.md +0 -427
- package/adapters/computer/chatgpt-target-router.ts +0 -103
- package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +0 -87
- package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
- package/adapters/mcp/toolset-selection.ts +0 -41
- package/agents/openai.yaml +0 -4
- package/assets/skill-hooks.json +0 -41
- package/assets/skill-version.json +0 -189
- package/assets/skills/claude-review/SKILL.md +0 -231
- package/assets/skills/codex-review/SKILL.md +0 -103
- package/assets/templates/helpers/check-skill-version.ts +0 -193
- package/scripts/check-skill-version.ts +0 -5
- package/scripts/ensure-codegraph.sh +0 -16
- package/scripts/run-skill-hook.ts +0 -244
- package/scripts/sync-codex-installed-copies.sh +0 -182
- package/src/cli/commands/tools.ts +0 -167
- package/src/cli/mcp/access-mode.ts +0 -2
- package/src/cli/mcp/access-tools.ts +0 -2
- package/src/cli/mcp/audit.ts +0 -2
- package/src/cli/mcp/auth.ts +0 -2
- package/src/cli/mcp/instructions.ts +0 -2
- package/src/cli/mcp/legacy-context.ts +0 -2
- package/src/cli/mcp/legacy-tool-service.ts +0 -2
- package/src/cli/mcp/multi-repository.ts +0 -2
- package/src/cli/mcp/oauth.ts +0 -2
- package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
- package/src/cli/mcp/paths.ts +0 -2
- package/src/cli/mcp/policy.ts +0 -2
- package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
- package/src/cli/mcp/proxy-env.ts +0 -2
- package/src/cli/mcp/readiness-projection.ts +0 -2
- package/src/cli/mcp/redaction.ts +0 -2
- package/src/cli/mcp/repo.ts +0 -2
- package/src/cli/mcp/repository-tools.ts +0 -2
- package/src/cli/mcp/server.ts +0 -2
- package/src/cli/mcp/setup.ts +0 -2
- package/src/cli/mcp/tool-capability-cache.ts +0 -2
- package/src/cli/mcp/tool-contract.ts +0 -2
- package/src/cli/mcp/tools.ts +0 -2
- package/src/cli/mcp/toolset-names.ts +0 -2
- package/src/cli/mcp/toolset-selection.ts +0 -2
- package/src/cli/mcp/toolset.ts +0 -2
- package/src/cli/mcp/transports/http.ts +0 -2
- package/src/cli/mcp/transports/session-registry.ts +0 -2
- package/src/cli/mcp/transports/stdio.ts +0 -2
- package/src/cli/mcp/types.ts +0 -2
- package/src/cli/mcp/umbrella-tools.ts +0 -2
- package/src/cli/tools/codegraph.ts +0 -695
- package/src/core/adoption/helper-wrapper-plan.ts +0 -159
- package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
- package/src/runtime/context/codegraph-read-provider.ts +0 -611
- package/src/runtime/context/codegraph-sidecar.cjs +0 -248
- package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
- package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
- package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
- package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
- package/src/runtime/gateway/mcp/process-tools.ts +0 -2
- package/src/runtime/gateway/mcp/router.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
- package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
- package/src/runtime/plugins/browser-provider-registry.ts +0 -2
- 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.
|
|
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
|
|
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
|
|
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
|
-
-
|
|
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
|
|
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`.
|
|
219
|
-
|
|
220
|
-
|
|
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.
|