@moretea-labs/forge 1.7.2 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +121 -62
- package/CHANGELOG.md +40 -0
- package/CLAUDE.md +57 -62
- package/CONTRIBUTING.md +3 -2
- package/README.md +2 -2
- package/SKILL.md +0 -1
- package/THIRD_PARTY_NOTICES.md +5 -2
- package/adapters/browser/index.ts +2 -0
- package/adapters/chatgpt/browser-delivery-host.ts +77 -0
- package/adapters/chatgpt/browser-delivery-runtime.ts +1256 -0
- package/adapters/chatgpt/controller-binding-store.ts +134 -0
- package/adapters/chatgpt/controller-round-host.ts +68 -0
- package/adapters/chatgpt/controller-round-settlement-store.ts +99 -0
- package/adapters/chatgpt/provider-delivery.ts +340 -0
- package/adapters/chatgpt/work-conversation-binding-store.ts +218 -0
- package/adapters/chatgpt/wsl-bridge-delivery-host.ts +63 -0
- package/adapters/computer/chatgpt-extension-target.ts +463 -0
- package/adapters/computer/chatgpt-target-router.ts +103 -0
- package/adapters/computer/chrome-extension/background.js +385 -0
- package/adapters/computer/chrome-extension/content.js +378 -0
- package/adapters/computer/chrome-extension/core.js +24 -0
- package/adapters/computer/chrome-extension/manifest.json +30 -0
- package/adapters/computer/desktop-operator-contract.ts +7 -0
- package/adapters/computer/desktop-operator-discovery.ts +181 -0
- package/adapters/computer/desktop-operator-negotiation.ts +174 -0
- package/adapters/computer/desktop-operator-provider.ts +312 -0
- package/adapters/computer/index.ts +1 -0
- package/adapters/computer/interaction-target-authority.ts +1068 -0
- package/adapters/controller-process/binding-store.ts +34 -0
- package/adapters/controller-process/controller-host.ts +26 -0
- package/adapters/mcp/access-mode.ts +132 -0
- package/adapters/mcp/audit.ts +32 -0
- package/adapters/mcp/auth.ts +406 -0
- package/adapters/mcp/instructions.ts +37 -0
- package/adapters/mcp/legacy-context.ts +18 -0
- package/adapters/mcp/multi-repository.ts +421 -0
- package/adapters/mcp/oauth.ts +464 -0
- package/adapters/mcp/paths.ts +143 -0
- package/adapters/mcp/policy.ts +232 -0
- package/adapters/mcp/proxy-env.ts +62 -0
- package/adapters/mcp/readiness-projection.ts +24 -0
- package/adapters/mcp/redaction.ts +21 -0
- package/adapters/mcp/repo.ts +24 -0
- package/adapters/mcp/runtime-gateway/artifact-adapter.ts +52 -0
- package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +87 -0
- package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
- package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
- package/adapters/mcp/runtime-gateway/context-adapter.ts +1167 -0
- package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -0
- package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +206 -0
- package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
- package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +130 -0
- package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
- package/adapters/mcp/runtime-gateway/execution-control-adapter.ts +28 -0
- package/adapters/mcp/runtime-gateway/execution-tools.ts +173 -0
- package/adapters/mcp/runtime-gateway/filesystem-adapter.ts +38 -0
- package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +412 -0
- package/adapters/mcp/runtime-gateway/legacy-ios-tool-adapter.ts +105 -0
- package/adapters/mcp/runtime-gateway/maintenance-adapter.ts +44 -0
- package/adapters/mcp/runtime-gateway/model-adapter.ts +63 -0
- package/adapters/mcp/runtime-gateway/persisted-check-process.ts +3 -0
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +380 -0
- package/adapters/mcp/runtime-gateway/process-tools.ts +457 -0
- package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +88 -0
- package/adapters/mcp/runtime-gateway/recovery-adapter.ts +285 -0
- package/adapters/mcp/runtime-gateway/recovery-client-adapter.ts +70 -0
- package/adapters/mcp/runtime-gateway/recovery-tool-contract.ts +99 -0
- package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +79 -0
- package/adapters/mcp/runtime-gateway/result-adapter.ts +114 -0
- package/adapters/mcp/runtime-gateway/router.ts +242 -0
- package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1200 -0
- package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +574 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-shared.ts +27 -0
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +78 -0
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +187 -0
- package/adapters/mcp/runtime-gateway/shared-adapter.ts +45 -0
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +962 -0
- package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
- package/adapters/mcp/runtime-gateway/work-adapter.ts +325 -0
- package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
- package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
- package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +246 -0
- package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
- package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
- package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
- package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
- package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
- package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +263 -0
- package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +1 -0
- package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
- package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
- package/adapters/mcp/server.ts +1092 -0
- package/adapters/mcp/setup.ts +789 -0
- package/adapters/mcp/tool-capability-cache.ts +87 -0
- package/adapters/mcp/tool-mapping/access-tools.ts +387 -0
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +5139 -0
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +145 -0
- package/adapters/mcp/tool-mapping/repository-tools.ts +1682 -0
- package/adapters/mcp/tool-mapping/tools.ts +9 -0
- package/adapters/mcp/tool-mapping/umbrella-tools.ts +117 -0
- package/adapters/mcp/toolset-names.ts +79 -0
- package/adapters/mcp/toolset-selection.ts +41 -0
- package/adapters/mcp/toolset.ts +337 -0
- package/adapters/mcp/transports/http-observation.ts +365 -0
- package/adapters/mcp/transports/http.ts +933 -0
- package/adapters/mcp/transports/oauth-http.ts +322 -0
- package/adapters/mcp/transports/session-registry.ts +519 -0
- package/adapters/mcp/transports/stdio.ts +8 -0
- package/adapters/mcp/tunnels/openai-secure-tunnel.ts +223 -0
- package/adapters/mcp/types.ts +41 -0
- package/assets/AGENTS.md +2 -16
- package/assets/CLAUDE.md +2 -16
- package/assets/hooks/AGENTS.md +3 -14
- package/assets/hooks/CLAUDE.md +3 -14
- package/assets/hooks/hook-input.sh +9 -2
- package/assets/hooks/lib/workflow-state.sh +28 -10
- package/assets/hooks/prompt-guard.sh +63 -37
- package/assets/hooks/security-sentinel.sh +2 -1
- package/assets/hooks/session-start-context.sh +7 -5
- package/assets/hooks/stop-orchestrator.sh +13 -3
- package/assets/initializer-question-pack.v4.json +11 -7
- package/assets/partials/05-workflow.partial.md +18 -73
- package/assets/partials/07-footer.partial.md +1 -1
- package/assets/partials-agents/02-operating-mode.partial.md +1 -2
- package/assets/partials-agents/04-task-protocol.partial.md +14 -59
- package/assets/partials-agents/06-quality-safety.partial.md +11 -16
- package/assets/partials-agents/08-deep-docs.partial.md +1 -2
- package/assets/plan-map.json +11 -11
- package/assets/plugin-registry.v1.json +11 -3
- package/assets/plugin-trust-policy.v1.json +6 -0
- package/assets/recovery/ForgeRecovery.ps1 +100 -0
- package/assets/recovery/forge-wsl-rescue +271 -0
- package/assets/reference-configs/agentic-development-flow.md +25 -0
- package/assets/reference-configs/development-protocol.md +11 -15
- package/assets/reference-configs/document-generation.md +1 -1
- package/assets/reference-configs/global-working-rules.md +28 -1
- package/assets/reference-configs/harness-overview.md +22 -112
- package/assets/reference-configs/hook-operations.md +1 -1
- package/assets/reference-configs/sprint-contracts.md +2 -2
- package/assets/skill-version.json +2 -2
- package/assets/templates/helpers/architecture-event.ts +3 -34
- package/assets/templates/helpers/architecture-queue.sh +61 -10
- package/assets/templates/helpers/archive-workflow.sh +90 -180
- package/assets/templates/helpers/capability-config.ts +8 -11
- package/assets/templates/helpers/capability-resolver.ts +37 -19
- package/assets/templates/helpers/capture-plan.sh +2 -2
- package/assets/templates/helpers/check-architecture-sync.sh +1 -9
- package/assets/templates/helpers/check-task-sync.sh +82 -11
- package/assets/templates/helpers/check-task-workflow.sh +1 -3
- package/assets/templates/helpers/context-contract-sync.sh +1 -12
- package/assets/templates/helpers/contract-worktree.sh +26 -24
- package/assets/templates/helpers/ensure-task-workflow.sh +6 -8
- package/assets/templates/helpers/inspect-project-state.ts +1 -1
- package/assets/templates/helpers/migrate-project-template.sh +1 -1
- package/assets/templates/helpers/migrate-workflow-docs.ts +53 -239
- package/assets/templates/helpers/new-plan.sh +2 -2
- package/assets/templates/helpers/plan-to-todo.sh +3 -31
- package/assets/templates/helpers/sprint-backlog.sh +1 -1
- package/assets/templates/helpers/switch-plan.sh +1 -1
- package/assets/templates/helpers/workflow-contract.ts +1 -0
- package/assets/workflow-contract.v1.json +63 -171
- package/assets/workflows/xiaohongshu/xiaohongshu.collect-metrics.v1.draft.json +118 -0
- package/assets/workflows/xiaohongshu/xiaohongshu.publish-image-note.v1.draft.json +316 -0
- package/assets/workflows/xiaohongshu/xiaohongshu.publish-long-text.v1.draft.json +324 -0
- package/docs/architecture/CURRENT.md +233 -28
- package/docs/architecture/EVOLUTION.md +13 -0
- package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +2 -1
- package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
- package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
- package/docs/architecture/decisions/20260831-independent-windows-wsl-host-rescue.md +59 -0
- package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +120 -0
- package/docs/architecture/decisions/20260904-repository-runtime-data-boundary.md +42 -0
- package/docs/architecture/decisions/20260907-assistant-learning-loop.md +37 -0
- package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +311 -0
- package/docs/architecture/decisions/20260907-maintenance-diagnosis-bounded-read.md +39 -0
- package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
- package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
- package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +221 -0
- package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
- package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +72 -0
- package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +237 -0
- package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
- package/docs/architecture/domains/verification.md +8 -0
- package/docs/architecture/domains/workflow-engine.md +7 -1
- package/docs/architecture/index.md +3 -3
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +19 -8
- package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +124 -0
- package/docs/forge-chatgpt-mcp-setup.md +5 -3
- package/docs/forge-plugin-management.md +20 -4
- package/docs/forge-runtime-self-healing-loop.md +2 -0
- package/docs/operations/benchmark-cross-version-freeze.md +38 -0
- package/docs/operations/controller-browser-plugin.md +3 -1
- package/docs/operations/controller-performance-and-502.md +17 -0
- package/docs/operations/controller-reliability-runbook.md +2 -2
- package/docs/operations/features.md +1 -1
- package/docs/operations/features.zh-CN.md +1 -1
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +2 -0
- package/docs/operations/platform-support.md +16 -8
- package/docs/operations/platform-support.zh-CN.md +2 -2
- package/docs/operations/releasing.md +2 -0
- package/docs/operations/standalone-disaster-recovery.md +38 -5
- package/docs/operations/uu-remote-rescue.md +41 -0
- package/docs/operations/windows-wsl-host-rescue.md +133 -0
- package/docs/public-usage-guide.md +1 -1
- package/docs/public-usage-guide.zh-CN.md +1 -1
- package/docs/tutorials/01-install-and-start.md +1 -1
- package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
- package/docs/tutorials/02-connect-chatgpt.md +4 -4
- package/docs/tutorials/02-connect-chatgpt.zh-CN.md +4 -4
- package/docs/wiki/Implementation.md +1 -1
- package/package.json +46 -26
- package/packages/kernel/cognition/api/index.ts +6 -0
- package/packages/kernel/cognition/application/activation-service.ts +451 -0
- package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
- package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
- package/packages/kernel/cognition/application/memory-service.ts +64 -0
- package/packages/kernel/cognition/domain/learning.ts +106 -0
- package/packages/kernel/cognition/domain/memory.ts +254 -0
- package/packages/kernel/controller/api/index.ts +3 -0
- package/packages/kernel/controller/application/continuation-service.ts +281 -0
- package/packages/kernel/controller/application/controller-round-service.ts +41 -0
- package/packages/kernel/controller/application/controller-service.ts +30 -0
- package/packages/kernel/controller/domain/controller-round-transition-policy.ts +529 -0
- package/packages/kernel/controller/domain/controller-round.ts +110 -0
- package/packages/kernel/controller/domain/execution-quality.ts +135 -0
- package/packages/kernel/controller/domain/types.ts +56 -0
- package/packages/kernel/controller/index.ts +1 -0
- package/packages/kernel/controller/infrastructure/controller-binding-store.ts +84 -0
- package/packages/kernel/controller/infrastructure/controller-round-store.ts +1970 -0
- package/packages/kernel/controller/infrastructure/controller-session-store.ts +804 -0
- package/packages/kernel/controller/ports/controller-host.ts +18 -0
- package/packages/kernel/goal/api/index.ts +1 -0
- package/packages/kernel/goal/domain/types.ts +40 -0
- package/packages/kernel/goal/index.ts +1 -0
- package/packages/kernel/identity/api/index.ts +15 -0
- package/packages/kernel/identity/application/identity-service.ts +67 -0
- package/packages/kernel/identity/domain/activity-projection.ts +43 -0
- package/packages/kernel/identity/domain/capability-broker.ts +60 -0
- package/packages/kernel/identity/domain/grant.ts +72 -0
- package/packages/kernel/identity/domain/owned-resource.ts +116 -0
- package/packages/kernel/identity/domain/scope.ts +63 -0
- package/packages/kernel/identity/domain/semantic-sync.ts +81 -0
- package/packages/kernel/identity/domain/types.ts +44 -0
- package/packages/kernel/identity/domain/user-request.ts +93 -0
- package/packages/kernel/identity/domain/workspace.ts +56 -0
- package/packages/kernel/identity/index.ts +1 -0
- package/packages/kernel/identity/infrastructure/activity-projection-store.ts +77 -0
- package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
- package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
- package/packages/kernel/identity/infrastructure/identity-store.ts +75 -0
- package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
- package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
- package/packages/kernel/memory/api/index.ts +5 -0
- package/packages/kernel/memory/application/experience-service.ts +118 -0
- package/packages/kernel/memory/application/outcome-service.ts +77 -0
- package/packages/kernel/memory/domain/experience.ts +103 -0
- package/packages/kernel/memory/domain/operational-prior.ts +92 -0
- package/packages/kernel/memory/index.ts +1 -0
- package/packages/kernel/scheduler/api/index.ts +4 -0
- package/packages/kernel/scheduler/application/eligibility.ts +252 -0
- package/packages/kernel/scheduler/application/schedule-service.ts +27 -0
- package/packages/kernel/scheduler/application/settlement.ts +182 -0
- package/packages/kernel/scheduler/domain/schedule.ts +236 -0
- package/packages/kernel/scheduler/index.ts +1 -0
- package/packages/kernel/scheduler/infrastructure/schedule-store.ts +805 -0
- package/packages/kernel/work/api/index.ts +16 -0
- package/packages/kernel/work/application/work-service.ts +123 -0
- package/packages/kernel/work/domain/check-receipt.ts +43 -0
- package/packages/kernel/work/domain/context-closure-receipt.ts +32 -0
- package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
- package/packages/kernel/work/domain/engineering-contracts.ts +157 -0
- package/packages/kernel/work/domain/engineering-design.ts +286 -0
- package/packages/kernel/work/domain/engineering-profile.ts +238 -0
- package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
- package/packages/kernel/work/domain/execution-concurrency.ts +247 -0
- package/packages/kernel/work/domain/execution-snapshot.ts +2 -0
- package/packages/kernel/work/domain/implementation-review.ts +193 -0
- package/packages/kernel/work/domain/objective-graph.ts +119 -0
- package/packages/kernel/work/domain/project-engineering-contract.ts +224 -0
- package/packages/kernel/work/domain/repository-completion-receipt.ts +73 -0
- package/{src/runtime/control-plane/facade/work-state-machine.ts → packages/kernel/work/domain/state-machine.ts} +37 -66
- package/packages/kernel/work/domain/types.ts +534 -0
- package/packages/kernel/work/index.ts +1 -0
- package/packages/kernel/work/infrastructure/work-contract-store.ts +1967 -0
- package/packages/kernel/work/ports/work-contract-store.ts +21 -0
- package/packages/plugin-runtime/browser/index.ts +3 -0
- package/packages/plugin-runtime/browser/provider-registry.ts +110 -0
- package/packages/plugin-runtime/browser/runtime-contract.ts +150 -0
- package/packages/plugin-runtime/browser/session-authority.ts +62 -0
- package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
- package/packages/plugin-runtime/computer/conversation-target.ts +143 -0
- package/packages/plugin-runtime/computer/index.ts +8 -0
- package/packages/plugin-runtime/computer/provider-error.ts +26 -0
- package/packages/plugin-runtime/computer/provider-registration.ts +52 -0
- package/packages/plugin-runtime/computer/provider-registry.ts +63 -0
- package/packages/plugin-runtime/computer/provider.ts +19 -0
- package/packages/plugin-runtime/computer/target-authority.ts +215 -0
- package/packages/plugin-runtime/computer/target-persistence.ts +54 -0
- package/packages/plugin-runtime/external/index.ts +1 -0
- package/packages/plugin-runtime/external/unix-jsonl-transport.ts +581 -0
- package/packages/plugin-runtime/index.ts +3 -0
- package/packages/protocols/browser/index.ts +1 -0
- package/packages/protocols/browser/session.ts +98 -0
- package/packages/protocols/computer/contract.ts +225 -0
- package/packages/protocols/computer/index.ts +1 -0
- package/packages/protocols/failure/contract.ts +158 -0
- package/packages/protocols/failure/index.ts +1 -0
- package/packages/protocols/handoff/index.ts +1 -0
- package/packages/protocols/handoff/status.ts +22 -0
- package/packages/protocols/mcp/execution-context.ts +11 -0
- package/packages/protocols/mcp/index.ts +2 -0
- package/packages/protocols/mcp/tool-contract.ts +42 -0
- package/packages/workflow-runtime/api/index.ts +2 -0
- package/packages/workflow-runtime/application/interpreter.ts +342 -0
- package/packages/workflow-runtime/domain/workflow-asset.ts +223 -0
- package/packages/workflow-runtime/index.ts +1 -0
- package/scripts/activate-source-baseline.ts +7 -9
- package/scripts/assemble-template.ts +1 -1
- package/scripts/bootstrap-runtime-maintenance-recovery.sh +4 -1
- package/scripts/canary-chatgpt-provider-delivery.ts +97 -0
- package/scripts/canary-controller-semantic-wait.ts +183 -0
- package/scripts/canary-global-hook.sh +2 -2
- package/scripts/check-mcp-compatibility.ts +85 -7
- package/scripts/check-platform-support.mjs +28 -2
- package/scripts/check-public-docs.sh +1 -1
- package/scripts/check-repository-hygiene.mjs +92 -0
- package/scripts/check-runtime-architecture.mjs +1643 -127
- package/scripts/check-source-duplication.mjs +9 -1
- package/scripts/controller-ngrok-rotation.sh +5 -4
- package/scripts/create-project-dirs.sh +10 -74
- package/scripts/forge-local-recovery-helper.mjs +282 -0
- package/scripts/forge-uu-remote-rescue-helper.d.mts +31 -0
- package/scripts/forge-uu-remote-rescue-helper.mjs +409 -0
- package/scripts/forge-windows-host-recovery-helper.mjs +136 -0
- package/scripts/hook-shim.sh +2 -2
- package/scripts/init-project.sh +12 -70
- package/scripts/install-desktop-operator-registration.ts +4 -2
- package/scripts/install-independent-windows-wsl-recovery.ts +125 -0
- package/scripts/install-standalone-recovery.ts +122 -10
- package/scripts/install-uu-remote-rescue-registration.ts +74 -0
- package/scripts/install-windows-host-recovery-registration.ts +22 -0
- package/scripts/lib/controller-home-env.sh +6 -3
- package/scripts/lib/project-init-lib.sh +42 -582
- package/scripts/migrate-chatgpt-automation-schedules.ts +2 -2
- package/scripts/migrate-windows-wsl-controller-home.ts +306 -0
- package/scripts/open-source-audit-allowlist.txt +11 -1
- package/scripts/portability-bindings.mjs +70 -0
- package/scripts/run-bounded-command.mjs +60 -0
- package/scripts/run-bun-test-file.ts +22 -6
- package/scripts/run-governed-gate.ts +4 -2
- package/scripts/run-mobile-monitor-bridge.ts +0 -1
- package/scripts/smoke-control-plane-failure-domain.ts +94 -0
- package/scripts/smoke-mcp-http-runtime.ts +6 -1
- package/scripts/smoke-runtime-recovery.ts +13 -11
- package/scripts/smoke-schedule-engine.ts +24 -16
- package/scripts/smoke-unattended-transport-recovery.ts +223 -0
- package/scripts/smoke-user-request-continuation-restart.ts +232 -0
- package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +92 -0
- package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
- package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
- package/scripts/smoke-workflow-supervisor.ts +103 -0
- package/scripts/test-governance.ts +51 -2
- package/scripts/verify-forge-runtime.sh +2 -1
- package/src/cli/agent-jobs/executor-health.ts +11 -34
- package/src/cli/agent-jobs/integration.ts +18 -49
- package/src/cli/agent-jobs/job-manager.ts +17 -4
- package/src/cli/chatgpt-browser/bind-server.ts +2 -1
- package/src/cli/chatgpt-browser/binding.ts +20 -10
- package/src/cli/chatgpt-browser/bridge-extension.ts +75 -0
- package/src/cli/chatgpt-browser/bridge-provider.ts +376 -11
- package/src/cli/chatgpt-browser/engine.ts +10 -11
- package/src/cli/chatgpt-browser/native-provider.ts +24 -83
- package/src/cli/chatgpt-browser/oracle-provider.ts +5 -3
- package/src/cli/chatgpt-browser/types.ts +1 -0
- package/src/cli/commands/bootstrap-control.ts +334 -0
- package/src/cli/commands/brain-assistant.ts +52 -0
- package/src/cli/commands/brain.ts +191 -40
- package/src/cli/commands/chatgpt.ts +32 -67
- package/src/cli/commands/computer.ts +437 -0
- package/src/cli/commands/doctor.ts +18 -1
- package/src/cli/commands/init-hook.ts +71 -61
- package/src/cli/commands/init.ts +3 -1
- package/src/cli/commands/mcp.ts +16 -10
- package/src/cli/commands/plugin.ts +38 -12
- package/src/cli/commands/recovery.ts +507 -80
- package/src/cli/commands/runtime.ts +12 -7
- package/src/cli/commands/setup-profile.ts +97 -39
- package/src/cli/commands/status.ts +2 -1
- package/src/cli/controller/check-runner.ts +500 -100
- package/src/cli/controller/completion-backlog.ts +3 -3
- package/src/cli/controller/completion-orchestrator.ts +4 -43
- package/src/cli/controller/completion-target.ts +3 -72
- package/src/cli/controller/context/source-materializer.ts +81 -100
- package/src/cli/controller/context/types.ts +7 -1
- package/src/cli/controller/context-pack.ts +28 -6
- package/src/cli/controller/execution-completion.ts +4 -7
- package/src/cli/controller/execution-policy.ts +36 -153
- package/src/cli/controller/governance.ts +2 -3
- package/src/cli/controller/issue-store.ts +4 -99
- package/src/cli/controller/launch-agents.ts +59 -18
- package/src/cli/controller/operational-plan.ts +24 -51
- package/src/cli/controller/runtime-config.ts +5 -1
- package/src/cli/controller/stuck-state-migration.ts +2 -3
- package/src/cli/controller/systemd-user.ts +148 -0
- package/src/cli/controller/types.ts +10 -70
- package/src/cli/controller/worklog.ts +67 -13
- package/src/cli/editing/edit-operation-contract.ts +92 -0
- package/src/cli/editing/edit-session.ts +290 -20
- package/src/cli/github/plugin.ts +17 -12
- package/src/cli/hook/route-registry.ts +3 -5
- package/src/cli/hook/runtime.ts +49 -3
- package/src/cli/index.ts +3 -0
- package/src/cli/local-bridge/connector-freshness.ts +2 -2
- package/src/cli/local-bridge/console-automations.ts +20 -15
- package/src/cli/local-bridge/console-view-models.ts +3 -12
- package/src/cli/local-bridge/facade-api.ts +105 -205
- package/src/cli/local-bridge/job-store.ts +1 -1
- package/src/cli/local-bridge/server.ts +48 -174
- package/src/cli/local-bridge/types.ts +0 -1
- package/src/cli/mcp/access-mode.ts +2 -132
- package/src/cli/mcp/access-tools.ts +2 -387
- package/src/cli/mcp/audit.ts +2 -32
- package/src/cli/mcp/auth.ts +2 -404
- package/src/cli/mcp/instructions.ts +2 -34
- package/src/cli/mcp/legacy-context.ts +2 -16
- package/src/cli/mcp/legacy-tool-service.ts +2 -5308
- package/src/cli/mcp/multi-repository.ts +2 -436
- package/src/cli/mcp/oauth-client-retirement.ts +74 -0
- package/src/cli/mcp/oauth.ts +2 -375
- package/src/cli/mcp/openai-secure-tunnel.ts +2 -0
- package/src/cli/mcp/paths.ts +2 -140
- package/src/cli/mcp/policy.ts +2 -232
- package/src/cli/mcp/post-finalize-work-attribution.ts +2 -150
- package/src/cli/mcp/proxy-env.ts +2 -62
- package/src/cli/mcp/readiness-projection.ts +2 -24
- package/src/cli/mcp/redaction.ts +2 -21
- package/src/cli/mcp/repo.ts +2 -24
- package/src/cli/mcp/repository-tools.ts +2 -1613
- package/src/cli/mcp/server.ts +2 -951
- package/src/cli/mcp/setup.ts +2 -737
- package/src/cli/mcp/tool-capability-cache.ts +2 -87
- package/src/cli/mcp/tool-contract.ts +2 -14
- package/src/cli/mcp/tools.ts +2 -9
- package/src/cli/mcp/toolset-names.ts +2 -70
- package/src/cli/mcp/toolset-selection.ts +2 -41
- package/src/cli/mcp/toolset.ts +2 -336
- package/src/cli/mcp/transports/AGENTS.md +1 -10
- package/src/cli/mcp/transports/CLAUDE.md +1 -10
- package/src/cli/mcp/transports/http.ts +2 -1414
- package/src/cli/mcp/transports/session-registry.ts +2 -490
- package/src/cli/mcp/transports/stdio.ts +2 -8
- package/src/cli/mcp/types.ts +2 -41
- package/src/cli/mcp/umbrella-tools.ts +2 -117
- package/src/cli/repositories/command-executor.ts +91 -39
- package/src/cli/repositories/command-scope.ts +139 -4
- package/src/cli/repositories/controller-home.ts +167 -1
- package/src/cli/repositories/ephemeral-workspace.ts +20 -30
- package/src/cli/repositories/git-command-executor.ts +2 -2
- package/src/cli/repositories/identity.ts +13 -0
- package/src/cli/repositories/registry.ts +145 -60
- package/src/cli/repositories/repository-snapshot.ts +53 -7
- package/src/cli/repositories/runtime-storage.ts +27 -2
- package/src/cli/repositories/safe-patch.ts +34 -38
- package/src/cli/repositories/selected-path-actions.ts +22 -2
- package/src/cli/repositories/structured-git.ts +167 -27
- package/src/cli/repository/session-cache.ts +92 -6
- package/src/cli/runtime/helper-runner.ts +7 -0
- package/src/cli/runtime-invocation.ts +8 -1
- package/src/cli/tools/codegraph.ts +44 -25
- package/src/core/adoption/manifest-templates.ts +1 -1
- package/src/core/adoption/plan.ts +3 -26
- package/src/core/adoption/workflow-contract-plan.ts +17 -9
- package/src/effects/process-runner.ts +8 -14
- package/src/runtime/context/assistant-context.ts +167 -0
- package/src/runtime/context/assistant-work-context.ts +209 -0
- package/src/runtime/context/automatic-learning.ts +565 -0
- package/src/runtime/context/codegraph-cache-boundary.ts +255 -0
- package/src/runtime/context/codegraph-read-provider.ts +55 -22
- package/src/runtime/context/codegraph-sidecar.cjs +8 -1
- package/src/runtime/context/cognitive-attention.ts +173 -0
- package/src/runtime/context/cognitive-skill-canary.ts +158 -0
- package/src/runtime/context/context-closure.ts +305 -0
- package/src/runtime/context/context-pack-process.ts +103 -0
- package/src/runtime/context/context-plane.ts +203 -0
- package/src/runtime/context/direct-controller-learning.ts +298 -0
- package/src/runtime/context/project-engineering-contract.ts +60 -0
- package/src/runtime/context/semantic-navigation-contract.ts +9 -0
- package/src/runtime/context/semantic-navigation.ts +6 -34
- package/src/runtime/context/typescript-navigation-process.ts +145 -0
- package/src/runtime/context/typescript-navigation.ts +89 -3
- package/src/runtime/control-plane/bootstrap/capability-provider.ts +74 -0
- package/src/runtime/control-plane/bootstrap/control-api.ts +57 -0
- package/src/runtime/control-plane/bootstrap/index.ts +5 -0
- package/src/runtime/control-plane/bootstrap/state-machine.ts +141 -0
- package/src/runtime/control-plane/bootstrap/store.ts +21 -0
- package/src/runtime/control-plane/bootstrap/types.ts +87 -0
- package/src/runtime/control-plane/cleanup-artifact-retention.ts +531 -0
- package/src/runtime/control-plane/codegraph-cache-retention.ts +164 -0
- package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +282 -0
- package/src/runtime/control-plane/execution/controller-authority-recovery.ts +380 -0
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +113 -16
- package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
- package/src/runtime/control-plane/execution/implementation-review-content.ts +95 -0
- package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
- package/src/runtime/control-plane/execution/retained-work-resume.ts +439 -102
- package/src/runtime/control-plane/execution/session-store.ts +31 -1
- package/src/runtime/control-plane/execution/validation.ts +34 -11
- package/src/runtime/control-plane/execution/work-authority-reconciler.ts +87 -0
- package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
- package/src/runtime/control-plane/execution/work-completion-authority.ts +31 -44
- package/src/runtime/control-plane/execution/work-delivery-service.ts +497 -0
- package/src/runtime/control-plane/execution/work-evidence-policy.ts +46 -53
- package/src/runtime/control-plane/execution/work-execution-support.ts +85 -164
- package/src/runtime/control-plane/execution/work-handle-authority.ts +349 -73
- package/src/runtime/control-plane/execution/work-handle-store.ts +55 -2
- package/src/runtime/control-plane/execution/work-head-settlement.ts +108 -0
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +173 -28
- package/src/runtime/control-plane/execution/work-operation-service.ts +92 -40
- package/src/runtime/control-plane/execution/work-preparation-service.ts +145 -269
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
- package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +543 -225
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +59 -45
- package/src/runtime/control-plane/execution/work-verification-context.ts +1 -1
- package/src/runtime/control-plane/execution/work-verification-service.ts +662 -52
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +205 -16
- package/src/runtime/control-plane/facade/capability-registry.ts +380 -44
- package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
- package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
- package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
- package/src/runtime/control-plane/facade/controller-session-store.ts +2 -488
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +6 -22
- package/src/runtime/control-plane/facade/goal-workloop.ts +565 -1202
- package/src/runtime/control-plane/facade/handoff-inbox-application.ts +145 -0
- package/src/runtime/control-plane/facade/handoff-inbox-store.ts +266 -52
- package/src/runtime/control-plane/facade/index.ts +4 -3
- package/src/runtime/control-plane/facade/operation-digest.ts +34 -73
- package/src/runtime/control-plane/facade/plan-contract-store.ts +671 -245
- package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
- package/src/runtime/control-plane/facade/repository-work-admission.ts +31 -23
- package/src/runtime/control-plane/facade/requirement-authority.ts +121 -0
- package/src/runtime/control-plane/facade/requirement-board.ts +9 -4
- package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +85 -0
- package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
- package/src/runtime/control-plane/facade/semantic-admission.ts +8 -16
- package/src/runtime/control-plane/facade/suggested-actions.ts +15 -15
- package/src/runtime/control-plane/facade/types.ts +218 -620
- package/src/runtime/control-plane/facade/work-continuation.ts +8 -8
- package/src/runtime/control-plane/facade/work-contract-store.ts +2 -1043
- package/src/runtime/control-plane/generated-cache-retention.ts +336 -19
- package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +13 -2
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +274 -84
- package/src/runtime/control-plane/global-scheduler/periodic-cleanup-entry.ts +55 -0
- package/src/runtime/control-plane/global-scheduler/periodic-cleanup-process.ts +98 -0
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -2
- package/src/runtime/control-plane/global-scheduler/scheduler-worker-entry.ts +10 -0
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +227 -109
- package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
- package/src/runtime/control-plane/global-scheduler/worker-launch.ts +18 -6
- package/src/runtime/control-plane/governance/access-policy.ts +19 -2
- package/src/runtime/control-plane/governance/authorization.ts +20 -3
- package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +160 -0
- package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +2 -177
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +139 -670
- package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
- package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +25 -6
- package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -194
- package/src/runtime/control-plane/lifecycle-retention-metrics.ts +60 -0
- package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
- package/src/runtime/control-plane/persistence/experience-store.ts +302 -0
- package/src/runtime/control-plane/persistence/operational-prior-store.ts +348 -0
- package/src/runtime/control-plane/persistence/requirement-store.ts +230 -80
- package/src/runtime/control-plane/persistence/sqlite-store.ts +654 -78
- package/src/runtime/control-plane/persistence/workflow-content-store.ts +98 -0
- package/src/runtime/control-plane/persistence/workflow-registry-store.ts +186 -0
- package/src/runtime/control-plane/persistence/workflow-run-store.ts +123 -0
- package/src/runtime/control-plane/release-retention.ts +154 -26
- package/src/runtime/control-plane/repository-namespace-retention.ts +208 -0
- package/src/runtime/control-plane/runtime-cleanup.ts +844 -38
- package/src/runtime/control-plane/runtime-generation.ts +6 -0
- package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
- package/src/runtime/control-plane/workspace/semantic-sync-service.ts +479 -0
- package/src/runtime/control-plane/workspace/workspace-store.ts +249 -0
- package/src/runtime/diagnostics/incident-repair.ts +573 -0
- package/src/runtime/diagnostics/mcp-timing.ts +239 -6
- package/src/runtime/diagnostics/performance.ts +6 -14
- package/src/runtime/diagnostics/read-only-tool.ts +1 -1
- package/src/runtime/evidence/artifact-store.ts +216 -35
- package/src/runtime/evidence/evidence-store.ts +112 -8
- package/src/runtime/evidence/operational-shadow.ts +38 -0
- package/src/runtime/evidence/output-handle-index.ts +225 -0
- package/src/runtime/evidence/process-check-receipt.ts +5 -43
- package/src/runtime/evidence/result-store.ts +158 -44
- package/src/runtime/evidence/sensitive-output.ts +4 -4
- package/src/runtime/execution/jobs/receipt-recovery.ts +1 -1
- package/src/runtime/execution/jobs/store.ts +124 -6
- package/src/runtime/execution/managed-workspace.ts +112 -5
- package/src/runtime/execution/process-runtime/canary.ts +19 -5
- package/src/runtime/execution/process-runtime/check-classification.ts +48 -0
- package/src/runtime/execution/process-runtime/check-facade.ts +24 -10
- package/src/runtime/execution/process-runtime/check-receipt.ts +1 -1
- package/src/runtime/execution/process-runtime/check-result-retention.ts +132 -0
- package/src/runtime/execution/process-runtime/check-result.ts +177 -2
- package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +58 -9
- package/src/runtime/execution/process-runtime/check-storage.ts +187 -0
- package/src/runtime/execution/process-runtime/command-facade.ts +117 -114
- package/src/runtime/execution/process-runtime/gc.ts +15 -2
- package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
- package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
- package/src/runtime/execution/process-runtime/index.ts +4 -0
- package/src/runtime/execution/process-runtime/interactive-admission.ts +2 -1
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +283 -73
- package/src/runtime/execution/process-runtime/persisted-check.ts +130 -23
- package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
- package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
- package/src/runtime/execution/process-runtime/resource-claims.ts +125 -64
- package/src/runtime/execution/process-runtime/runtime.ts +167 -17
- package/src/runtime/execution/process-runtime/store.ts +30 -2
- package/src/runtime/execution/process-runtime/types.ts +27 -0
- package/src/runtime/execution/workers/executor.ts +18 -19
- package/src/runtime/execution/workers/worker-entry.ts +1 -1
- package/src/runtime/gateway/mcp/execution-tools.ts +2 -207
- package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +2 -61
- package/src/runtime/gateway/mcp/persisted-check-process.ts +2 -3
- package/src/runtime/gateway/mcp/process-tools.ts +2 -289
- package/src/runtime/gateway/mcp/router.ts +2 -1125
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +2 -565
- package/src/runtime/gateway/mcp/runtime-tools.ts +2 -6655
- package/src/runtime/gateway/mcp/work-validation-reconciler.ts +2 -1
- package/src/runtime/maintenance/cleanup.ts +38 -24
- package/src/runtime/platform/browser-product-discovery.ts +174 -0
- package/src/runtime/platform/computer-platform.ts +14 -0
- package/src/runtime/platform/executable-discovery.ts +54 -0
- package/src/runtime/platform/fetch-http-server.ts +90 -0
- package/src/runtime/platform/service-inventory.ts +130 -0
- package/src/runtime/platform/service-manager.ts +146 -0
- package/src/runtime/platform/windows-host-discovery.ts +118 -0
- package/src/runtime/platform/windows-recovery-deployment.ts +67 -0
- package/src/runtime/plugins/action-application.ts +192 -0
- package/src/runtime/plugins/app-store-connect-adapter.ts +47 -35
- package/src/runtime/plugins/browser-adapter.ts +898 -135
- package/src/runtime/plugins/browser-automation-service.ts +33 -34
- package/src/runtime/plugins/browser-macos-bridge.ts +386 -46
- package/src/runtime/plugins/browser-manifest-surface.ts +75 -17
- package/src/runtime/plugins/browser-native-session-service.ts +64 -14
- package/src/runtime/plugins/browser-provider-registry.ts +2 -109
- package/src/runtime/plugins/browser-registration.ts +32 -0
- package/src/runtime/plugins/browser-runtime-contract.ts +2 -154
- package/src/runtime/plugins/browser-runtime.ts +55 -10
- package/src/runtime/plugins/browser-session-authority.ts +101 -291
- package/src/runtime/plugins/browser-session-legacy-migration.ts +203 -0
- package/src/runtime/plugins/browser-session-store.ts +243 -80
- package/src/runtime/plugins/browser-session-types.ts +2 -98
- package/src/runtime/plugins/capability-authorization-grants.ts +272 -59
- package/src/runtime/plugins/catalog-trust.ts +82 -0
- package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +219 -0
- package/src/runtime/plugins/computer-chatgpt-macos-target.ts +891 -0
- package/src/runtime/plugins/computer-registration.ts +1050 -0
- package/src/runtime/plugins/config-store.ts +119 -0
- package/src/runtime/plugins/desktop-operator-external-policy.ts +964 -0
- package/src/runtime/plugins/desktop-operator-registration.ts +123 -12
- package/src/runtime/plugins/errors.ts +8 -1
- package/src/runtime/plugins/external-adapter.ts +82 -323
- package/src/runtime/plugins/external-provider-policy.ts +48 -0
- package/src/runtime/plugins/external-registration.ts +30 -2
- package/src/runtime/plugins/external-unix-socket-probe.cjs +9 -3
- package/src/runtime/plugins/external-unix-socket.ts +64 -193
- package/src/runtime/plugins/first-party-external-registration.ts +163 -0
- package/src/runtime/plugins/first-party-registry.ts +3 -1
- package/src/runtime/plugins/github-adapter.ts +1 -2
- package/src/runtime/plugins/gmail-adapter.ts +29 -8
- package/src/runtime/plugins/google-calendar-adapter.ts +8 -8
- package/src/runtime/plugins/google-shared.ts +45 -53
- package/src/runtime/plugins/google-tasks-adapter.ts +8 -8
- package/src/runtime/plugins/ios-adapter.ts +2 -3
- package/src/runtime/plugins/lightweight-action.ts +208 -2
- package/src/runtime/plugins/local-system-adapter.ts +192 -2
- package/src/runtime/plugins/macos-capability-broker.ts +15 -105
- package/src/runtime/plugins/managed-process-adapter.ts +12 -5
- package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
- package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
- package/src/runtime/plugins/resend-adapter.ts +15 -24
- package/src/runtime/plugins/store.ts +1003 -387
- package/src/runtime/plugins/types.ts +28 -1
- package/src/runtime/plugins/uu-remote-rescue-registration.ts +155 -0
- package/src/runtime/plugins/windows-host-recovery-install.ts +68 -0
- package/src/runtime/plugins/windows-host-recovery-registration.ts +85 -0
- package/src/runtime/plugins/xiaohongshu-publish.ts +102 -430
- package/src/runtime/projections/controller-context.ts +12 -6
- package/src/runtime/projections/git-status-sampler.ts +73 -22
- package/src/runtime/projections/invalidation.ts +7 -3
- package/src/runtime/projections/materialized-view.ts +93 -43
- package/src/runtime/recovery/actions.ts +3 -3
- package/src/runtime/recovery/capability-action-application.ts +229 -0
- package/src/runtime/recovery/index.ts +3 -0
- package/src/runtime/recovery/lifecycle-inventory.ts +338 -0
- package/src/runtime/recovery/local-jobs-repair.ts +14 -14
- package/src/runtime/recovery/maintenance-executor.ts +701 -168
- package/src/runtime/recovery/quarantine-retention.ts +256 -0
- package/src/runtime/recovery/store.ts +29 -11
- package/src/runtime/release/identity.ts +6 -0
- package/src/runtime/release/release-coordinator.ts +296 -0
- package/src/runtime/release/release-session.ts +716 -0
- package/src/runtime/release/release-state-migration.ts +25 -0
- package/src/runtime/resources/leases/store.ts +56 -25
- package/src/runtime/root/active-execution-power-assertion.ts +139 -0
- package/src/runtime/root/assistant-learning-loop.ts +45 -0
- package/src/runtime/root/browser-session-composition.ts +59 -0
- package/src/runtime/root/computer-composition.ts +376 -0
- package/src/runtime/root/computer-target-composition.ts +16 -0
- package/src/runtime/root/computer-target-persistence.ts +39 -0
- package/src/runtime/root/controller-progression-composition.ts +192 -0
- package/src/runtime/root/controller-round-composition.ts +126 -0
- package/src/runtime/root/controller-services.ts +2 -0
- package/src/runtime/root/deployment-topology.ts +106 -0
- package/src/runtime/root/entry.ts +8 -6
- package/src/runtime/root/gateway-adapter.ts +3 -3
- package/src/runtime/root/known-good-recovery.ts +184 -0
- package/src/runtime/root/local-bridge.ts +5 -3
- package/src/runtime/root/mcp-transport.ts +116 -23
- package/src/runtime/root/ownership.ts +261 -9
- package/src/runtime/root/package-connector-service.ts +212 -74
- package/src/runtime/root/package-runtime-release.ts +199 -33
- package/src/runtime/root/package-runtime-service.ts +77 -108
- package/src/runtime/root/release-execution-canary.ts +103 -0
- package/src/runtime/root/release-loader.ts +150 -0
- package/src/runtime/root/release-manifest.ts +185 -7
- package/src/runtime/root/release-materialize.ts +474 -31
- package/src/runtime/root/release-store.ts +425 -37
- package/src/runtime/root/runtime-lane.ts +191 -0
- package/src/runtime/root/runtime.ts +379 -32
- package/src/runtime/root/scheduled-controller-composition.ts +76 -0
- package/src/runtime/root/scheduler.ts +12 -4
- package/src/runtime/root/service-runner.ts +3 -3
- package/src/runtime/root/service.ts +73 -45
- package/src/runtime/root/status.ts +49 -0
- package/src/runtime/root/types.ts +55 -3
- package/src/runtime/root/workflow-supervisor-composition.ts +493 -0
- package/src/runtime/root/workflow-supervisor-runtime.ts +209 -0
- package/src/runtime/root/write-fence.ts +50 -2
- package/src/runtime/safe-tooling/google-credential-store.ts +76 -21
- package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
- package/src/runtime/safe-tooling/workspace-auth.ts +1 -1
- package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
- package/src/runtime/shared/local-bridge-surface.ts +1 -1
- package/src/runtime/shared/process-environment.ts +36 -10
- package/src/runtime/shared/response-budget.ts +1 -3
- package/src/runtime/shared/storage-capacity.ts +68 -0
- package/src/runtime/standalone-recovery/controller-home-migration.ts +1108 -0
- package/src/runtime/standalone-recovery/core.ts +4609 -495
- package/src/runtime/standalone-recovery/entry.ts +642 -81
- package/src/runtime/standalone-recovery/independent-host-rescue.ts +172 -0
- package/src/runtime/standalone-recovery/installer.ts +399 -177
- package/src/runtime/standalone-recovery/mcp-server.ts +79 -0
- package/src/runtime/standalone-recovery/mutation-identity-contract.ts +21 -0
- package/src/runtime/standalone-recovery/operation-lock.ts +160 -0
- package/src/runtime/standalone-recovery/performance.ts +173 -0
- package/src/runtime/standalone-recovery/release.ts +58 -5
- package/src/runtime/standalone-recovery/service-labels.ts +5 -2
- package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
- package/src/runtime/watchdog/workflow-watchdog.ts +1 -1
- package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
- package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -4
- package/src/runtime/workflow/schedules/engine.ts +298 -484
- package/src/runtime/workflow/schedules/pending-activation.ts +1 -1
- package/src/runtime/workflow/schedules/settlement.ts +2 -191
- package/src/runtime/workflow/schedules/store.ts +2 -607
- package/src/runtime/workflow/schedules/types.ts +2 -127
- package/src/runtime/workflow/schedules/work-continuation.ts +220 -16
- package/src/runtime/workflows/first-party/xiaohongshu.ts +122 -0
- package/src/runtime/workflows/runtime.ts +482 -0
- package/src/testing/test-governance.ts +95 -30
- package/supervisor/chatgpt-conversation.ts +23 -0
- package/supervisor/client.ts +201 -0
- package/supervisor/control-plane.ts +868 -0
- package/supervisor/entry.ts +15 -0
- package/supervisor/forge-validators.ts +80 -0
- package/supervisor/index.ts +5 -0
- package/supervisor/native-browser-adapter.ts +786 -0
- package/supervisor/native-messaging/host.ts +39 -0
- package/supervisor/native-messaging/manifest.ts +26 -0
- package/supervisor/native-messaging/protocol.ts +27 -0
- package/supervisor/paths.ts +18 -0
- package/supervisor/protocol.ts +202 -0
- package/supervisor/server.ts +404 -0
- package/supervisor/store.ts +1451 -0
- package/supervisor/tsconfig.json +8 -0
- package/supervisor/types.ts +255 -0
- package/assets/templates/helpers/archive-architecture-request.sh +0 -244
- package/docs/architecture/history/README.md +0 -7
- package/docs/architecture/history/chatgpt-handoff-facade.md +0 -397
- package/docs/architecture/history/global-hook-runtime.md +0 -166
- package/docs/architecture/history/ios-semantic-automation-provider-v2.md +0 -170
- package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +0 -59
- package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +0 -63
- package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +0 -68
- package/docs/architecture/requests/archive/2026/root.md +0 -68
- package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +0 -76
- package/docs/architecture/requests/archive/2026/verification-evals-checks.md +0 -68
- package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +0 -69
- package/scripts/archive-architecture-request.sh +0 -4
- package/scripts/benchmark-background-check-overlap.ts +0 -228
- package/scripts/benchmark-controller-hotpath.ts +0 -212
- package/scripts/benchmark-controller-round2.ts +0 -139
- package/scripts/benchmark-ios-agent-device.ts +0 -514
- package/scripts/benchmark-mcp-host.sh +0 -117
- package/scripts/benchmark-mcp-transport.ts +0 -170
- package/scripts/benchmark-quality-harness.ts +0 -146
- package/scripts/benchmark-route-session-concurrency.ts +0 -915
- package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
- package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
- package/scripts/benchmark-thin-harness.ts +0 -251
- package/scripts/benchmark-typescript-navigation.ts +0 -186
- package/scripts/benchmark-work-efficiency.ts +0 -334
- package/scripts/build-controller-ui.ts +0 -28
- package/scripts/check-npm-release.sh +0 -32
- package/scripts/check-public-release-surface.sh +0 -19
- package/scripts/check-release-published.sh +0 -57
- package/scripts/check-release-readiness.sh +0 -37
- package/scripts/check-release-version.mjs +0 -74
- package/scripts/check-tarball-install-smoke.sh +0 -67
- package/scripts/package-source-archive.sh +0 -147
- package/scripts/public-release-files.txt +0 -39
- package/scripts/public-release.ts +0 -174
- package/scripts/publish-release-tarball.sh +0 -27
- package/scripts/route-nl-vs-ts-eval.ts +0 -679
- package/scripts/run-skill-evals.ts +0 -1022
- package/scripts/stage-runtime-release.ts +0 -39
- package/src/cli/controller/progress.ts +0 -656
- package/src/cli/controller/work-mode.ts +0 -181
- package/src/cli/local-bridge/console-assets.ts +0 -17
- package/src/cli/local-bridge/dashboard.ts +0 -17
- package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
- package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
- package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
- package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
- package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
- package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
- package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
- package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
- package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
- package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/styles.css +0 -28
- package/src/cli/local-bridge/frontend/src/types.ts +0 -15
- package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
- package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
- package/src/cli/local-bridge/ui-dist/app.css +0 -1
- package/src/cli/local-bridge/ui-dist/app.js +0 -11228
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -385
- package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -1913
- package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
- package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -449
- package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -1118
- package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -93
- package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
- package/src/runtime/control-plane/routing/index.ts +0 -1
- package/src/runtime/control-plane/routing/route-policy.ts +0 -382
- package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
# ControllerRound uses one provider-neutral transition policy
|
|
2
|
+
|
|
3
|
+
Status: Accepted design contract for PLAN-forge-v2-assistant-loop-execution-degradation-20260907-r3.
|
|
4
|
+
|
|
5
|
+
## Decision
|
|
6
|
+
|
|
7
|
+
Every durable ControllerRound lifecycle mutation MUST pass through one provider-neutral Kernel transition policy. Scheduler, Launcher, MCP compatibility, ChatGPT/Browser adapters, recovery jobs, Runtime bootstrap/restart code and provider hosts may only:
|
|
8
|
+
|
|
9
|
+
1. observe durable state,
|
|
10
|
+
2. submit a typed lifecycle event plus bounded fenced evidence,
|
|
11
|
+
3. perform an external effect explicitly authorized by the returned transition/effect intent, and
|
|
12
|
+
4. persist only the transition decision produced by the canonical policy.
|
|
13
|
+
|
|
14
|
+
They MUST NOT directly invent status changes, clear blocker strings, reset budgets, rotate round authority, promote dispatch outcome, reopen waits, or create provider-specific recovery exceptions. Provider-specific facts are translated into provider-neutral evidence before reaching the Kernel.
|
|
15
|
+
|
|
16
|
+
The canonical owner belongs under `packages/kernel/controller/**`. Persistence remains atomic/CAS guarded, but persistence is an executor of the policy decision rather than a second lifecycle authority.
|
|
17
|
+
|
|
18
|
+
## Why
|
|
19
|
+
|
|
20
|
+
The existing lifecycle has ten relay statuses and four lifecycle stages, but transition authority is distributed across initial launch, dispatch settlement, claim acknowledgement, stalled recovery, explicit authority recovery, disposition submission, release handling, successor handoff and terminal cleanup. `blocked` additionally carries several unrelated meanings. Local guards are individually sensible but the combined system permits gaps, duplicated recovery rules and route-dependent semantics.
|
|
21
|
+
|
|
22
|
+
The fix is not another blocked-reason branch. The invariant is one lifecycle decision authority.
|
|
23
|
+
|
|
24
|
+
## Durable state classes
|
|
25
|
+
|
|
26
|
+
| Class | Relay status | Meaning | Automatic recovery |
|
|
27
|
+
| --- | --- | --- | --- |
|
|
28
|
+
| Open execution | `dispatching`, `dispatched`, `claimed`, `pending_release` | One semantic round is still mechanically open or closing | Yes, only idempotent recovery of the same semantic round |
|
|
29
|
+
| Semantic pause | `waiting`, `waiting_for_user` | Controller intentionally stopped semantic progression | No stalled-time recovery; requires an explicit legal event |
|
|
30
|
+
| Semantic terminal | `goal_complete`, `handed_off` | This lineage node is semantically closed | Never automatically reopened |
|
|
31
|
+
| Failure/fuse | `failed`, `blocked` | Mechanical failure or an explicit policy fuse | Only according to typed failure class and matching evidence |
|
|
32
|
+
|
|
33
|
+
`lifecycleStage` remains orthogonal evidence of the semantic boundary:
|
|
34
|
+
|
|
35
|
+
- `dispatching`
|
|
36
|
+
- `dispatch_confirmed`
|
|
37
|
+
- `controller_claimed`
|
|
38
|
+
- `semantic_round_closed`
|
|
39
|
+
|
|
40
|
+
A status and lifecycle stage combination not admitted by the transition policy is invalid durable state and must fail closed.
|
|
41
|
+
|
|
42
|
+
## Canonical event model
|
|
43
|
+
|
|
44
|
+
External layers submit events, never target statuses. The exact TypeScript names may differ during implementation, but the semantics are frozen here.
|
|
45
|
+
|
|
46
|
+
| Event | Required evidence | Policy responsibility |
|
|
47
|
+
| --- | --- | --- |
|
|
48
|
+
| `occurrence_requested` | occurrence identity, origin, Work/Requirement state, caller authority | Decide whether this is a legal genuinely new occurrence or an illegal fuse/wait bypass |
|
|
49
|
+
| `provider_dispatch_succeeded` | exact round authority + relay scope + provider dispatch receipt/effect identity | Confirm dispatch, clear only provider-dispatch failure state for this round |
|
|
50
|
+
| `provider_dispatch_failed` | exact round identity + classified failure evidence | Increment provider-failure budget and choose retry/fail/fuse |
|
|
51
|
+
| `provider_dispatch_outcome_unknown` | exact effect identity, no contradictory settlement | Enter outcome-unknown reconciliation state; never blind replay |
|
|
52
|
+
| `provider_effect_reconciled` | exact previously unknown effect identity + confirmed executed/not-executed evidence | Confirm existing dispatch or authorize a new dispatch only when absence is proven |
|
|
53
|
+
| `controller_claim_observed` | active ControllerSession ownership + exact round authority/scope | Move the same round to claimed; never create a new semantic round |
|
|
54
|
+
| `semantic_disposition_submitted` | exact claimed round identity + disposition + required handoff/evidence | Close semantic round and consume semantic budgets exactly once |
|
|
55
|
+
| `controller_release_observed` | exact released controller epoch + already persisted disposition | Mechanically continue post-disposition flow without re-submitting disposition |
|
|
56
|
+
| `successor_bound` | completed predecessor + already-admitted successor lineage | Atomically close predecessor relay and create successor round according to authority rule |
|
|
57
|
+
| `stalled_round_observed` | exact current relay revision, liveness evidence, no active conflicting execution/claim | Recover only an unfinished open mechanical transition; elapsed time is never semantic evidence |
|
|
58
|
+
| `semantic_state_changed` | new mechanical/semantic fingerprint tied to exact relay lineage | May rearm `repeated_state`; cannot clear unrelated fuse classes |
|
|
59
|
+
| `provider_environment_recovered` | exact blocked relay revision + verified provider/runtime capability evidence + failure-class match | May rearm `consecutive_failures` for the same undispatched round without consuming another semantic round |
|
|
60
|
+
| `user_resume_requested` | explicit user authority + exact paused/failure lineage | Resume only states whose policy explicitly permits user resume |
|
|
61
|
+
| `terminal_work_observed` | failed/cancelled Work + no active claim | Retire surviving relay mechanically; never fabricate semantic completion |
|
|
62
|
+
| `authority_recovery_requested` | explicit authorized recovery + no active execution/claim + exact current relay | Rekey capability only where policy permits; never change semantic budgets |
|
|
63
|
+
| `runtime_or_session_evicted` | durable round still current, transport/session gone | Preserve semantic round and authority unless an explicit authority-recovery rule applies |
|
|
64
|
+
|
|
65
|
+
## Blocked policy is typed, not a free-form string switch
|
|
66
|
+
|
|
67
|
+
`blockedReason` may remain as a compatibility projection, but policy decisions use a typed blocker class. At minimum:
|
|
68
|
+
|
|
69
|
+
| Blocker class | Meaning | Legal exit | Budget behavior | Authority behavior |
|
|
70
|
+
| --- | --- | --- | --- | --- |
|
|
71
|
+
| `repeated_state` | semantic continuation repeated without meaningful state progress | `semantic_state_changed` with a changed exact fingerprint | reset repeated-state counter only; round/provider-failure budgets preserved | same semantic-round authority when rearming the same undispatched/claimed lineage |
|
|
72
|
+
| `provider_unavailable` / `consecutive_failures` | provider/runtime path repeatedly failed before successful progression | `provider_environment_recovered` with exact relay and verified environment/provider evidence | provider failure streak may start a new recovery epoch; historical failures remain auditable; round/repeated budgets unchanged | preserve authority for the same undispatched semantic round |
|
|
73
|
+
| `round_budget_exhausted` | hard semantic continuation budget reached | no automatic exit; only explicit higher-level replanning/new authorized occurrence that does not pretend to be the same exhausted round | never reset because time passed or provider recovered | old round authority cannot be reused as a fresh semantic round |
|
|
74
|
+
| `provider_dispatch_outcome_unknown` | provider effect may already have happened | exact `provider_effect_reconciled`; positive evidence confirms existing effect, negative evidence may authorize one new dispatch | no blind retry; no semantic-round budget duplication | preserve same authority/effect identity until reconciled |
|
|
75
|
+
| `provider_user_action_required` | provider needs human/auth action | explicit user/handoff resolution followed by legal resume event | no background retry budget churn | same lineage; new semantic round only if policy says the resolved occurrence is new |
|
|
76
|
+
|
|
77
|
+
No generic `blocked -> dispatching` transition exists.
|
|
78
|
+
|
|
79
|
+
For the ChatGPT Controller provider, `provider_environment_recovered` is admitted only through exact ControllerRound authority plus a fresh non-semantic provider probe. The probe must use the same runtime provider selection as ordinary Controller dispatch, must not replay the blocked Work prompt, and must produce a server-authored durable Recovery audit record only after dispatch is confirmed. The audit identity is recovery evidence, not a second lifecycle authority: the Kernel still performs the exact relay-scope/authority/CAS checks and the canonical `provider_environment_recovered` transition. Failed, ambiguous, user-action-required, stale, or mismatched probes cannot rearm the fuse. MCP compatibility may expose this as a bounded repair intent, but it must not duplicate `controller.authority.recover` or invent a provider-specific round state.
|
|
80
|
+
|
|
81
|
+
## Budget contract
|
|
82
|
+
|
|
83
|
+
ControllerRound has three independent budget dimensions. No code path may use one to reset another.
|
|
84
|
+
|
|
85
|
+
### `roundCount`
|
|
86
|
+
|
|
87
|
+
Counts semantic `continue_immediately` progression rounds, not transport retries, Runtime restarts, claim migration, release recovery, provider recovery, outcome reconciliation or stalled-transition repair. It is consumed exactly once at semantic close/open according to the canonical policy.
|
|
88
|
+
|
|
89
|
+
### `repeatedStateCount`
|
|
90
|
+
|
|
91
|
+
Measures semantic continuation without meaningful state fingerprint progress. It resets only when policy observes a changed canonical semantic/mechanical fingerprint. Provider health changes alone do not reset it.
|
|
92
|
+
|
|
93
|
+
### Provider failure budget
|
|
94
|
+
|
|
95
|
+
Tracks failed provider dispatch/recovery attempts for the exact provider-neutral dispatch responsibility. A verified environment/provider repair may begin a bounded recovery epoch for the same semantic round, but must not erase historical failure evidence or change `roundCount`/`repeatedStateCount`. The implementation may store a typed recovery epoch or derive it from immutable evidence; either way, `consecutiveFailures = 0` alone is not sufficient evidence of recovery.
|
|
96
|
+
|
|
97
|
+
Time passage is never a budget reset signal.
|
|
98
|
+
|
|
99
|
+
## Authority contract
|
|
100
|
+
|
|
101
|
+
There are distinct authorities and they must not be conflated:
|
|
102
|
+
|
|
103
|
+
- `authorityId`: opaque per-semantic-round ControllerRound capability.
|
|
104
|
+
- `relayScopeId`: durable semantic lineage scope.
|
|
105
|
+
- `claimGeneration`: ControllerSession ownership epoch.
|
|
106
|
+
- provider effect/dispatch identity: evidence identity for an external effect, never Controller authority.
|
|
107
|
+
- MCP/browser/session ids: transport identities only.
|
|
108
|
+
|
|
109
|
+
Rules:
|
|
110
|
+
|
|
111
|
+
1. The same undispatched semantic round keeps `authorityId` through transport loss, Runtime restart, MCP eviction, stalled mechanical recovery and verified provider/environment recovery.
|
|
112
|
+
2. A genuinely new semantic round rotates `authorityId`.
|
|
113
|
+
3. Successor Work handoff creates the successor round under the same relay lineage and rotates to a new round capability.
|
|
114
|
+
4. Claim/session migration changes ControllerSession identity/`claimGeneration`, not semantic round identity.
|
|
115
|
+
5. Explicit authority recovery is a separate fenced capability-rekey operation. It must not silently consume a new round or reset budgets.
|
|
116
|
+
6. Provider, Browser and MCP adapters can never mint lifecycle authority by presenting a transport/session id.
|
|
117
|
+
|
|
118
|
+
## Fresh occurrence rule
|
|
119
|
+
|
|
120
|
+
`launcher_start` or a schedule/manual trigger is not automatically proof of a fresh semantic occurrence. The transition policy must classify `occurrence_requested` against the latest lineage.
|
|
121
|
+
|
|
122
|
+
A new occurrence is legal only when the prior semantic state and trigger contract explicitly allow it, for example a designed future schedule occurrence after a semantic `wait`, or an explicit higher-level user/replan action after a recoverable failure.
|
|
123
|
+
|
|
124
|
+
A launch request MUST NOT bypass:
|
|
125
|
+
|
|
126
|
+
- `round_budget_exhausted`,
|
|
127
|
+
- an unresolved `provider_dispatch_outcome_unknown`,
|
|
128
|
+
- `waiting_for_user`,
|
|
129
|
+
- `goal_complete`,
|
|
130
|
+
- `handed_off`, or
|
|
131
|
+
- a `consecutive_failures` fuse that lacks verified provider/environment recovery evidence.
|
|
132
|
+
|
|
133
|
+
Whether ordinary `waiting` permits a later scheduled occurrence is determined by the Schedule/occurrence contract and an explicit occurrence identity, not merely because `beginInitialControllerRoundDispatch` was called again.
|
|
134
|
+
|
|
135
|
+
## Legal lifecycle skeleton
|
|
136
|
+
|
|
137
|
+
The policy must preserve this semantic ordering while allowing idempotent retries of each mechanical edge:
|
|
138
|
+
|
|
139
|
+
```text
|
|
140
|
+
legal new occurrence
|
|
141
|
+
-> dispatching
|
|
142
|
+
-> dispatched (or blocked/failed/waiting_for_user by typed provider outcome)
|
|
143
|
+
-> claimed
|
|
144
|
+
-> semantic disposition
|
|
145
|
+
continue_immediately -> pending_release -> release -> next dispatching/new authority
|
|
146
|
+
wait -> waiting
|
|
147
|
+
wait_for_user -> waiting_for_user
|
|
148
|
+
goal_complete -> goal_complete
|
|
149
|
+
|
|
150
|
+
completed predecessor + admitted successor
|
|
151
|
+
-> predecessor handed_off + successor dispatching (atomic lineage transition)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Recovery never skips semantic edges. It only completes or replays an idempotent mechanical edge of the same semantic decision.
|
|
155
|
+
|
|
156
|
+
## Persistence boundary
|
|
157
|
+
|
|
158
|
+
The transition policy consumes an immutable current snapshot plus one event and returns one of:
|
|
159
|
+
|
|
160
|
+
- `accept`: exact next relay record and optional external-effect intent,
|
|
161
|
+
- `no_op`: idempotent duplicate with the already-authoritative record,
|
|
162
|
+
- `reject`: stable reason/error code,
|
|
163
|
+
- `needs_evidence`: missing exact evidence required to decide safely.
|
|
164
|
+
|
|
165
|
+
The store applies accepted decisions under the relay-scope lock / transaction using the expected record revision. External effects occur only where the policy explicitly emits an effect intent. After the effect, the adapter submits its receipt as a new event; it never writes the post-effect relay state directly.
|
|
166
|
+
|
|
167
|
+
This separates lifecycle decision authority from persistence and provider execution while preserving CAS fencing.
|
|
168
|
+
|
|
169
|
+
## Crash-window contract
|
|
170
|
+
|
|
171
|
+
Each window has exactly one legal recovery interpretation.
|
|
172
|
+
|
|
173
|
+
| Crash window | Durable fact | Recovery rule | Forbidden shortcut |
|
|
174
|
+
| --- | --- | --- | --- |
|
|
175
|
+
| before provider dispatch starts | `dispatching`, no effect receipt | same-round dispatch may be authorized by policy | rotate authority or increment semantic round |
|
|
176
|
+
| after provider may have acted but before receipt persistence | effect outcome uncertain | enter/reconcile exact outcome-unknown identity | blind replay |
|
|
177
|
+
| after dispatch receipt, before relay becomes `dispatched` | durable receipt exists | replay `provider_dispatch_succeeded` idempotently | send provider effect again |
|
|
178
|
+
| after `dispatched`, before Controller claim | dispatch confirmed | claim same round from exact ownership evidence | create fresh occurrence |
|
|
179
|
+
| after claim persistence, before prompt/controller observes response | claimed + live/recoverable ownership | duplicate claim is no-op/migration if fenced | consume another round |
|
|
180
|
+
| after semantic disposition persistence, before controller release | `pending_release`/semantic terminal | retry release/post-disposition mechanics only | resubmit disposition |
|
|
181
|
+
| after controller release, before next round creation | closed disposition + released exact epoch | create/restore exactly one next round according to disposition | repeat prior round close |
|
|
182
|
+
| during predecessor/successor handoff | transaction must contain both lineage writes or neither | retry atomic handoff | independently mutate predecessor and successor |
|
|
183
|
+
| Runtime restart | durable relay survives transport | reconstruct from durable state and same round authority | treat restart as fresh occurrence |
|
|
184
|
+
| MCP/session eviction | transport lost only | reclaim/migrate ControllerSession if fenced; preserve relay identity | use new MCP session as authority |
|
|
185
|
+
|
|
186
|
+
## Fault-injection matrix frozen for the next Plan step
|
|
187
|
+
|
|
188
|
+
The implementation step must add focused failures at least at:
|
|
189
|
+
|
|
190
|
+
1. crash before provider call,
|
|
191
|
+
2. provider call succeeds but receipt write is lost,
|
|
192
|
+
3. receipt exists but `dispatched` transition is lost,
|
|
193
|
+
4. `dispatched` exists but claim response is lost,
|
|
194
|
+
5. claim persists then Runtime/MCP restarts,
|
|
195
|
+
6. disposition persists then release fails,
|
|
196
|
+
7. release persists then next-round creation fails,
|
|
197
|
+
8. successor handoff crashes between predecessor/successor writes,
|
|
198
|
+
9. repeated-state block with unchanged fingerprint,
|
|
199
|
+
10. repeated-state block with changed fingerprint,
|
|
200
|
+
11. provider failures reach fuse,
|
|
201
|
+
12. verified provider/environment recovery for that exact fuse,
|
|
202
|
+
13. stale/mismatched provider recovery evidence,
|
|
203
|
+
14. outcome-unknown positive reconciliation,
|
|
204
|
+
15. outcome-unknown proven-not-executed reconciliation,
|
|
205
|
+
16. hard round-budget exhaustion,
|
|
206
|
+
17. waiting scheduled occurrence with explicit occurrence identity,
|
|
207
|
+
18. waiting_for_user without explicit user/handoff resolution,
|
|
208
|
+
19. goal_complete/handed_off relaunch attempt,
|
|
209
|
+
20. failed/cancelled Work terminal cleanup with and without active claim.
|
|
210
|
+
|
|
211
|
+
Assertions must cover status, lifecycleStage, `roundCount`, `repeatedStateCount`, provider-failure epoch/history, `authorityId`, `claimGeneration`, provider dispatch/effect receipt identity, duplicate-effect count and durable revision/CAS behavior.
|
|
212
|
+
|
|
213
|
+
## ControllerRound validation Supervisor Work acceptance sequence
|
|
214
|
+
|
|
215
|
+
Here, “Supervisor” is the historical name of the existing long-lived **ControllerRound validation Work lineage**. It is not the cross-assistant-turn Workflow Supervisor defined by `20260916-workflow-supervisor-authority.md` and owns no outer WorkflowRun scheduling authority.
|
|
216
|
+
|
|
217
|
+
Production validation uses that existing ControllerRound validation Work lineage. It may not manufacture a new Work/Requirement/relay to make the test pass.
|
|
218
|
+
|
|
219
|
+
1. Build and activate one exact candidate Runtime containing the transition policy.
|
|
220
|
+
2. Verify required provider/plugin capability on that installed Runtime before relay mutation.
|
|
221
|
+
3. Re-read the exact existing ControllerRound validation Supervisor Work, Requirement, relay scope, authority, blocked class, budgets and current record revision.
|
|
222
|
+
4. Submit verified provider/environment recovery evidence for the existing `consecutive_failures` block.
|
|
223
|
+
5. Prove the same semantic round is rearmed without changing `roundCount`, `repeatedStateCount`, relay scope or per-round authority, and without erasing historical failure evidence.
|
|
224
|
+
6. Prove provider dispatch occurs at most once and exact Controller claim succeeds.
|
|
225
|
+
7. Let ChatGPT submit its semantic disposition.
|
|
226
|
+
8. Prove at least one `continue_immediately -> pending_release -> controller release -> successor/next dispatch` sequence completes automatically without a human sending `继续`.
|
|
227
|
+
9. Verify round authority rotates only at the true new-round boundary and no duplicate disposition/provider effect exists.
|
|
228
|
+
10. Only after this sequence may the Automatic Progression acceptance step be considered complete.
|
|
229
|
+
|
|
230
|
+
## Required implementation shape
|
|
231
|
+
|
|
232
|
+
The next Plan step must converge existing mutation helpers onto one policy rather than wrapping the old special cases with another layer of exceptions. A suitable shape is:
|
|
233
|
+
|
|
234
|
+
```ts
|
|
235
|
+
type ControllerRoundEvent = ... // provider-neutral typed events
|
|
236
|
+
type ControllerRoundTransitionDecision = Accept | NoOp | Reject | NeedsEvidence
|
|
237
|
+
|
|
238
|
+
function decideControllerRoundTransition(
|
|
239
|
+
current: ControllerRoundAggregateSnapshot,
|
|
240
|
+
event: ControllerRoundEvent,
|
|
241
|
+
): ControllerRoundTransitionDecision
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Existing public helpers may remain as compatibility facades during migration, but they become thin event builders around the canonical policy. Scheduler, Launcher, MCP and provider adapters must contain no independent status/blocker transition tables after convergence.
|
|
245
|
+
|
|
246
|
+
## Explicit non-solutions
|
|
247
|
+
|
|
248
|
+
Do not:
|
|
249
|
+
|
|
250
|
+
- add a one-off `consecutive_failures` rearm branch,
|
|
251
|
+
- raise `maxFailures`/`maxRounds`,
|
|
252
|
+
- clear durable counters or edit SQLite by hand,
|
|
253
|
+
- use elapsed time as provider recovery proof,
|
|
254
|
+
- treat Browser/ChatGPT registration as Kernel-specific lifecycle logic,
|
|
255
|
+
- infer successful dispatch from a transport session id,
|
|
256
|
+
- reopen semantic terminal states from stalled recovery,
|
|
257
|
+
- create another ControllerRound validation Supervisor Work/relay to avoid the blocked lineage, or
|
|
258
|
+
- keep parallel mutation tables in Scheduler/Launcher/MCP while claiming a central policy exists.
|
|
259
|
+
|
|
260
|
+
This ADR is the acceptance authority for the r3 ControllerRound recovery-convergence implementation.
|
|
261
|
+
|
|
262
|
+
## Explicit migration map from current implementation
|
|
263
|
+
|
|
264
|
+
Current `controller-round-store.ts` exposes ten lifecycle mutators and contains fifteen direct ControllerRound persistence write sites. Migration is complete only when these entry points no longer contain independent lifecycle decision tables.
|
|
265
|
+
|
|
266
|
+
| Current helper | Compatibility role after convergence | Policy event / responsibility |
|
|
267
|
+
| --- | --- | --- |
|
|
268
|
+
| `bindControllerRoundSuccessorWork` | thin facade | submit `successor_bound`; policy validates predecessor/successor lineage and atomic handoff eligibility |
|
|
269
|
+
| `submitControllerRoundDisposition` | thin facade | submit `semantic_disposition_submitted`; all semantic-close budget/status decisions move to policy |
|
|
270
|
+
| `beginInitialControllerRoundDispatch` | thin facade | submit `occurrence_requested`; policy decides whether occurrence is genuinely new and legal |
|
|
271
|
+
| `beginControllerRoundRelayAfterRelease` | thin facade | submit `controller_release_observed`; policy chooses same-lineage next-round transition and authority rotation |
|
|
272
|
+
| `reconcileControllerRoundAfterAbandonedRelease` | thin facade | submit released-without-disposition evidence; policy chooses mechanical failure/retirement only |
|
|
273
|
+
| `reconcileControllerRoundAfterTerminalWork` | thin facade | submit `terminal_work_observed`; policy retires failed/cancelled Work relay only |
|
|
274
|
+
| `finishControllerRoundRelayDispatch` | thin facade | submit one of dispatch succeeded/failed/outcome-unknown/user-action events; no local status ternary remains |
|
|
275
|
+
| `acknowledgeControllerRoundClaim` | thin facade | submit `controller_claim_observed`; repeated-state/outcome-unknown recovery must not live in claim code |
|
|
276
|
+
| `recoverControllerRoundRelayAuthority` | thin facade | submit `authority_recovery_requested`; policy validates state and emits capability rekey only |
|
|
277
|
+
| `claimStalledControllerRoundRelays` | scanner/orchestrator only | identify candidates and submit `stalled_round_observed` / evidence events; it must not write recovered relay states itself |
|
|
278
|
+
|
|
279
|
+
### Persistence convergence
|
|
280
|
+
|
|
281
|
+
The current store has fifteen `writeControlPlaneRecord*` call sites associated with these lifecycle paths. The target is not necessarily one physical SQL statement, because successor handoff legitimately needs a two-record transaction, but there must be **one logical apply authority**:
|
|
282
|
+
|
|
283
|
+
- ordinary single-relay transitions go through one `applyControllerRoundTransitionDecision(...)` persistence executor;
|
|
284
|
+
- predecessor/successor handoff goes through one atomic `applyControllerRoundHandoffDecision(...)` executor produced by the same policy;
|
|
285
|
+
- no public mutation facade calls `writeControlPlaneRecord*` after making its own status/budget/blocker decision.
|
|
286
|
+
|
|
287
|
+
### Outer-layer convergence
|
|
288
|
+
|
|
289
|
+
Current outer composition demonstrates why this is necessary:
|
|
290
|
+
|
|
291
|
+
- `chatgpt-round-continuation.ts` currently composes initial dispatch, dispatch finish, claim acknowledgement, disposition and release/next-round helpers; after migration it orchestrates provider effects around policy events only.
|
|
292
|
+
- Scheduler maintenance currently claims stalled relays and directly records dispatch success/failure; after migration it scans/authorizes wake, performs the provider effect intent, then submits the resulting receipt event.
|
|
293
|
+
- MCP runtime tools currently invoke claim, disposition, release, launch and dispatch settlement helpers directly; after migration MCP is a compatibility/event translation surface only.
|
|
294
|
+
- ChatGPT/Browser provider adapters remain responsible for provider-specific observation and effect execution, never lifecycle status selection.
|
|
295
|
+
|
|
296
|
+
### Completion assertion
|
|
297
|
+
|
|
298
|
+
A static regression should fail if Scheduler, Launcher, MCP compatibility or provider adapters acquire a new direct ControllerRound status/blocker mutation table or write ControllerRound relay records outside the canonical apply executor. This is an architecture boundary, not a code-style preference.
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
## Workflow Supervisor boundary clarification
|
|
302
|
+
|
|
303
|
+
ControllerRound transition authority remains lower-layer execution authority. Any provider-observed `controller_turn_settled` event in this ADR is a mechanical liveness fallback for an exact claimed round. It must not be reused as the outer Workflow Supervisor's assistant-message commit event or next-turn scheduling authority. The latter requires the completed `FORGE_WORKFLOW_SUPERVISOR_V1` block, exact END marker, conversation identity and causal submission-effect evidence defined in [`20260916-workflow-supervisor-authority.md`](20260916-workflow-supervisor-authority.md).
|
|
304
|
+
|
|
305
|
+
## 2026-09-16 amendment: settled Controller turns cannot silently strand nonterminal Work
|
|
306
|
+
|
|
307
|
+
User-free continuation is a P0 lifecycle invariant. A provider may submit a typed `controller_turn_settled` fact only after the exact assistant turn is observably complete; prompt submission itself is not completion evidence. The provider supplies bounded completion evidence, never a disposition.
|
|
308
|
+
|
|
309
|
+
The canonical ControllerRound transition policy decides the consequence. If the current round is still `claimed`, its Work is nonterminal, and no explicit stop state exists, the policy records the existing `continue_immediately -> pending_release` lifecycle while preserving round/repeated/failure budgets. If an active control-plane Handoff proves a user decision is required, the same policy closes as `wait_for_user`. If `wait`, `wait_for_user`, `goal_complete`, `blocked`, `failed`, or another already-closed state won the race first, settled-turn replay is idempotent and changes nothing. Terminal Work is retired through the existing terminal-work transition.
|
|
310
|
+
|
|
311
|
+
This amendment does not create a second Scheduler or semantic Controller. It changes the default for one previously ambiguous state only: **a completed Controller turn may not leave a still-running Work silently claimed merely because the model failed to call the explicit continue helper.** The provider-specific observation and same-conversation dispatch mechanics remain adapter responsibilities, while all durable lifecycle mutation continues through this provider-neutral policy.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Runtime maintenance diagnosis uses bounded read-side inventory
|
|
2
|
+
|
|
3
|
+
Status: Accepted and implemented on 2026-09-07.
|
|
4
|
+
|
|
5
|
+
## Problem
|
|
6
|
+
|
|
7
|
+
Runtime maintenance diagnosis had three multiplicative costs on repositories with long-lived Controller history:
|
|
8
|
+
|
|
9
|
+
- stale EditSession discovery called `reconcileEditSession` for every open-like candidate, which hashes tracked after-images, runs Git dirty-path inspection, and may persist reconciliation metadata;
|
|
10
|
+
- every stale Work/EditSession independently reloaded active Plans, Schedules, Controller ownership and up to 500 Process history records;
|
|
11
|
+
- stale Work repository source inspection ran before the visible `maxCandidates` bound, so expensive Git status/revision/containment checks could exceed the advertised candidate budget.
|
|
12
|
+
|
|
13
|
+
On the real Forge Controller Home with 637 WorkContracts and 388 EditSessions, the observed maintenance diagnosis path took roughly 25–35 seconds.
|
|
14
|
+
|
|
15
|
+
## Decision
|
|
16
|
+
|
|
17
|
+
Maintenance status discovery is inventory, not repair:
|
|
18
|
+
|
|
19
|
+
1. Resolve the existing repository runtime-storage binding first, then build one bounded authority snapshot for the status pass.
|
|
20
|
+
2. Reuse Work, live Controller session, active Plan, Requirement, Schedule and Process ownership facts across all candidates in that pass.
|
|
21
|
+
3. Read active Process authority from Process Runtime's recoverable index instead of enumerating terminal Process history.
|
|
22
|
+
4. EditSession discovery reads summary/ownership metadata only. Workspace hashing, Git dirty checks, supersession and finalization occur only in explicit maintenance for a selected candidate.
|
|
23
|
+
5. Sort and bound stale Work candidates before repository source Git inspection.
|
|
24
|
+
6. Destructive stale-Work maintenance re-reads current authority at its mutation boundary; the status snapshot never becomes mutation authority.
|
|
25
|
+
|
|
26
|
+
The snapshot is a derived in-memory view for one diagnosis call. It is not persisted and is not a second lifecycle authority.
|
|
27
|
+
|
|
28
|
+
## Verification
|
|
29
|
+
|
|
30
|
+
After implementation on the same real Controller data set:
|
|
31
|
+
|
|
32
|
+
- `buildRuntimeMaintenanceStatus`: 563.8 ms for 200 returned candidates;
|
|
33
|
+
- legacy `listProcessRecords(..., 500)`: 729.82 ms for 500 historical records;
|
|
34
|
+
- `listRecoverableProcessRecords`: 2.82 ms for the active/recoverable index in the same repository;
|
|
35
|
+
- targeted maintenance semantic regressions: 5 passed, 0 failed;
|
|
36
|
+
- Direct Edit / EditSession continuity consumers: 28 passed, 0 failed;
|
|
37
|
+
- `package:check:type`: passed.
|
|
38
|
+
|
|
39
|
+
The 25–35 second diagnosis regression is therefore removed without lowering lifecycle gates or hiding candidates.
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
# Workflow Supervisor authority above the ChatGPT-turn / Forge execution boundary
|
|
2
|
+
|
|
3
|
+
Status: **Accepted architecture contract; production Runtime integration implemented, live unattended canary proof remains pending.**
|
|
4
|
+
|
|
5
|
+
Date: 2026-09-16
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Forge already has durable authorities for repository Work, Controller ownership, ControllerRound transition, Scheduler occurrences, provider recovery, verification evidence, Outcome and Experience. Those authorities are inside the Forge execution/control plane. They can record that more semantic work is required and can prepare or dispatch a lower-layer continuation while the controlling call stack is alive.
|
|
10
|
+
|
|
11
|
+
That does not solve the outer lifecycle gap for a ChatGPT Web controller. A typical development loop is:
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
ChatGPT assistant turn
|
|
15
|
+
-> calls Forge
|
|
16
|
+
-> Forge Work / ControllerRound executes
|
|
17
|
+
-> Forge returns evidence
|
|
18
|
+
-> ChatGPT reasons over the evidence
|
|
19
|
+
-> assistant response commits
|
|
20
|
+
-> original assistant/MCP call stack ends
|
|
21
|
+
X no durable authority outside that call stack owns starting the next assistant turn
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
A ControllerRound continuation record is therefore not, by itself, an assistant-turn scheduler. Likewise, an MCP session, Browser session, Work lease, Schedule occurrence, or conversation binding is not the authority to decide and durably execute the next outer ChatGPT turn.
|
|
25
|
+
|
|
26
|
+
The missing authority is a **Workflow Supervisor** above the ChatGPT-turn / Forge execution boundary. It is part of Forge's general autonomous-workflow architecture, but it is not another Work, ControllerRound, Scheduler, or MCP lifecycle owner.
|
|
27
|
+
|
|
28
|
+
## Decision
|
|
29
|
+
|
|
30
|
+
Introduce one logical `WorkflowRun` supervised by one durable **Workflow Supervisor**. The Supervisor owns only cross-turn continuation of the original Goal. It delegates each semantic turn to ChatGPT and delegates repository execution to Forge.
|
|
31
|
+
|
|
32
|
+
```text
|
|
33
|
+
Original Goal / logical WorkflowRun
|
|
34
|
+
|
|
|
35
|
+
v
|
|
36
|
+
Workflow Supervisor
|
|
37
|
+
durable single writer
|
|
38
|
+
|
|
|
39
|
+
v
|
|
40
|
+
ChatGPT assistant turn
|
|
41
|
+
|
|
|
42
|
+
v
|
|
43
|
+
Forge Controller / Work
|
|
44
|
+
|
|
|
45
|
+
v
|
|
46
|
+
repository execution
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
V1 is a **TypeScript/Bun Supervisor authority co-hosted inside the Canonical Forge Runtime process**. It has its own dedicated Supervisor persistence and Unix socket under the exact configured Controller Home, and only the Supervisor composition opens/writes that database. Authority separation is therefore defined by persistence/protocol/single-writer boundaries, not by inventing a second OS daemon. The existing Canonical Runtime launchd/systemd/portable lifecycle starts and stops Supervisor with the rest of the Runtime. Go or another runtime is reconsidered only if later packaging, restart-recovery or operability evidence proves a material benefit without changing this protocol or authority contract. ChatGPT Web is the first execution target, not the definition of the Supervisor.
|
|
50
|
+
|
|
51
|
+
### Authority matrix
|
|
52
|
+
|
|
53
|
+
| Concern | Authority | What it may decide | What it must not decide |
|
|
54
|
+
| --- | --- | --- | --- |
|
|
55
|
+
| 1. Forge Work completion | Forge Work finalization / completion receipt | Whether one Work has satisfied its declared Work contract and delivery gates | Whether the original multi-turn Goal is globally DONE |
|
|
56
|
+
| 2. ControllerRound continuation | Canonical provider-neutral ControllerRound transition policy | Lower-layer round transitions and fenced continuation obligations | Whether a new outer assistant turn should be scheduled after the caller has disappeared |
|
|
57
|
+
| 3. MCP / execution-session recovery | MCP/session/Controller ownership recovery authorities | Rebind transport, recover session/claim, preserve exact lower-layer authority | Goal semantics, outer turn scheduling, or user escalation |
|
|
58
|
+
| 4. ChatGPT assistant-turn commit | Workflow Supervisor completion contract, based on a complete final assistant message | Whether one supervised assistant turn committed a valid completion proposal | Goal acceptance merely because the page stopped generating |
|
|
59
|
+
| 5. Next assistant-turn startup | Workflow Supervisor | Reserve/reconcile and submit one next turn to the exact execution target | Forge Work internals or repository mutation |
|
|
60
|
+
| 6. Long-lived Goal completion | Requirement/Goal semantics plus the WorkflowRun `completionContract` | Validate that a model `DONE` proposal actually satisfies the original Goal and required gates | Treat one Work, patch, test, round or model assertion as sufficient by itself |
|
|
61
|
+
| 7. Stagnation / no-progress detection | Workflow Supervisor using execution-quality / evidence observations | Detect repeated checkpoints, no new evidence, repeated failure/verification/recovery patterns | Rewrite lower-layer verification gates or silently terminate the Goal |
|
|
62
|
+
| 8. Workflow strategy adaptation | Semantic Controller, guided by Supervisor correction policy and Experience/evaluation evidence | Choose a different execution strategy for the same Goal; later evaluate cross-Work candidates | Create a second execution state machine or promote policy without evidence |
|
|
63
|
+
|
|
64
|
+
The separation is deliberate. A lower layer may report facts upward, but it does not acquire the upper layer's lifecycle authority by exposing more states.
|
|
65
|
+
|
|
66
|
+
## Logical WorkflowRun contract
|
|
67
|
+
|
|
68
|
+
The generic upper-layer contract is intentionally small:
|
|
69
|
+
|
|
70
|
+
```text
|
|
71
|
+
WorkflowRun
|
|
72
|
+
objective
|
|
73
|
+
executionTarget
|
|
74
|
+
completionContract
|
|
75
|
+
continuationPolicy
|
|
76
|
+
userBlockerPolicy
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`executionTarget` is an adapter identity. Initial support is ChatGPT Web; future targets may include ChatGPT Work, Forge local, Forge Cloud, browser/desktop automation, or another agent runtime.
|
|
80
|
+
|
|
81
|
+
`completionContract` is a read/validation contract for the original Goal and required evidence. For Forge-backed development Goals it may consult Requirement/Plan/Work receipts and semantic acceptance, but it does not mutate those lower authorities.
|
|
82
|
+
|
|
83
|
+
`continuationPolicy` defines the fixed enrollment/continuation template, exact target identity, recovery bounds and correction policy. It never accepts model-generated executable `next_prompt` content.
|
|
84
|
+
|
|
85
|
+
`userBlockerPolicy` validates whether a `NEEDS_USER` proposal is a genuine user-only action, authorization, consent/legal decision, or equivalent blocker with no autonomous recovery path.
|
|
86
|
+
|
|
87
|
+
### Namespace boundary
|
|
88
|
+
|
|
89
|
+
Forge already persists `workflow_run` for the declarative Workflow asset interpreter. That record is a checkpoint for executing a versioned Workflow asset; it is not the long-lived autonomous development Goal described here.
|
|
90
|
+
|
|
91
|
+
V1 Supervisor storage therefore uses a **dedicated Supervisor persistence authority/namespace**. It must not alias or reinterpret the existing declarative `workflow_run` record. Any future convergence requires an explicit migration and authority contract rather than a same-name shortcut.
|
|
92
|
+
|
|
93
|
+
## Assistant completion proposal protocol
|
|
94
|
+
|
|
95
|
+
Every supervised ChatGPT turn ends with exactly one machine-readable terminal block at the end of the assistant response:
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
<<<FORGE_WORKFLOW_SUPERVISOR_V1>>>
|
|
99
|
+
{
|
|
100
|
+
"action": "CONTINUE",
|
|
101
|
+
"conversation_id": "<exact ChatGPT conversation id>",
|
|
102
|
+
"task_id": "<stable conversation-scoped Supervisor task id>",
|
|
103
|
+
"supervisor_state": "running",
|
|
104
|
+
"active_scope": "requirement:<id>",
|
|
105
|
+
"source_effect_id": "fx_...",
|
|
106
|
+
"checkpoint": "...",
|
|
107
|
+
"reason": "...",
|
|
108
|
+
"evidence": ["..."]
|
|
109
|
+
}
|
|
110
|
+
<<<END_FORGE_WORKFLOW_SUPERVISOR_V1>>>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
`action` is exactly one of:
|
|
114
|
+
|
|
115
|
+
- `CONTINUE`: the original Goal is not complete and autonomous work remains.
|
|
116
|
+
- `DONE`: a terminal **proposal** that requires `completionContract` validation.
|
|
117
|
+
- `NEEDS_USER`: a blocker **proposal** that requires `userBlockerPolicy` validation.
|
|
118
|
+
|
|
119
|
+
Each newly rendered Supervisor prompt also requires exactly one concise user-visible status line before the control block, derived only from that same action:
|
|
120
|
+
|
|
121
|
+
- `CONTINUE` → `🔄 仍在执行,无需你操作`
|
|
122
|
+
- `NEEDS_USER` → `⏸ 需要你处理,暂时不要关闭会话`
|
|
123
|
+
- `DONE` → `✅ 已完成,可以关闭此会话`
|
|
124
|
+
|
|
125
|
+
This is presentation, not lifecycle authority or persisted state. In particular, completion wording is reserved for `DONE`; a model cannot make work complete by printing it, and the existing `completionContract` validation remains authoritative.
|
|
126
|
+
|
|
127
|
+
The exact `<<<END_FORGE_WORKFLOW_SUPERVISOR_V1>>>` marker is required before the Supervisor accepts the turn as committed. Prompt delivery, `Stop generating`, spinner/loading state, button state, DOM stability, a text-stability timer, Work completion, ControllerRound closure, or transport disconnection are not assistant-turn commit authority.
|
|
128
|
+
|
|
129
|
+
Every newly rendered Supervisor enrollment or continuation message also carries a machine-readable marker containing its daemon-minted `submission_effect_id` and instructs the assistant to echo exact `conversation_id`, stable `task_id`, `supervisor_state`, and `active_scope` together with `source_effect_id`. `supervisor_state` is redundant by design (`CONTINUE -> running`, `DONE -> done`, `NEEDS_USER -> needs_user`) so each response is independently classifiable. `active_scope` identifies the current durable lower-layer relay authority, normally `requirement:<id>` or `goal:<id>`; it never replaces that authority. The assistant may only echo these immutable/observed identities; it does not mint, rewrite or interpret them as executable prompt authority. A completion is commit-eligible only when `source_effect_id` matches the exact applied outbound effect for the exact task and conversation and the echoed identities match the registered task/scope. Already-reserved pre-upgrade effects remain parse-compatible so a Runtime upgrade does not strand an unknown remote effect.
|
|
130
|
+
|
|
131
|
+
The Supervisor never executes arbitrary model-provided `next_prompt`. Enrollment, normal continuation, recovery correction and stagnation correction use Supervisor-owned fixed templates. The normal same-conversation continuation is intentionally context-light. It does not repeat the original objective, checkpoint payload, Requirement/Plan/AGENTS text, or lower-layer authority context already present in the conversation. Its semantic instruction is bounded to one coherent safe work wave:
|
|
132
|
+
|
|
133
|
+
```text
|
|
134
|
+
Continue using the context already present in this same conversation.
|
|
135
|
+
Complete one coherent safe work wave and persist/checkpoint durable progress.
|
|
136
|
+
Use CONTINUE while autonomous work remains; use DONE only after the completion contract is satisfied; use NEEDS_USER only for a genuine user-only blocker.
|
|
137
|
+
Echo the immutable effect/task/conversation/scope identities and end with the FORGE_WORKFLOW_SUPERVISOR_V1 control block.
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Enrollment, recovery and correction prompts may include bounded original-objective, checkpoint, validation-result or lower-layer recovery context because those turns are specifically reconstructing durable state. Implementations may localize the wording, but not delegate prompt-chain control back to the assistant.
|
|
141
|
+
|
|
142
|
+
## DONE and NEEDS_USER validation
|
|
143
|
+
|
|
144
|
+
A model control block is evidence, not terminal authority.
|
|
145
|
+
|
|
146
|
+
For `DONE`, the Supervisor validates the configured `completionContract`. A Forge-backed development run must preserve the distinction between Requirement acceptance, Plan/Work delivery, verification/review evidence and outer Goal completion. Missing required evidence causes the `DONE` proposal to be rejected and converted into continuation/correction evidence; it does not lower the gate.
|
|
147
|
+
|
|
148
|
+
For `NEEDS_USER`, the Supervisor validates `userBlockerPolicy`. Test failures, tool failures, MCP errors, session replacement, provider recovery, implementation failures and ordinary Forge recovery are autonomous failure/recovery facts, not user blockers. A false `NEEDS_USER` proposal is rejected and routed to recovery/correction. Only a validated user-only blocker makes the WorkflowRun quiescent for user action.
|
|
149
|
+
|
|
150
|
+
## Single writer and event journal
|
|
151
|
+
|
|
152
|
+
The long-lived Supervisor authority hosted by Canonical Runtime is the **only durable writer** for Supervisor task/run state. Chrome Extension, Native Messaging transport, Forge execution, and lower schedulers submit observations or execute authorized effects; they never independently mutate Supervisor state.
|
|
153
|
+
|
|
154
|
+
V1 owns a dedicated `supervisor.sqlite` authority under the Forge user-data root instead of reusing `control-plane.sqlite`, generic `control_plane_records`, the declarative `workflow_run` namespace, or a collection of mutable status JSON files. It reuses only the runtime-neutral SQLite mechanics already proven by Forge: Bun/Node driver adaptation, WAL, foreign keys, bounded busy waiting, lifecycle integrity checks, statement finalization and short `BEGIN IMMEDIATE` write transactions.
|
|
155
|
+
|
|
156
|
+
The core schema keeps the exactly-once invariants relational rather than burying them in opaque JSON payloads. It has explicit task, append-oriented event and outbound-effect facts (`tasks`, `events`, `effects` or schema-equivalent names), with database-level uniqueness for committed completion fingerprints and for the one successor effect derived from a committed completion. Supervisor task identity is stable per exact conversation; Requirement and Work changes advance `active_scope` rather than minting a second outer-turn identity for the same conversation. Bounded discovered-conversation metadata may be persisted in the same Supervisor database so Runtime/browser restarts do not erase project inventory, but discovery rows are observations only and cannot reserve effects or terminalize a task by themselves. Durable journal facts include at least:
|
|
157
|
+
|
|
158
|
+
- enrollment / turn submission intent;
|
|
159
|
+
- assistant turn committed;
|
|
160
|
+
- continuation effect reserved;
|
|
161
|
+
- external effect observed `applied`, `not_applied`, or `unknown`;
|
|
162
|
+
- completion/blocker proposal validation;
|
|
163
|
+
- recovery/correction decisions;
|
|
164
|
+
- verified terminalization.
|
|
165
|
+
|
|
166
|
+
Current state is derived from those durable facts. The Canonical Forge Runtime owns the one long-lived process lifecycle and starts the Supervisor server in-process; Supervisor still owns its separate SQLite and Unix-JSONL socket authority. The Chrome Native Messaging host is only a bounded stdin/stdout-to-socket relay; it does not open `supervisor.sqlite`, make continuation/terminal decisions, or become a second writer. Relay processes may reconnect or respawn without changing WorkflowRun identity.
|
|
167
|
+
|
|
168
|
+
## Exactly-once continuation and external-effect reconciliation
|
|
169
|
+
|
|
170
|
+
Each supervised outbound turn is assigned a daemon-minted `submission_effect_id`, and the exact fixed outbound message embeds that id in its machine-readable marker. The completion of that turn is causally tied to that applied effect and must echo it as `source_effect_id`. When a stable provider message id is unavailable, the completion fingerprint is derived from:
|
|
171
|
+
|
|
172
|
+
```text
|
|
173
|
+
task identity
|
|
174
|
+
+ exact conversation identity
|
|
175
|
+
+ source_effect_id
|
|
176
|
+
+ canonical full assistant-response hash
|
|
177
|
+
+ control-block hash
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
This prevents two different turns with identical assistant text from colliding.
|
|
181
|
+
|
|
182
|
+
For a valid `CONTINUE`, one short SQLite transaction consumes/idempotently records the committed assistant completion and reserves the one successor `submission_effect_id`. Database uniqueness makes duplicate observations converge on the same logical successor effect. The transaction does not claim that the external ChatGPT send committed.
|
|
183
|
+
|
|
184
|
+
`DONE` and `NEEDS_USER` proposals have a different boundary because their contracts may read Forge or other authoritative evidence. The daemon first journals the proposal idempotently, releases the SQLite write transaction, performs the required read-only completion/blocker validation, then uses another short transaction either to record validated terminalization or to reserve a correction/continuation effect. No SQLite write lock is held across Forge, browser or other external evidence reads.
|
|
185
|
+
|
|
186
|
+
External send outcome uses the same three-way rule as Forge's non-idempotent effect reconciliation:
|
|
187
|
+
|
|
188
|
+
- `applied`: the exact effect marker/fixed outbound message is observed in the exact conversation; acknowledge it and never resend.
|
|
189
|
+
- `not_applied`: affirmative preserved-baseline proof establishes that the exact source completion is still the latest committed assistant turn, the latest user message is still the previously applied source/baseline message, and the target `submission_effect_id` marker is absent; only then may retry reuse the same reserved effect identity.
|
|
190
|
+
- `unknown`: any conflicting, newer, partial or otherwise insufficient observation stays reconciliation-only; do not blindly resend.
|
|
191
|
+
|
|
192
|
+
The crash windows before reservation, after reservation/before send, after send/before acknowledgement, and after acknowledgement must all converge through this journal plus remote observation. Daemon restart, extension reload, Chrome restart, tab close/reopen/discard/freeze, Native Messaging reconnect and Forge/MCP session replacement never create a new original Goal or a second continuation for the same committed completion.
|
|
193
|
+
|
|
194
|
+
## ChatGPT Web adapter boundary
|
|
195
|
+
|
|
196
|
+
The Chrome Extension is a discovery/assistant-observation adapter, not a state authority or outbound sender. Native macOS Browser transport is the single sender: it uses trusted input, confirms the composer contains the exact fixed prompt before it clicks Send, and waits for the exact committed user message before recording the effect outcome. It may:
|
|
197
|
+
|
|
198
|
+
- locate or open only an allowlisted exact conversation id/URL;
|
|
199
|
+
- obtain repository-derived ChatGPT Project scopes from the Supervisor and scan visible project links for canonical `/c/<id>` conversation identities;
|
|
200
|
+
- publish bounded project/conversation discovery observations; the Supervisor alone decides whether an unbound discovered conversation receives one enrollment effect;
|
|
201
|
+
- read the final complete assistant response, its echoed identity/state fields and `source_effect_id`, and forward bounded evidence;
|
|
202
|
+
- rediscover a closed/discarded tab without changing durable task identity.
|
|
203
|
+
|
|
204
|
+
It must not select durable tasks by mutable title, open the Supervisor database, decide `CONTINUE/DONE/NEEDS_USER`, invent prompts, weaken Forge gates, or depend on private ChatGPT APIs. A repository/project title is only a bounded discovery selector; exact conversation URL/id becomes the stable execution target before any enrollment effect exists. Transient generation UI may help avoid pointless reads but is never commit evidence.
|
|
205
|
+
|
|
206
|
+
Existing conversations require an explicit enrollment handshake. A conversation may be explicitly bound by a current Work or discovered inside the repository-derived ChatGPT Project scope. In either case the Supervisor persists exact conversation identity and one conversation-stable task, then reserves one fixed enrollment effect. A discovered conversation that has not yet recovered a durable Requirement must use a bootstrap enrollment turn that recovers the original task from conversation history plus Forge durable state and emits the exact `active_scope` before repository mutation. Repeated project scans never reserve a second bootstrap for an already enrolled conversation. A pre-enrollment response without the END marker is never retroactively imported as a committed supervised turn.
|
|
207
|
+
|
|
208
|
+
## Relationship to existing Forge continuation
|
|
209
|
+
|
|
210
|
+
The cross-turn dependency described in this section is superseded by [Supervisor turn authority](20261001-supervisor-turn-authority.md): ControllerRound remains initial admission and direct non-ChatGPT provider-effect authority, while enrolled ChatGPT turns use only the Supervisor causal effect ledger. Exact-conversation Supervisor lookup occurs before lower ControllerRound readiness, so an already-enrolled conversation cannot be stranded by a retired lower round. Every nonterminal Supervisor task must retain one mechanically derivable causal obligation; Runtime restart repairs missing enrollment/successor/terminal settlement from the existing ledger rather than adding lifecycle state. Schedule occurrences hand exact trigger identity into ControllerRound; Scheduler-owned continuation-dispatch persistence has been removed. ControllerRound is not the authority that reactivates ChatGPT after the outer assistant call stack is gone, and it is not proof that the long-lived WorkflowRun progressed or completed.
|
|
211
|
+
|
|
212
|
+
The existing Scheduler remains only an execution/occurrence scheduler. Once an exact Requirement-backed ChatGPT conversation binding exists, lower Scheduler/maintenance/direct-continuation paths must not submit the next outer ChatGPT turn; Workflow Supervisor is the single outer writer.
|
|
213
|
+
|
|
214
|
+
Standalone Supervisor lifecycle and release-bound live proof are reachable from the six-tool ChatGPT facade as the `controller.workflow_supervisor` core capability on `capability_execute`. Its `start/list/get/stop/proof` actions route into the same `WorkflowSupervisorControlPlane` adapter and dedicated Supervisor persistence. Newly generated autonomous turns carry typed automation metadata on their real Forge calls; the old receipt-only `rh_work repair` carrier is migration-only for already-issued prompts. The retained internal/compatibility `supervisor_task` definition is not a second facade or authority. ReleaseSession keeps Candidate B's isolated Runtime canaries separate from the real external multi-turn proof: after cutover the session remains `soaking` until the exact active release has durable `CONTINUE → CONTINUE → DONE` proof spanning a Runtime reconnect; only then may it become known-good.
|
|
215
|
+
|
|
216
|
+
No Supervisor state is added to Work, ControllerRound, relay, MCP session or existing declarative Workflow asset records in V1. Integration is through typed observations/read-only completion evidence and authorized execution effects.
|
|
217
|
+
|
|
218
|
+
## Stagnation and strategy evolution
|
|
219
|
+
|
|
220
|
+
P0 is cross-turn liveness and correctness: durable Supervisor, exactly-once/restart recovery and real unattended Avela development canaries.
|
|
221
|
+
|
|
222
|
+
After P0 proof, P1 may consume existing execution-quality and Experience evidence to detect repeated checkpoint/evidence/failure/verification/recovery patterns. First confirmed stagnation injects one fixed root-cause correction while keeping the same original Goal and gates. It does not immediately escalate to the user.
|
|
223
|
+
|
|
224
|
+
Only after P0/P1 evidence should P2 perform cross-Work strategy comparison, policy candidate trials, evaluation and bounded promotion. Existing Experience/evaluation authorities are reused rather than replaced.
|
|
225
|
+
|
|
226
|
+
## First P0 canary
|
|
227
|
+
|
|
228
|
+
The current P0 canary also exercises the Forge ChatGPT Project itself: the adapter must discover the repository-matched project conversations by exact `/c/<id>` identity, persist the inventory across Runtime restart, enroll each unbound nonterminal conversation at most once, and allow each conversation to recover its own durable `active_scope`. The historical Avela three-conversation canary remains valid evidence for exact-conversation isolation; promotion/excluded conversations must remain outside any configured discovery scope.
|
|
229
|
+
|
|
230
|
+
P0 is not complete when Forge can send one automatic `continue` or merely list browser tabs. It is complete only after a real project/conversation canary demonstrates multi-turn unattended progress with no user continuation messages, correct conversation isolation, no duplicate bootstrap/continuation, restart recovery, technical-failure recovery, MCP-session replacement, validated `DONE`, and validated `NEEDS_USER`, without lowering Forge verification/review/authorization gates.
|
|
231
|
+
|
|
232
|
+
## Consequences
|
|
233
|
+
|
|
234
|
+
- Forge gains one missing upper lifecycle authority instead of stretching lower state machines upward.
|
|
235
|
+
- The external protocol remains deliberately smaller than Forge's internal lifecycles.
|
|
236
|
+
- Exactly-once is treated as an external-effect reconciliation problem, not as a SQLite uniqueness problem pretending the network does not exist.
|
|
237
|
+
- ChatGPT remains the semantic reasoner, but model assertions do not bypass durable Goal or blocker evidence.
|
|
238
|
+
- The system can later add execution targets without making Chrome Extension behavior part of the kernel.
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
## Restart-safe remote effect generations
|
|
242
|
+
|
|
243
|
+
The remote ChatGPT send boundary is recovered from the Supervisor journal, never from browser-local shadow state. Each reserved effect keeps one stable `submission_effect_id`; retries do **not** mint a replacement effect. Instead, every authorized send attempt appends an `effect_dispatch_started` event carrying a monotonically increasing dispatch generation. Generation 1 is allowed before any prior dispatch. A later generation is allowed only when a canonical `effect_not_applied` event was committed after the previous dispatch. `effect_unknown` never authorizes a resend.
|
|
244
|
+
|
|
245
|
+
`not_applied` is a daemon-validated fact, not a caller assertion. The generic observation RPC may record only `applied` or `unknown`. The browser reconciliation path may commit `effect_not_applied` only when the exact conversation remains on the preserved dispatch baseline, the target effect marker is absent, and, for continuation/correction effects, the latest complete assistant response hashes to the exact source completion while the latest user message is the exact applied source-effect prompt. Any drift, partial response, conflicting message, missing baseline, or other ambiguity is recorded as `unknown` and remains reconciliation-only.
|
|
246
|
+
|
|
247
|
+
Raw ChatGPT page bodies are ephemeral verifier input. The Supervisor persists bounded hashes and a fixed allowlist of small browser evidence fields, not arbitrary `latest_user_text` or `latest_assistant_response` payloads. This keeps restart evidence durable without turning the event journal into a conversation mirror.
|
|
248
|
+
|
|
249
|
+
Daemon restart, Native Messaging respawn, extension reload, Chrome tab reopen/discard recovery, and Forge/MCP session replacement therefore reconstruct the same task/effect chain from `supervisor.sqlite`. The relay and extension may disappear and return freely; neither owns retry generations, terminal state, or durable recovery policy. Verified `DONE` and `NEEDS_USER` remain quiescent because terminal tasks expose no browser continuation command.
|