@moretea-labs/forge 1.6.0 → 1.7.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 +4 -0
- package/CHANGELOG.md +39 -0
- package/CLAUDE.md +4 -0
- package/README.md +2 -2
- package/README.zh-CN.md +1 -1
- package/SKILL.md +2 -2
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/agents/openai.yaml +1 -1
- package/assets/hooks/hook-input.sh +11 -8
- package/assets/hooks/lib/session-state.sh +10 -7
- package/assets/hooks/lib/workflow-state.sh +13 -177
- package/assets/hooks/post-tool-observer.sh +8 -2
- package/assets/hooks/prompt-guard.sh +5 -81
- package/assets/hooks/session-start-context.sh +56 -1
- package/assets/partials/05-workflow.partial.md +1 -1
- package/assets/partials-agents/02-operating-mode.partial.md +2 -0
- package/assets/partials-agents/03-orchestration.partial.md +1 -1
- package/assets/plugin-registry.v1.json +3 -3
- package/assets/reference-configs/document-generation.md +1 -1
- package/assets/reference-configs/harness-overview.md +1 -1
- package/assets/reference-configs/sprint-contracts.md +3 -3
- package/assets/skill-version.json +2 -2
- package/assets/templates/contract.template.md +2 -7
- package/assets/templates/helpers/capture-plan.sh +2 -2
- package/assets/templates/helpers/check-architecture-sync.sh +17 -0
- package/assets/templates/helpers/check-task-workflow.sh +4 -4
- package/assets/templates/helpers/contract-worktree.sh +1 -21
- package/assets/templates/helpers/ensure-task-workflow.sh +11 -36
- package/assets/templates/helpers/inspect-project-state.ts +8 -6
- package/assets/templates/helpers/migrate-project-template.sh +22 -45
- package/assets/templates/helpers/migrate-workflow-docs.ts +9 -7
- package/assets/templates/helpers/new-plan.sh +1 -1
- package/assets/templates/helpers/plan-to-todo.sh +12 -37
- package/assets/templates/helpers/ship-worktrees.sh +2 -29
- package/assets/templates/helpers/verify-contract.sh +1 -111
- package/assets/templates/helpers/verify-sprint.sh +3 -180
- package/assets/templates/helpers/workflow-contract.ts +5 -1
- package/assets/templates/plan.template.md +1 -1
- package/assets/templates/review.template.md +9 -34
- package/assets/workflow-contract.v1.json +10 -19
- package/docs/README.md +10 -10
- package/docs/architecture/CURRENT.md +178 -0
- package/docs/architecture/EVOLUTION.md +42 -0
- package/docs/architecture/current/README.md +4 -156
- package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
- package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
- package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
- package/docs/architecture/history/README.md +7 -0
- package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
- package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
- package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
- package/docs/architecture/history.md +3 -34
- package/docs/architecture/index.md +15 -98
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
- package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
- package/docs/architecture/versions/1.6.md +38 -0
- package/docs/architecture/versions/1.7.md +41 -0
- package/docs/forge-chatgpt-browser-engine.md +2 -2
- package/docs/forge-chatgpt-mcp-setup.md +4 -28
- package/docs/forge-chatgpt-supervised-automation.md +3 -3
- package/docs/forge-github-issue-launcher.md +1 -1
- package/docs/forge-plugin-management.md +1 -1
- package/docs/forge-runtime-self-healing-loop.md +1 -1
- package/docs/operations/controller-browser-plugin.md +26 -6
- package/docs/operations/controller-performance-and-502.md +143 -0
- package/docs/operations/controller-reliability-runbook.md +1 -1
- package/docs/operations/features.md +2 -2
- package/docs/operations/github-repository.md +1 -1
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +5 -3
- package/docs/wiki/Architecture.md +6 -6
- package/docs/wiki/Implementation.md +2 -2
- package/docs/wiki/Integrations.md +2 -2
- package/docs/wiki/Work-Lifecycle.md +1 -1
- package/package.json +33 -11
- package/scripts/activate-source-baseline.ts +17 -13
- package/scripts/architecture-event.ts +2 -820
- package/scripts/architecture-queue.sh +2 -645
- package/scripts/archive-architecture-request.sh +2 -242
- package/scripts/archive-workflow.sh +1 -291
- package/scripts/benchmark-background-check-overlap.ts +228 -0
- package/scripts/benchmark-mcp-host.sh +117 -0
- package/scripts/benchmark-mcp-transport.ts +170 -0
- package/scripts/benchmark-quality-harness.ts +146 -0
- package/scripts/benchmark-route-session-concurrency.ts +207 -6
- package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
- package/scripts/benchmark-typescript-navigation.ts +186 -0
- package/scripts/benchmark-work-efficiency.ts +334 -0
- package/scripts/capability-config.ts +2 -392
- package/scripts/capability-resolver.ts +2 -503
- package/scripts/capture-plan.sh +1 -332
- package/scripts/check-agent-tooling.sh +2 -1558
- package/scripts/check-architecture-sync.sh +2 -371
- package/scripts/check-brain-manifest.sh +2 -253
- package/scripts/check-context-files.sh +2 -47
- package/scripts/check-deploy-sql-order.sh +2 -115
- package/scripts/check-mcp-compatibility.ts +14 -0
- package/scripts/check-runtime-architecture.mjs +349 -79
- package/scripts/check-skill-version.ts +3 -191
- package/scripts/check-source-duplication.mjs +61 -0
- package/scripts/check-stable-baseline.ts +92 -0
- package/scripts/check-task-sync.sh +2 -63
- package/scripts/check-task-workflow.sh +2 -1000
- package/scripts/codex-handoff-resume.sh +2 -267
- package/scripts/context-contract-sync.sh +2 -514
- package/scripts/contract-run.ts +2 -463
- package/scripts/contract-worktree.sh +1 -722
- package/scripts/ensure-task-workflow.sh +1 -1225
- package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
- package/scripts/inspect-project-state.ts +4 -279
- package/scripts/install-standalone-recovery.ts +24 -0
- package/scripts/lib/project-init-lib.sh +22 -46
- package/scripts/lib/run-forge-helper.sh +19 -0
- package/scripts/lib/run-forge-helper.ts +26 -0
- package/scripts/migrate-project-template.sh +1 -1189
- package/scripts/migrate-workflow-docs.ts +4 -412
- package/scripts/new-plan.sh +1 -180
- package/scripts/new-spec.sh +1 -47
- package/scripts/new-sprint.sh +1 -46
- package/scripts/plan-to-todo.sh +1 -796
- package/scripts/prepare-codex-handoff.sh +2 -201
- package/scripts/prepare-handoff.sh +1 -78
- package/scripts/refresh-current-status.sh +2 -467
- package/scripts/run-governed-gate.ts +5 -1
- package/scripts/select-agent-context-blocks.sh +2 -64
- package/scripts/ship-worktrees.sh +1 -558
- package/scripts/smoke-ios-physical-device.ts +4 -2
- package/scripts/smoke-runtime-recovery.ts +1 -35
- package/scripts/smoke-schedule-engine.ts +1 -20
- package/scripts/sprint-backlog.sh +1 -834
- package/scripts/stage-runtime-release.ts +2 -1
- package/scripts/summarize-failures.sh +2 -123
- package/scripts/switch-plan.sh +1 -150
- package/scripts/sync-brain-docs.sh +2 -379
- package/scripts/sync-generated-authority.mjs +175 -0
- package/scripts/verify-contract.sh +2 -703
- package/scripts/verify-forge-runtime.sh +0 -1
- package/scripts/verify-sprint.sh +1 -677
- package/scripts/workflow-contract.ts +4 -205
- package/scripts/workstream-sync.sh +2 -261
- package/src/cli/agent-jobs/executor-health.ts +1 -1
- package/src/cli/commands/init-hook.ts +3 -3
- package/src/cli/commands/mcp.ts +9 -5
- package/src/cli/commands/plugin.ts +12 -3
- package/src/cli/commands/recovery.ts +25 -3
- package/src/cli/commands/runtime.ts +55 -3
- package/src/cli/commands/security.ts +12 -1
- package/src/cli/commands/setup-profile.ts +31 -21
- package/src/cli/controller/check-runner.ts +113 -5
- package/src/cli/controller/composite-result.ts +1 -1
- package/src/cli/controller/context/focus.ts +51 -0
- package/src/cli/controller/context/instruction-context.ts +114 -0
- package/src/cli/controller/context/known-paths.ts +76 -0
- package/src/cli/controller/context/query-planning.ts +110 -0
- package/src/cli/controller/context/rule-resolution.ts +532 -0
- package/src/cli/controller/context/source-materializer.ts +278 -0
- package/src/cli/controller/context/structural.ts +16 -0
- package/src/cli/controller/context/types.ts +286 -0
- package/src/cli/controller/context-pack.ts +828 -487
- package/src/cli/controller/launch-agents.ts +77 -2
- package/src/cli/controller/operational-plan.ts +2 -2
- package/src/cli/controller/work-mode.ts +6 -4
- package/src/cli/editing/edit-session.ts +60 -7
- package/src/cli/github/contracts.ts +16 -0
- package/src/cli/github/github.ts +135 -16
- package/src/cli/github/session.ts +2 -1
- package/src/cli/installer/managed-entries.ts +15 -1
- package/src/cli/local-bridge/console-automations.ts +54 -78
- package/src/cli/local-bridge/console-view-models.ts +1 -35
- package/src/cli/local-bridge/facade-api.ts +37 -264
- package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
- package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +23 -13
- package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
- package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +6 -4
- package/src/cli/local-bridge/frontend/src/lib/api.ts +1 -6
- package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
- package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +2 -2
- package/src/cli/local-bridge/frontend/src/styles.css +1 -1
- package/src/cli/local-bridge/frontend/src/types.ts +5 -8
- package/src/cli/local-bridge/job-store.ts +1 -490
- package/src/cli/local-bridge/server.ts +2 -515
- package/src/cli/local-bridge/ui-dist/app.css +1 -1
- package/src/cli/local-bridge/ui-dist/app.js +3703 -3757
- package/src/cli/mcp/auth.ts +5 -5
- package/src/cli/mcp/instructions.ts +3 -2
- package/src/cli/mcp/legacy-tool-service.ts +10 -222
- package/src/cli/mcp/multi-repository.ts +16 -5
- package/src/cli/mcp/oauth.ts +175 -26
- package/src/cli/mcp/post-finalize-work-attribution.ts +150 -0
- package/src/cli/mcp/repository-tools.ts +282 -146
- package/src/cli/mcp/server.ts +586 -116
- package/src/cli/mcp/tool-capability-cache.ts +1 -1
- package/src/cli/mcp/tool-contract.ts +14 -0
- package/src/cli/mcp/toolset-selection.ts +1 -1
- package/src/cli/mcp/toolset.ts +44 -7
- package/src/cli/mcp/transports/http.ts +124 -14
- package/src/cli/mcp/transports/session-registry.ts +43 -5
- package/src/cli/mcp/types.ts +3 -3
- package/src/cli/repositories/command-classifier.ts +103 -21
- package/src/cli/repositories/command-executor.ts +78 -526
- package/src/cli/repositories/command-process.ts +108 -0
- package/src/cli/repositories/command-scope.ts +99 -41
- package/src/cli/repositories/controller-home.ts +7 -8
- package/src/cli/repositories/git-command-executor.ts +2 -0
- package/src/cli/repositories/locks.ts +53 -16
- package/src/cli/repositories/repository-snapshot.ts +124 -0
- package/src/cli/repositories/selected-path-actions.ts +17 -9
- package/src/cli/repositories/structured-git.ts +118 -6
- package/src/cli/repository/inspector.ts +563 -65
- package/src/cli/repository/session-cache.ts +58 -17
- package/src/cli/v81-entry.ts +1 -4
- package/src/effects/fs-transaction.ts +85 -17
- package/src/runtime/context/codegraph-read-provider.ts +233 -2
- package/src/runtime/context/codegraph-sidecar.cjs +74 -40
- package/src/runtime/context/generic-lsp-provider.ts +355 -0
- package/src/runtime/context/lsp-client.ts +283 -0
- package/src/runtime/context/semantic-navigation-contract.ts +61 -0
- package/src/runtime/context/semantic-navigation.ts +223 -0
- package/src/runtime/context/swift-navigation.ts +565 -0
- package/src/runtime/context/typescript-navigation.ts +226 -0
- package/src/runtime/control-plane/dispatch-priority.ts +28 -0
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +48 -16
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
- package/src/runtime/control-plane/execution/repository-work-attribution.ts +106 -0
- package/src/runtime/control-plane/execution/retained-work-resume.ts +203 -0
- package/src/runtime/control-plane/execution/session-store.ts +18 -0
- package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
- package/src/runtime/control-plane/execution/work-completion-authority.ts +58 -0
- package/src/runtime/control-plane/execution/work-evidence-policy.ts +200 -0
- package/src/runtime/control-plane/execution/work-execution-support.ts +386 -0
- package/src/runtime/control-plane/execution/work-finalization-service.ts +1913 -0
- package/src/runtime/control-plane/execution/work-handle-authority.ts +96 -0
- package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
- package/src/runtime/control-plane/execution/work-operation-service.ts +468 -0
- package/src/runtime/control-plane/execution/work-path-scope.ts +37 -0
- package/src/runtime/control-plane/execution/work-preparation-service.ts +479 -0
- package/src/runtime/control-plane/execution/work-process-evidence.ts +129 -0
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
- package/src/runtime/control-plane/execution/work-task-receipt.ts +22 -18
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +156 -11
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +22 -14
- package/src/runtime/control-plane/execution/work-verification-context.ts +56 -0
- package/src/runtime/control-plane/execution/work-verification-service.ts +388 -0
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +90 -9
- package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
- package/src/runtime/control-plane/facade/controller-round-relay.ts +1118 -0
- package/src/runtime/control-plane/facade/controller-session-store.ts +302 -12
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +17 -1
- package/src/runtime/control-plane/facade/goal-workloop.ts +928 -190
- package/src/runtime/control-plane/facade/index.ts +3 -0
- package/src/runtime/control-plane/facade/plan-contract-store.ts +275 -42
- package/src/runtime/control-plane/facade/repository-work-admission.ts +147 -0
- package/src/runtime/control-plane/facade/requirement-authority.ts +83 -0
- package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
- package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
- package/src/runtime/control-plane/facade/types.ts +90 -10
- package/src/runtime/control-plane/facade/work-contract-store.ts +157 -261
- package/src/runtime/control-plane/facade/work-state-machine.ts +250 -0
- package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
- package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
- package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +152 -0
- package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +278 -543
- package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
- package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
- package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
- package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
- package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
- package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
- package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
- package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
- package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
- package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
- package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +63 -0
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +365 -117
- package/src/runtime/control-plane/launcher/launch-reservation-store.ts +89 -0
- package/src/runtime/control-plane/launcher/thin-launcher.ts +244 -11
- package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
- package/src/runtime/control-plane/persistence/requirement-store.ts +0 -12
- package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
- package/src/runtime/control-plane/release-retention.ts +62 -2
- package/src/runtime/control-plane/repo-actor/registry.ts +4 -2
- package/src/runtime/control-plane/routing/route-policy.ts +24 -21
- package/src/runtime/control-plane/routing/workspace-admission.ts +70 -0
- package/src/runtime/control-plane/runtime-status-client.ts +0 -2
- package/src/runtime/diagnostics/mcp-timing.ts +13 -0
- package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
- package/src/runtime/diagnostics/performance.ts +24 -1
- package/src/runtime/evidence/event-ledger.ts +1 -1
- package/src/runtime/evidence/process-check-execution.ts +18 -0
- package/src/runtime/execution/jobs/child-reference.ts +6 -2
- package/src/runtime/execution/jobs/store.ts +58 -4
- package/src/runtime/execution/jobs/types.ts +1 -1
- package/src/runtime/execution/managed-workspace.ts +203 -1
- package/src/runtime/execution/process-runtime/check-facade.ts +51 -4
- package/src/runtime/execution/process-runtime/check-result.ts +88 -0
- package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +7 -1
- package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
- package/src/runtime/execution/process-runtime/command-facade.ts +367 -40
- package/src/runtime/execution/process-runtime/gc.ts +38 -6
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +1201 -0
- package/src/runtime/execution/process-runtime/persisted-check.ts +51 -5
- package/src/runtime/execution/process-runtime/resource-claims.ts +10 -6
- package/src/runtime/execution/process-runtime/runtime.ts +53 -3
- package/src/runtime/execution/process-runtime/store.ts +1 -0
- package/src/runtime/execution/process-runtime/types.ts +4 -12
- package/src/runtime/execution/thin-harness/async-process.ts +12 -2
- package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
- package/src/runtime/execution/work-activity.ts +21 -0
- package/src/runtime/execution/workers/executor.ts +18 -61
- package/src/runtime/gateway/mcp/execution-tools.ts +35 -1852
- package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +61 -0
- package/src/runtime/gateway/mcp/process-tools.ts +83 -37
- package/src/runtime/gateway/mcp/router.ts +186 -84
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +565 -0
- package/src/runtime/gateway/mcp/runtime-tools.ts +2378 -1947
- package/src/runtime/plugins/app-store-connect-adapter.ts +216 -47
- package/src/runtime/plugins/browser-adapter.ts +2662 -829
- package/src/runtime/plugins/browser-automation-service.ts +10 -0
- package/src/runtime/plugins/browser-handoff-host.ts +2 -25
- package/src/runtime/plugins/browser-handoff.ts +110 -5
- package/src/runtime/plugins/browser-macos-bridge.ts +701 -63
- package/src/runtime/plugins/browser-manifest-surface.ts +603 -0
- package/src/runtime/plugins/browser-native-session-service.ts +222 -0
- package/src/runtime/plugins/browser-node-bridge.ts +6 -34
- package/src/runtime/plugins/browser-provider-registry.ts +109 -0
- package/src/runtime/plugins/browser-runtime-contract.ts +154 -0
- package/src/runtime/plugins/browser-runtime.ts +193 -0
- package/src/runtime/plugins/browser-session-authority.ts +332 -0
- package/src/runtime/plugins/browser-session-store.ts +121 -0
- package/src/runtime/plugins/browser-session-types.ts +98 -0
- package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
- package/src/runtime/plugins/desktop-operator-registration.ts +10 -4
- package/src/runtime/plugins/external-adapter.ts +358 -3
- package/src/runtime/plugins/external-unix-socket.ts +7 -1
- package/src/runtime/plugins/first-party-registry.ts +2 -0
- package/src/runtime/plugins/github-adapter.ts +125 -0
- package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
- package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
- package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
- package/src/runtime/plugins/ios-adapter.ts +106 -16
- package/src/runtime/plugins/ios-agent-device.ts +234 -64
- package/src/runtime/plugins/ios-physical-device.ts +1143 -392
- package/src/runtime/plugins/lightweight-action.ts +153 -0
- package/src/runtime/plugins/local-system-adapter.ts +123 -6
- package/src/runtime/plugins/macos-capability-broker.ts +47 -9
- package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
- package/src/runtime/plugins/plugin-management-adapter.ts +49 -8
- package/src/runtime/plugins/resend-adapter.ts +1 -1
- package/src/runtime/plugins/store.ts +330 -33
- package/src/runtime/plugins/types.ts +38 -3
- package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
- package/src/runtime/projections/git-status-sampler.ts +16 -16
- package/src/runtime/projections/materialized-view.ts +28 -10
- package/src/runtime/recovery/maintenance-executor.ts +426 -25
- package/src/runtime/root/mcp-transport.ts +180 -10
- package/src/runtime/root/package-connector-service.ts +230 -10
- package/src/runtime/root/package-runtime-release.ts +143 -17
- package/src/runtime/root/package-runtime-service.ts +461 -22
- package/src/runtime/root/release-manifest.ts +144 -18
- package/src/runtime/root/release-materialize.ts +125 -32
- package/src/runtime/root/release-store.ts +48 -11
- package/src/runtime/root/runtime.ts +23 -5
- package/src/runtime/root/service.ts +100 -29
- package/src/runtime/root/types.ts +12 -0
- package/src/runtime/safe-tooling/ios-development.ts +321 -63
- package/src/runtime/shared/trusted-executable.ts +62 -0
- package/src/runtime/shared/trusted-node-executable.ts +48 -0
- package/src/runtime/standalone-recovery/core.ts +1079 -240
- package/src/runtime/standalone-recovery/entry.ts +100 -24
- package/src/runtime/standalone-recovery/installer.ts +20 -4
- package/src/runtime/standalone-recovery/service-labels.ts +2 -0
- package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
- package/src/runtime/workflow/schedules/browser-probe.ts +81 -3
- package/src/runtime/workflow/schedules/engine.ts +364 -202
- package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
- package/src/runtime/workflow/schedules/settlement.ts +64 -17
- package/src/runtime/workflow/schedules/store.ts +209 -19
- package/src/runtime/workflow/schedules/types.ts +2 -4
- package/src/runtime/workflow/schedules/work-continuation.ts +26 -13
- package/src/testing/test-governance.ts +8 -40
- package/assets/reference-configs/heartbeat-triage.md +0 -57
- package/assets/templates/helpers/harness-trace-grade.sh +0 -150
- package/assets/templates/helpers/heartbeat-triage.sh +0 -361
- package/assets/templates/helpers/maintenance-triage.sh +0 -167
- package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
- package/docs/architecture/current/architecture-invariants.md +0 -331
- package/docs/architecture/current/automation-and-schedule-engine.md +0 -459
- package/docs/architecture/current/codegraph-context-provider.md +0 -238
- package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
- package/docs/architecture/current/controller-repository-decoupling.md +0 -148
- package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -373
- package/docs/architecture/current/entity-model.md +0 -612
- package/docs/architecture/current/external-plugin-governance.md +0 -396
- package/docs/architecture/current/failure-recovery.md +0 -447
- package/docs/architecture/current/governance.md +0 -213
- package/docs/architecture/current/human-interaction-plane.md +0 -87
- package/docs/architecture/current/implementation-status.md +0 -128
- package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
- package/docs/architecture/current/legacy-governance.md +0 -58
- package/docs/architecture/current/local-workspace-target-grants.md +0 -70
- package/docs/architecture/current/migration-roadmap.md +0 -105
- package/docs/architecture/current/multi-repository-execution.md +0 -371
- package/docs/architecture/current/operations-runbook.md +0 -45
- package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
- package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
- package/docs/architecture/current/repository-access-modes.md +0 -102
- package/docs/architecture/current/route-policy.md +0 -15
- package/docs/architecture/current/route-session-concurrency.md +0 -85
- package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
- package/docs/architecture/current/runtime-directory-map.md +0 -49
- package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
- package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
- package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
- package/docs/architecture/current/system-overview.md +0 -169
- package/docs/architecture/current/target-requirements-traceability.md +0 -202
- package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
- package/docs/architecture/current/thin-harness-v1.md +0 -321
- package/docs/architecture/current/verification-and-release-gates.md +0 -391
- package/docs/forge-autonomous-goal-loop.md +0 -9
- package/docs/forge-provider-configuration.md +0 -7
- package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -93
- package/docs/operations/gmail-assistant-routines.md +0 -186
- package/docs/operations/personal-assistant-operator-guide.md +0 -61
- package/docs/operations/provider-configuration.md +0 -31
- package/scripts/harness-trace-grade.sh +0 -150
- package/scripts/heartbeat-triage.sh +0 -361
- package/scripts/maintenance-triage.sh +0 -167
- package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
- package/src/cli/repositories/goal-registry.ts +0 -239
- package/src/runtime/assistant/action-proposals.ts +0 -279
- package/src/runtime/assistant/intent.ts +0 -395
- package/src/runtime/assistant/model-provider.ts +0 -460
- package/src/runtime/assistant/openapi.ts +0 -223
- package/src/runtime/assistant/policy.ts +0 -89
- package/src/runtime/assistant/readiness.ts +0 -258
- package/src/runtime/assistant/routine-runtime.ts +0 -477
- package/src/runtime/assistant/schedule-binding.ts +0 -171
- package/src/runtime/assistant/standing-grants.ts +0 -375
- package/src/runtime/assistant/store.ts +0 -243
- package/src/runtime/assistant/types.ts +0 -135
- package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
- package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
- package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
- package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
- package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
- package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
- package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
- package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
- package/src/runtime/control-plane/goal-loop/index.ts +0 -13
- package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
- package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
- package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
- package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
- package/src/runtime/control-plane/goal-loop/types.ts +0 -378
- package/src/runtime/control-plane/startup-recovery.ts +0 -198
- package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
- package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
- package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
- package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
- package/src/runtime/workflow/findings/store.ts +0 -204
- package/src/runtime/workflow/findings/types.ts +0 -58
- package/src/runtime/workflow/portfolio/engine.ts +0 -20
- package/src/runtime/workflow/portfolio/store.ts +0 -185
- package/src/runtime/workflow/portfolio/types.ts +0 -29
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
# Human Interaction Plane
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
|
|
5
|
-
The Human Interaction Plane preserves a provider session while a person completes CAPTCHA, login, two-factor authentication, device unlock, biometric approval, or another step that automation must not perform.
|
|
6
|
-
|
|
7
|
-
## Current Browser Implementation
|
|
8
|
-
|
|
9
|
-
```text
|
|
10
|
-
bounded plugin action
|
|
11
|
-
-> durable interaction record
|
|
12
|
-
-> detached browser handoff host
|
|
13
|
-
-> visible persistent browser + foreground presentation
|
|
14
|
-
-> explicit resolve_handoff(resume|cancel)
|
|
15
|
-
-> close browser context
|
|
16
|
-
-> write terminal state and release profile
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
The host is not a Controller, scheduler, Gateway, or MCP server. It owns one browser profile and survives the bounded Worker that requested the handoff.
|
|
20
|
-
Browser CDP attach mode is not a human handoff owner; handoff still launches and fences the managed profile path for the saved session, then releases it only through the terminal handoff state.
|
|
21
|
-
|
|
22
|
-
Records live below `.forge/interactions/<provider>/` as atomic session, launch, and command files. They contain provider/session identity, Work ownership, host PID/heartbeat, expiry, bounded URL/title results, and capability-local errors. They never copy cookies, passwords, verification codes, or user-entered form values.
|
|
23
|
-
|
|
24
|
-
## State and Ownership
|
|
25
|
-
|
|
26
|
-
```text
|
|
27
|
-
starting -> waiting_for_user -> closing -> completed | closed | failed
|
|
28
|
-
\-----------------> failed
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
- `starting`, `waiting_for_user`, and `closing` own the selected profile.
|
|
32
|
-
- Ordinary browser actions and session deletion are rejected while the profile is owned.
|
|
33
|
-
- Resume/cancel use separate command files, avoiding concurrent state-file writers.
|
|
34
|
-
- Status reads derive stale/dead state without writing files or signalling processes; the next handoff start persists dead-host outcomes and prunes old terminal records to a bounded set.
|
|
35
|
-
- The host enforces its own expiry and remains `closing`; the profile is released only after the browser context closes and terminal state is written.
|
|
36
|
-
- Final URL/title are saved only after an explicit resume request.
|
|
37
|
-
|
|
38
|
-
## Security and Failure Isolation
|
|
39
|
-
|
|
40
|
-
- Existing domain allowlists apply during handoff and again on resume.
|
|
41
|
-
- The host uses Playwright foregrounding plus best-effort macOS application activation.
|
|
42
|
-
- Human actions are not represented as automated evidence.
|
|
43
|
-
- Handoff does not weaken authorization or strong-confirmation requirements for purchases, payment, deletion, or other irreversible actions.
|
|
44
|
-
- Host failure is capability-local and must not degrade Controller, repository, or unrelated plugin readiness.
|
|
45
|
-
|
|
46
|
-
## Public Contract
|
|
47
|
-
|
|
48
|
-
The browser plugin exposes three actions:
|
|
49
|
-
|
|
50
|
-
- `request_human_handoff` — start and foreground a saved session.
|
|
51
|
-
- `get_handoff_status` — read/reconcile durable state.
|
|
52
|
-
- `resolve_handoff` — explicitly resume or cancel.
|
|
53
|
-
|
|
54
|
-
The small surface limits additional plugin schema growth and avoids alias actions with overlapping semantics.
|
|
55
|
-
|
|
56
|
-
## Optional agent-device iOS Provider
|
|
57
|
-
|
|
58
|
-
The existing `ios` plugin includes an optional `agent-device` provider with these boundaries:
|
|
59
|
-
|
|
60
|
-
- The local CLI must satisfy the reviewed `>=0.19.3 <0.21.0` capability/help contract. Status and evidence record its resolved executable, actual version and contract fingerprint. Forge never downloads tooling at action time.
|
|
61
|
-
- The exact optional `agent-device@0.20.2` package provides the typed read-only snapshot backend on Node 22.12 or newer; Node 20 and unavailable/mismatched typed packages fall back to the reviewed CLI contract with explicit evidence. CLI absence or incompatibility degrades only this optional provider. Existing Xcode, `simctl`, build, launch, screenshot, and smoke-review readiness remains unchanged.
|
|
62
|
-
- Device inventory comes from bounded `agent-device devices --platform ios --json` output. Simulator selection resolves to exactly one already-booted simulator. A physical iPhone is accepted only through an explicit exact name or UDID and must be connected; unavailable targets and ambiguous names are rejected before app actions.
|
|
63
|
-
- Physical sessions use the shared `ios-device` ownership fence while simulator sessions continue to use `ios-simulator`. The interaction record separately declares the `agent-device` or `coredevice` execution engine, so the two implementations cannot consume each other's sessions while still mutually excluding access to the same phone. Legacy schema-v1 records use bounded prefix/reason inference only. Signing inputs are limited to non-secret team and reverse-DNS bundle identifiers, are stored beside the Controller-owned interaction state, and are mapped to agent-device environment variables without persisting certificates, profiles, pairing records, or credentials.
|
|
64
|
-
- `agent_device_prepare` explicitly builds, signs, installs, and health-checks the XCTest Runner. Readiness is never inferred from inventory alone: a paired phone can be listed while Runner preparation still fails because the phone is locked, the developer tunnel is unreachable, or signing is incomplete.
|
|
65
|
-
- `agent_device_jd_search` is a narrow physical-device workflow for `com.360buy.jdmobile`. It accepts a bounded product-information query, uses accessibility evidence to locate the search field, submits through an explicit target or keyboard return, and returns bounded visible result text. Fresh one-shot calls retain the compatibility behavior of writing one Controller-owned PNG and closing. A caller may instead supply one active physical-iPhone JD `interaction_id`; the trusted warm path reuses that exact fenced session, skips device inventory and app open, defaults to no screenshot, and leaves the session active for the next bounded action. Non-JD, simulator, terminal, expired, or unknown interactions fail before the search batch. Credentials, verification, biometrics, checkout, purchase, order submission, and payment semantics are rejected before mutation.
|
|
66
|
-
- Each interaction receives an isolated `AGENT_DEVICE_STATE_DIR` and explicit session name. Direct session commands are serialized by exact interaction identity before process launch, while the provider session lock rejects cross-process collision; only a fixed argv allowlist is exposed, and the provider never invokes `agent-device mcp` or arbitrary commands. The MCP request cancellation signal and the caller's bounded timeout flow only through the current action, are never persisted, and terminate the complete child process group before cleanup. A command cancelled while waiting for its interaction turn never touches or terminalizes that session.
|
|
67
|
-
- Screenshots stay in Controller-owned artifact storage. JSON responses are capped before entering evidence; event payload fields and direct fill results are redacted.
|
|
68
|
-
- Open accepts only an app name or bundle identifier, not a URL or token-bearing deep link. `fill` is limited to non-sensitive text; passwords and verification codes must be entered manually.
|
|
69
|
-
- Command failure, explicit close, or the next access after expiry attempts to close the provider session. Terminal state is written only after close succeeds. For an exact session inside its isolated `AGENT_DEVICE_STATE_DIR`, provider code `SESSION_NOT_FOUND` is also terminal success: it proves there is no provider-owned session left, so the local fence is released rather than remaining permanently `closing`. Other cleanup failures remain `closing`, keep device ownership fenced, and can be retried through the idempotent close action. Fill arguments and diagnostics are redacted from failure evidence. The lightweight interaction record remains bounded, while the provider daemon and a healthy XCTest Runner use configurable finite idle retention (five minutes by default) so adjacent trusted actions do not repeatedly pay cold-start cost; explicit close still terminates ownership immediately.
|
|
70
|
-
- Physical iPhone mutation is limited to an explicitly selected device, a healthy signed Runner, authorized typed actions, and the same cleanup/redaction fence. Closing never shuts down a physical phone.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
## Physical iOS Computer Use boundary
|
|
74
|
-
|
|
75
|
-
The iOS plugin treats a paired physical iPhone as a separate `ios-device` ownership provider. CoreDevice remains the baseline path, while agent-device is an optional signed XCTest engine for bounded direct UI automation.
|
|
76
|
-
|
|
77
|
-
The CoreDevice layer is authoritative for bounded device discovery, exact installed-app lookup, foreground application launch, and native PNG screen capture. Device selection is exact by CoreDevice identifier, UDID, or an unambiguous exact name. Responses omit serial numbers, ECIDs, application container paths, pairing records, and signing material.
|
|
78
|
-
|
|
79
|
-
UI-tree inspection and input injection are optional. They can use either a separately installed WebDriverAgent-compatible runner forwarded to the configured unauthenticated localhost endpoint, or the pinned local agent-device XCTest Runner prepared with an explicitly supplied Apple team and unique runner bundle identifier. Forge never downloads automation tooling at action time or persists signing credentials. A missing or unhealthy runner leaves CoreDevice launch and screenshot available while UI actions fail closed with typed prerequisite errors.
|
|
80
|
-
|
|
81
|
-
Every physical-device mutation is serialized through the interaction session. Text input is removed from results and event evidence. Passwords, passcodes, verification codes, biometric prompts, account recovery, purchases, checkout submission, order confirmation, and payment semantics are human-only. The provider does not jailbreak devices, bypass device locks, solve CAPTCHAs, accept tokenized deep links, or shut down or erase the phone when a session closes.
|
|
82
|
-
|
|
83
|
-
## Browser CDP execution boundary
|
|
84
|
-
|
|
85
|
-
Browser interaction sessions keep one durable session and tab-resume model across all Browser modes. When the Gateway is Bun-hosted and the selected mode is `attach_preferred`, the interaction plane crosses a narrow Node process boundary for the complete Browser page action. This boundary exists solely to host Playwright's CDP WebSocket connection; policy checks, domain allowlisting, tab matching, session persistence, diagnostics, and action behavior remain implemented by the shared Browser adapter.
|
|
86
|
-
|
|
87
|
-
The bridge uses bounded stdin/stdout JSON, a minimal child environment, an explicitly resolved Node executable, no shell, and bounded startup/action lifetime. A host marker prevents recursion. Test runtime hooks bypass the bridge so deterministic adapter unit tests remain in-process. Attached-browser teardown is `disconnect`, preserving the user's Chrome process and login state; managed persistent and isolated contexts retain their existing close semantics.
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
# Forge Runtime Implementation Status
|
|
2
|
-
|
|
3
|
-
> Status: **Runtime Authority**
|
|
4
|
-
> Baseline: **Canonical Forge Runtime — 2026-08-06**
|
|
5
|
-
|
|
6
|
-
## Completion Statement
|
|
7
|
-
|
|
8
|
-
The **Canonical Single Runtime vertical slice** is implemented in executable code:
|
|
9
|
-
|
|
10
|
-
```text
|
|
11
|
-
forge-runtime
|
|
12
|
-
-> MCP Transport
|
|
13
|
-
-> Controller Services
|
|
14
|
-
-> Scheduler and Repository Actors
|
|
15
|
-
-> Process Runtime and Workers
|
|
16
|
-
-> Evidence, Artifact, and Projection planes
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
One Runtime Root owns lifecycle, readiness, scheduling, process fencing, and the active whole-release identity. Standalone Recovery owns independent observation, bounded restart, and active/previous whole-release rollback. Supervisor, runtime slots, independent Daemon authority, component rollout, KeepAlive commands, and compatibility configuration authority are deleted.
|
|
20
|
-
|
|
21
|
-
## Capability Matrix
|
|
22
|
-
|
|
23
|
-
| Capability | Status | Runtime evidence |
|
|
24
|
-
| --- | --- | --- |
|
|
25
|
-
| Thin MCP Gateway | Implemented | `src/runtime/gateway/mcp/router.ts`, `src/cli/mcp/server.ts`, `src/cli/mcp/transports/http.ts` |
|
|
26
|
-
| Thin Harness V1 Fast Path | Implemented | `src/runtime/execution/thin-harness/` router, fast executor, receipts, typed batch, lightweight lanes; eligible short repository commands skip Local Job / ExecutionJob; docs in `thin-harness-v1.md` |
|
|
27
|
-
| Deterministic MCP transport lifecycle | Implemented | global `McpSessionRegistry`, stream leases, active-POST protection, capacity-aware `/ready`, and recoverable tool-surface fencing that keeps the stale transport alive until replacement initialize supersedes it |
|
|
28
|
-
| Unified Process Runtime | Implemented | `src/runtime/execution/process-runtime/`; repository commands and checks spawn once, return stable Process handles, preserve output/completion state, and attach later status/wait/log/cancel calls without re-execution |
|
|
29
|
-
| Independent daemon lifecycle | Deleted | `runtime-status-client.ts` is read-only observation over Canonical Forge Runtime state and cannot start, replace, recover, or fence Workers |
|
|
30
|
-
| Canonical Single Runtime | Implemented in source; live activation separately authorized | `src/runtime/root/` starts Controller Services, SQLite, Scheduler, Gateway Adapter, and MCP Transport under one lifecycle owner |
|
|
31
|
-
| Legacy Supervisor/Ingress/slot lifecycle | Deleted | Supervisor, Stable Ingress, slots, bootstrap authority, restart coordinator, component rollout/rollback, and repository lifecycle scripts are absent and guarded against reintroduction |
|
|
32
|
-
| Isolated Worker processes | Implemented | `src/runtime/execution/workers/worker-entry.ts`, Scheduler process spawning |
|
|
33
|
-
| Per-Repository Actor | Implemented | `src/runtime/control-plane/repo-actor/actor.ts`, actor registry and repository mailbox lock |
|
|
34
|
-
| Resource Claims | Implemented | `src/runtime/gateway/mcp/resource-policy.ts`, `resources/claims/conflicts.ts` |
|
|
35
|
-
| Renewable Leases and fencing tokens | Implemented | `src/runtime/resources/leases/store.ts` |
|
|
36
|
-
| Zombie Worker exclusion | Implemented | attempt/PID/exact-Lease ownership on heartbeat, renewal, release and terminal writes |
|
|
37
|
-
| Workspace single writer | Implemented | Workspace Claim conflicts and eligible automatic Worktree placement |
|
|
38
|
-
| Concurrent Worktrees with serialized integration | Implemented | unique Worktree Claims plus exclusive Integration/Git-ref Claims |
|
|
39
|
-
| Global fair scheduler | Implemented | priority aging, persisted repository fairness, global/repository quotas |
|
|
40
|
-
| Provider and host budgets | Implemented | Worker, Agent provider, Heavy Check, memory and CPU-load admission limits |
|
|
41
|
-
| Durable reconciliation | Implemented | heartbeat, deadline, Operation Receipt recovery, safe retry and ambiguous-mutation stop |
|
|
42
|
-
| Startup recovery before readiness | Implemented in Canonical Runtime | SQLite, Controller Services and in-process Scheduler initialize before MCP end-to-end probe; any fatal core failure makes the one Runtime readiness false and stops the complete Runtime |
|
|
43
|
-
| Canonical repository command input | Implemented | typed argv is validated and direct-spawned without shell reparsing; legacy strings use one explicit compatibility shell boundary |
|
|
44
|
-
| Active/recent/request indexes | Implemented | Execution Job, Agent Run, Task-to-Run, pending integration, Local Job, Occurrence, Portfolio and Finding indexes |
|
|
45
|
-
| Schedule, Trigger, Decision and Occurrence | Implemented | interval/manual/UTC cron/calendar/condition/event/dependency triggers, bounded Occurrence and persisted Decision |
|
|
46
|
-
| Schedule safety policy | Implemented | Shadow Mode, max-active, daily budget, cooldown, exponential backoff, failure circuit breaker and stop conditions |
|
|
47
|
-
| Candidate Finding governance | Implemented | semantic dedupe, evidence, observation count and explicit human promotion |
|
|
48
|
-
| Personal-assistant plugin manifests and registry | Implemented | `src/runtime/plugins/`, Controller Home `plugins/`, MCP and Local Controller discovery |
|
|
49
|
-
| Portfolio DAG and Saga | Implemented | dependency-cycle rejection, deterministic stop and compensation under `src/runtime/workflow/portfolio/` |
|
|
50
|
-
| Evidence Plane | Implemented | unified append-only events, exact-revision evidence, Operation Receipts and bounded Artifacts |
|
|
51
|
-
| Materialized projections | Implemented | dirty-marker invalidation, indexed runtime projections and non-blocking Controller Context refresh |
|
|
52
|
-
| Release Freeze and Gate | Implemented | exclusive `release:<repoId>` Lease and deterministic exact-revision release manifest |
|
|
53
|
-
| External side-effect authorization | Implemented | Gateway/Portfolio/Schedule/Worker defense-in-depth policy |
|
|
54
|
-
| Whole-Runtime readiness | Implemented in the Canonical Runtime source path | Public readiness is one `ready: boolean`; database, Scheduler, release coherence, MCP transport and repository checks are diagnostic evidence rather than independent lifecycle states |
|
|
55
|
-
| Legacy compatibility | Implemented | stable MCP facade, unchanged compatibility fingerprint, Local Job projection into Execution Job |
|
|
56
|
-
| Work-only execution contract convergence | Implemented for Work-backed Tasks | `WorkContract` owns objective/scope/check/risk/status/phase and completion receipt; linked Task fields are read projections, PlanStep retains `workId`, and receipt/revision/cleanup gates fail closed |
|
|
57
|
-
| Node/Bun process portability | Implemented | project TypeScript Loader and bounded Worker/child process execution; Bun remains the supported package/test runtime |
|
|
58
|
-
|
|
59
|
-
## Public Contract and Tool Surface
|
|
60
|
-
|
|
61
|
-
The normal ChatGPT-facing MCP surface is a bounded **19-tool** schema. The five preferred orchestration facades are `rh_status`, `rh_access`, `rh_inbox`, `rh_context`, and `rh_work`. Repository selection, `repository_command_execute`, bounded source read/patch, focused checks, typed plugin dispatch, Process lifecycle, and bounded result access complete the default surface defined by `src/cli/mcp/toolset-names.ts`.
|
|
62
|
-
|
|
63
|
-
The Runtime keeps internal atomic handlers and an exhaustive `full` compatibility profile without advertising them to ordinary ChatGPT discovery. `core` remains a compatibility label for the same bounded default surface. Request/Full Access changes execution authorization, not tool discovery.
|
|
64
|
-
|
|
65
|
-
Small understood work is Direct-first. Repository commands and checks use Unified Process Runtime and return one stable Process lifecycle; known-long calls can return a handle immediately, while later `process_get`, `process_wait`, `process_logs`, and `process_cancel` attach to that same physical execution. Durable Work, isolated worktrees, or workers are introduced when recovery, dependency tracking, isolation, parallelism, or a longer lifecycle actually requires them.
|
|
66
|
-
|
|
67
|
-
Tool names and input schemas are fingerprinted. A stale MCP session receives `MCP_TOOL_SURFACE_CHANGED` with a reinitialize instruction while its transport remains available for the host to observe the reset. Replacement initialize then supersedes and closes the old session; schema rotation must not unregister the Forge namespace from the host conversation.
|
|
68
|
-
|
|
69
|
-
Capability descriptors identify domain group, operation class, risk, facade route, and schema source. Plugin completeness is separate from the core Runtime baseline: optional plugin health does not redefine repository execution or Runtime readiness unless the requested operation explicitly depends on that plugin.
|
|
70
|
-
|
|
71
|
-
## Runtime Truth
|
|
72
|
-
|
|
73
|
-
Controller Home owns runtime state:
|
|
74
|
-
|
|
75
|
-
```text
|
|
76
|
-
repositories/<repoId>/
|
|
77
|
-
execution-jobs/
|
|
78
|
-
plugins/
|
|
79
|
-
leases/
|
|
80
|
-
schedules/
|
|
81
|
-
records/
|
|
82
|
-
occurrences/
|
|
83
|
-
decisions/
|
|
84
|
-
indexes/
|
|
85
|
-
findings/
|
|
86
|
-
artifacts/
|
|
87
|
-
evidence/
|
|
88
|
-
events/
|
|
89
|
-
projections/
|
|
90
|
-
runs/
|
|
91
|
-
edit-sessions/
|
|
92
|
-
|
|
93
|
-
indexes/execution-jobs/
|
|
94
|
-
scheduler/state.json
|
|
95
|
-
portfolio/workflows/
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
Repository files under `plans/`, `tasks/` and Issue storage remain business intent and audit material. They are not scanned as a hot execution queue.
|
|
99
|
-
|
|
100
|
-
## Compatibility Boundary
|
|
101
|
-
|
|
102
|
-
The following remain supported:
|
|
103
|
-
|
|
104
|
-
- original Issue and Task lifecycle;
|
|
105
|
-
- Task/Run separation and retry history;
|
|
106
|
-
- Direct Edit sessions;
|
|
107
|
-
- Local Bridge API and UI;
|
|
108
|
-
- repository registry and GitHub mapping;
|
|
109
|
-
- Agent Run and Worktree integration records;
|
|
110
|
-
- legacy MCP schemas and stored-state readers;
|
|
111
|
-
- historical plans and architecture documents for audit.
|
|
112
|
-
|
|
113
|
-
`src/cli/mcp/tools.ts` is now a thin stable facade. `legacy-tool-service.ts` contains compatibility implementations invoked inside isolated Workers when work is durable. No product capability was removed to reduce source size or latency.
|
|
114
|
-
|
|
115
|
-
## Validation Authority
|
|
116
|
-
|
|
117
|
-
Completion is guarded by:
|
|
118
|
-
|
|
119
|
-
- strict TypeScript checking across `src`, `scripts` and `tests`;
|
|
120
|
-
- architecture invariant checks;
|
|
121
|
-
- MCP compatibility fingerprint checks;
|
|
122
|
-
- recovery, fencing and ambiguous-side-effect smoke tests;
|
|
123
|
-
- Schedule trigger/Decision/backoff smoke tests;
|
|
124
|
-
- Scheduler → Repo Actor → isolated Worker → Evidence process smoke;
|
|
125
|
-
- HTTP Gateway `/health`, `/ready` and repository-health smoke;
|
|
126
|
-
- package and source-manifest verification.
|
|
127
|
-
|
|
128
|
-
Release readiness requires Bun-native tests, TypeScript checking, MCP surface checks, public-document validation, tracked-file hygiene, and package export verification in the release environment.
|
|
@@ -1,413 +0,0 @@
|
|
|
1
|
-
# Job and Run Lifecycle
|
|
2
|
-
|
|
3
|
-
> Status: **Runtime Authority**
|
|
4
|
-
|
|
5
|
-
## 1. Purpose
|
|
6
|
-
|
|
7
|
-
This document defines asynchronous execution semantics. It prevents request lifetime, process lifetime, Job lifetime, Run lifetime, and Task lifetime from being treated as the same state machine.
|
|
8
|
-
|
|
9
|
-
## 2. Lifecycle Ownership
|
|
10
|
-
|
|
11
|
-
| Lifecycle | Owner | Answers |
|
|
12
|
-
| --- | --- | --- |
|
|
13
|
-
| Request | Thin Gateway | Was the command accepted and what ID should the client query? |
|
|
14
|
-
| Job | Repo Actor / Controller | What asynchronous system operation is pending or complete? |
|
|
15
|
-
| Run | Agent execution subsystem | What happened during one Agent attempt? |
|
|
16
|
-
| Task | Workflow Plane | Is the objective ready, under review, verified, accepted, or terminal? |
|
|
17
|
-
| Worker | Execution Plane | Which process currently holds execution ownership? |
|
|
18
|
-
| Lease | Resource subsystem | May this Worker still mutate the protected resource? |
|
|
19
|
-
|
|
20
|
-
No lifecycle may substitute for another.
|
|
21
|
-
|
|
22
|
-
## 3. Job State Machine
|
|
23
|
-
|
|
24
|
-
### Target States
|
|
25
|
-
|
|
26
|
-
```text
|
|
27
|
-
accepted
|
|
28
|
-
-> queued
|
|
29
|
-
-> waiting_for_resource
|
|
30
|
-
-> dispatched
|
|
31
|
-
-> running
|
|
32
|
-
-> succeeded
|
|
33
|
-
|
|
34
|
-
accepted/queued/waiting_for_resource/dispatched/running
|
|
35
|
-
-> failed
|
|
36
|
-
-> timed_out
|
|
37
|
-
-> cancelled
|
|
38
|
-
-> orphaned
|
|
39
|
-
-> stale
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
Optional review-oriented Jobs may include:
|
|
43
|
-
|
|
44
|
-
```text
|
|
45
|
-
running -> waiting_for_user -> running
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### State Meanings
|
|
49
|
-
|
|
50
|
-
- `accepted` — durable record exists and idempotency identity is reserved.
|
|
51
|
-
- `queued` — eligible for scheduling but no Worker assigned.
|
|
52
|
-
- `waiting_for_resource` — blocked by a dependency, claim, quota, or barrier.
|
|
53
|
-
- `dispatched` — a Worker or external provider was assigned; execution may not have started.
|
|
54
|
-
- `running` — valid Lease and execution heartbeat exist.
|
|
55
|
-
- `waiting_for_user` — execution cannot progress without human input.
|
|
56
|
-
- `succeeded` — the Job-owned operation completed successfully and result evidence is durable.
|
|
57
|
-
- `failed` — operation completed unsuccessfully with durable error evidence.
|
|
58
|
-
- `timed_out` — persisted deadline was exceeded and termination/reconciliation was recorded.
|
|
59
|
-
- `cancelled` — an authorized cancellation ended this Job's ownership.
|
|
60
|
-
- `orphaned` — ownership disappeared and success/failure cannot be proven.
|
|
61
|
-
- `stale` — the operation's required revision or precondition changed before valid completion.
|
|
62
|
-
|
|
63
|
-
### Current Implementation
|
|
64
|
-
|
|
65
|
-
Local Bridge currently uses compatibility states such as `approved`, `running`, and `dispatched`. These remain readable. `approved` maps to accepted/queued semantics rather than a human approval queue.
|
|
66
|
-
|
|
67
|
-
### Migration Rule
|
|
68
|
-
|
|
69
|
-
New Job types should use the target meanings even if stored names remain temporarily compatible. A compatibility adapter must not mark a Job succeeded merely because a linked Run was created or dispatched.
|
|
70
|
-
|
|
71
|
-
## 4. Admission Protocol
|
|
72
|
-
|
|
73
|
-
Every long operation follows:
|
|
74
|
-
|
|
75
|
-
```text
|
|
76
|
-
1. validate repository, checkout, schema, policy and authorization
|
|
77
|
-
2. derive requestId and semanticKey
|
|
78
|
-
3. check idempotency index
|
|
79
|
-
4. evaluate Task/dependency and resource policy
|
|
80
|
-
5. atomically persist Job + accepted event + index entries
|
|
81
|
-
6. return Job ID to caller
|
|
82
|
-
7. schedule asynchronously
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
If step 5 fails, no execution may start.
|
|
86
|
-
|
|
87
|
-
If the client disconnects after step 5, the Job remains accepted.
|
|
88
|
-
|
|
89
|
-
## 5. Idempotency Protocol
|
|
90
|
-
|
|
91
|
-
### Identity
|
|
92
|
-
|
|
93
|
-
```text
|
|
94
|
-
idempotencyKey = hash(requestId, repoId, operationType, semanticKey)
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
### Behavior
|
|
98
|
-
|
|
99
|
-
- The first accepted command owns the key.
|
|
100
|
-
- Repeated calls return the original Job summary.
|
|
101
|
-
- A caller may explicitly request a new attempt only through retry semantics, producing a new attempt identity linked to the prior Job.
|
|
102
|
-
- A terminal failure is not silently rerun because the client repeated the original request.
|
|
103
|
-
|
|
104
|
-
### Semantic Keys
|
|
105
|
-
|
|
106
|
-
Examples:
|
|
107
|
-
|
|
108
|
-
```text
|
|
109
|
-
dispatch-task: issueId + taskId + retryFromRunId
|
|
110
|
-
run-check: checkId + revision + environmentFingerprint
|
|
111
|
-
verify-edit: sessionId + editRevision + checkSet
|
|
112
|
-
repository-command: approvalToken + checkoutSnapshot
|
|
113
|
-
integration: runId + targetCheckoutId + reviewedDiffHash
|
|
114
|
-
schedule-occurrence: scheduleId + occurrenceWindow + repoId
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
## 6. Scheduling and Claims
|
|
118
|
-
|
|
119
|
-
After admission, the Repo Actor computes required Claims.
|
|
120
|
-
|
|
121
|
-
Possible results:
|
|
122
|
-
|
|
123
|
-
- all Claims granted: assign Worker and Lease;
|
|
124
|
-
- compatible shared execution already active: subscribe to it;
|
|
125
|
-
- temporary conflict: enter `waiting_for_resource`;
|
|
126
|
-
- dependency incomplete: enter `waiting_for_dependency` detail;
|
|
127
|
-
- release freeze or policy block: wait or fail according to explicit policy;
|
|
128
|
-
- invalid scope or forbidden action: fail before Worker dispatch.
|
|
129
|
-
|
|
130
|
-
A waiting Job remains observable and retains its deadline and queue metadata.
|
|
131
|
-
|
|
132
|
-
## 7. Worker Start Protocol
|
|
133
|
-
|
|
134
|
-
A Worker starts only after:
|
|
135
|
-
|
|
136
|
-
1. Job is durable;
|
|
137
|
-
2. resource Claims are granted;
|
|
138
|
-
3. Lease with fencing token is persisted;
|
|
139
|
-
4. execution configuration and artifact paths are durable.
|
|
140
|
-
|
|
141
|
-
The Worker then records:
|
|
142
|
-
|
|
143
|
-
```text
|
|
144
|
-
workerAssigned
|
|
145
|
-
workerStarted
|
|
146
|
-
heartbeat
|
|
147
|
-
progress events
|
|
148
|
-
output references
|
|
149
|
-
terminal result
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
A PID is diagnostic evidence. Lease identity is the authority to write lifecycle state.
|
|
153
|
-
|
|
154
|
-
## 8. Heartbeat and Deadline
|
|
155
|
-
|
|
156
|
-
A running Job or Run records:
|
|
157
|
-
|
|
158
|
-
```text
|
|
159
|
-
startedAt
|
|
160
|
-
deadlineAt
|
|
161
|
-
heartbeatAt
|
|
162
|
-
leaseExpiresAt
|
|
163
|
-
worker identity
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
The Controller distinguishes:
|
|
167
|
-
|
|
168
|
-
- missing heartbeat but live process;
|
|
169
|
-
- dead process but unexpired Lease;
|
|
170
|
-
- expired Lease;
|
|
171
|
-
- completed result with missing terminal transition;
|
|
172
|
-
- process tree still alive after parent exit.
|
|
173
|
-
|
|
174
|
-
Timeout handling must attempt process-tree termination, record the signal path, wait for terminal confirmation or mark unresolved descendants, and persist the resulting state.
|
|
175
|
-
|
|
176
|
-
## 9. Run State Machine
|
|
177
|
-
|
|
178
|
-
### Current and Target Core States
|
|
179
|
-
|
|
180
|
-
```text
|
|
181
|
-
queued
|
|
182
|
-
-> starting
|
|
183
|
-
-> running
|
|
184
|
-
-> waiting_for_user
|
|
185
|
-
-> succeeded
|
|
186
|
-
|
|
187
|
-
queued/starting/running/waiting_for_user
|
|
188
|
-
-> failed
|
|
189
|
-
-> cancelled
|
|
190
|
-
-> unknown
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
A timeout is represented by terminal failure/unknown metadata plus a structured termination reason until a dedicated Run `timed_out` status is introduced.
|
|
194
|
-
|
|
195
|
-
### Run Success Contract
|
|
196
|
-
|
|
197
|
-
For Workspace execution, Run success requires:
|
|
198
|
-
|
|
199
|
-
- Agent process exited successfully;
|
|
200
|
-
- result record is durable;
|
|
201
|
-
- declared process tree is closed;
|
|
202
|
-
- final diff/evidence can be read.
|
|
203
|
-
|
|
204
|
-
For isolated Worktree execution with automatic integration, Task-visible success requires either:
|
|
205
|
-
|
|
206
|
-
- integration completed, `integratedSessionId` exists, and cleanup is recorded; or
|
|
207
|
-
- Run execution succeeded but integration is explicitly pending/failed, in which case the Task remains review/integration pending and must not appear fully completed.
|
|
208
|
-
|
|
209
|
-
For GitHub execution, provider success and collaboration artifacts are recorded, but merge and acceptance remain separate.
|
|
210
|
-
|
|
211
|
-
## 10. Job-to-Run Relationship
|
|
212
|
-
|
|
213
|
-
A Dispatch Task Job may proceed:
|
|
214
|
-
|
|
215
|
-
```text
|
|
216
|
-
Job accepted
|
|
217
|
-
-> Run accepted
|
|
218
|
-
-> Run dispatched
|
|
219
|
-
-> Job dispatched
|
|
220
|
-
-> Run running
|
|
221
|
-
-> Job running
|
|
222
|
-
-> Run terminal
|
|
223
|
-
-> continuation / integration / verification
|
|
224
|
-
-> Job terminal
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
The Job may remain non-terminal after Run success while integration or required continuation remains part of the Job contract.
|
|
228
|
-
|
|
229
|
-
A Run terminal failure normally makes its owning dispatch Job fail, but Task retry semantics still require an explicit new Run.
|
|
230
|
-
|
|
231
|
-
## 11. Shared Execution
|
|
232
|
-
|
|
233
|
-
Identical check or deterministic execution requests may share one physical Worker execution.
|
|
234
|
-
|
|
235
|
-
The model is:
|
|
236
|
-
|
|
237
|
-
```text
|
|
238
|
-
SharedExecution
|
|
239
|
-
-> Subscriber Job A
|
|
240
|
-
-> Subscriber Job B
|
|
241
|
-
-> Subscriber Job C
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
Rules:
|
|
245
|
-
|
|
246
|
-
- each subscriber has independent cancellation, timeout, stale, and result-link state;
|
|
247
|
-
- cancelling one subscriber does not kill the shared process while another subscriber remains active;
|
|
248
|
-
- the physical execution terminates only after the last subscriber leaves or the shared contract itself fails;
|
|
249
|
-
- every subscriber receives the shared result or its own scoped terminal outcome;
|
|
250
|
-
- shared identity includes Revision and execution environment.
|
|
251
|
-
|
|
252
|
-
In-memory subscriber sets may optimize delivery but must be reconstructable from durable Job relationships.
|
|
253
|
-
|
|
254
|
-
## 12. Cancellation
|
|
255
|
-
|
|
256
|
-
Cancellation targets an entity and authority boundary.
|
|
257
|
-
|
|
258
|
-
### Job cancellation
|
|
259
|
-
|
|
260
|
-
- marks that Job cancelled;
|
|
261
|
-
- releases or withdraws its Claims;
|
|
262
|
-
- removes its subscription from shared work;
|
|
263
|
-
- terminates a dedicated Worker only if the Job is its sole owner.
|
|
264
|
-
|
|
265
|
-
### Run cancellation
|
|
266
|
-
|
|
267
|
-
- attempts to stop the Agent process tree or provider session;
|
|
268
|
-
- records terminal evidence;
|
|
269
|
-
- does not delete Task or prior evidence.
|
|
270
|
-
|
|
271
|
-
### Request cancellation
|
|
272
|
-
|
|
273
|
-
A disconnected or abandoned MCP request after acknowledgement does not cancel the Job.
|
|
274
|
-
|
|
275
|
-
## 13. Timeout
|
|
276
|
-
|
|
277
|
-
Timeout is evaluated from a persisted deadline, not an in-memory timer alone.
|
|
278
|
-
|
|
279
|
-
On timeout:
|
|
280
|
-
|
|
281
|
-
1. confirm the Job is still owned by the same fencing token;
|
|
282
|
-
2. mark timeout intent;
|
|
283
|
-
3. signal the complete process tree or external provider;
|
|
284
|
-
4. persist termination events;
|
|
285
|
-
5. close or orphan the Lease;
|
|
286
|
-
6. record `timed_out` or `unknown` according to available evidence;
|
|
287
|
-
7. release Claims;
|
|
288
|
-
8. expose explicit retry semantics.
|
|
289
|
-
|
|
290
|
-
## 14. Orphan Reconciliation
|
|
291
|
-
|
|
292
|
-
A Job or Run may be orphaned when:
|
|
293
|
-
|
|
294
|
-
- Controller or Worker exits unexpectedly;
|
|
295
|
-
- persisted owner PID is dead;
|
|
296
|
-
- Lease expires without terminal result;
|
|
297
|
-
- external provider state is unavailable;
|
|
298
|
-
- result exists but lifecycle transition was interrupted.
|
|
299
|
-
|
|
300
|
-
Reconciliation order:
|
|
301
|
-
|
|
302
|
-
```text
|
|
303
|
-
1. read durable result/evidence
|
|
304
|
-
2. inspect Lease and fencing token
|
|
305
|
-
3. inspect process/provider liveness
|
|
306
|
-
4. inspect process tree and artifact completeness
|
|
307
|
-
5. recover terminal state when provable
|
|
308
|
-
6. otherwise mark orphaned/unknown
|
|
309
|
-
7. require explicit retry where duplicate execution is unsafe
|
|
310
|
-
```
|
|
311
|
-
|
|
312
|
-
Reconciliation must be idempotent.
|
|
313
|
-
|
|
314
|
-
## 15. Stale State
|
|
315
|
-
|
|
316
|
-
A Job becomes stale when a required precondition changes, including:
|
|
317
|
-
|
|
318
|
-
- repository Revision changed while a queued or running check required the old Revision;
|
|
319
|
-
- approval token no longer matches checkout snapshot;
|
|
320
|
-
- source Run diff no longer applies to target Checkout;
|
|
321
|
-
- Schedule Occurrence window was superseded;
|
|
322
|
-
- resource mapping or repository identity changed incompatibly.
|
|
323
|
-
|
|
324
|
-
Stale work must not produce reusable success evidence.
|
|
325
|
-
|
|
326
|
-
## 16. Retry
|
|
327
|
-
|
|
328
|
-
Retry creates a new attempt linked to the terminal entity:
|
|
329
|
-
|
|
330
|
-
```text
|
|
331
|
-
priorJobId
|
|
332
|
-
priorRunId
|
|
333
|
-
attemptNumber
|
|
334
|
-
retryReason
|
|
335
|
-
new requestId or retry identity
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
Before retry, the Repo Actor determines whether:
|
|
339
|
-
|
|
340
|
-
- the original operation is safe to repeat;
|
|
341
|
-
- a result may already exist;
|
|
342
|
-
- cleanup is complete;
|
|
343
|
-
- the repository Revision changed;
|
|
344
|
-
- scope or acceptance criteria must be revised;
|
|
345
|
-
- a different Agent is justified.
|
|
346
|
-
|
|
347
|
-
Infrastructure failure does not automatically imply implementation failure, and Agent failure does not automatically justify switching Agents.
|
|
348
|
-
|
|
349
|
-
## 17. Continuation After Successful Run
|
|
350
|
-
|
|
351
|
-
Successful Run continuation is deterministic:
|
|
352
|
-
|
|
353
|
-
```text
|
|
354
|
-
Run success
|
|
355
|
-
-> inspect execution mode
|
|
356
|
-
-> integrate when required
|
|
357
|
-
-> run declared checks when policy applies
|
|
358
|
-
-> persist Verification
|
|
359
|
-
-> auto-complete eligible low/medium-risk Task
|
|
360
|
-
-> wait for human acceptance for high/destructive Task
|
|
361
|
-
-> unlock dependent Tasks
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
Every continuation step is either a durable Job or an atomic state transaction. A Controller restart can resume from the last durable boundary.
|
|
365
|
-
|
|
366
|
-
## 18. Terminal-State Rules
|
|
367
|
-
|
|
368
|
-
- `succeeded` requires durable result evidence.
|
|
369
|
-
- `failed` requires durable error evidence.
|
|
370
|
-
- `cancelled` requires cancellation authority and event.
|
|
371
|
-
- `timed_out` requires persisted deadline evidence.
|
|
372
|
-
- `orphaned` or `unknown` means the system cannot prove success or failure.
|
|
373
|
-
- `stale` means result cannot satisfy the original semantic contract.
|
|
374
|
-
- terminal entities do not return to running;
|
|
375
|
-
- retry creates a new entity or attempt relationship.
|
|
376
|
-
|
|
377
|
-
## 19. Projection Rules
|
|
378
|
-
|
|
379
|
-
Active indexes include only non-terminal Jobs/Runs. Terminal history is queried separately and bounded by requested limits.
|
|
380
|
-
|
|
381
|
-
A list endpoint may reconcile active entities but must not scan full terminal history. An entity detail endpoint may reconcile that entity specifically.
|
|
382
|
-
|
|
383
|
-
## 20. Audit Requirements
|
|
384
|
-
|
|
385
|
-
Every lifecycle transition records:
|
|
386
|
-
|
|
387
|
-
```text
|
|
388
|
-
entityId
|
|
389
|
-
previousStatus
|
|
390
|
-
nextStatus
|
|
391
|
-
actor
|
|
392
|
-
requestId
|
|
393
|
-
correlationId
|
|
394
|
-
causationId
|
|
395
|
-
fencingToken when applicable
|
|
396
|
-
reason
|
|
397
|
-
evidence references
|
|
398
|
-
occurredAt
|
|
399
|
-
```
|
|
400
|
-
|
|
401
|
-
Lifecycle transitions without an audit event are recovery anomalies and must be detectable by governance checks.
|
|
402
|
-
|
|
403
|
-
## 21. Controller Ownership Fencing
|
|
404
|
-
|
|
405
|
-
Repository controller ownership is a stable lease identity, not a per-Task token. Heartbeat or sibling dispatch renews/reuses the live owner and does not rotate its epoch. The epoch changes only on a proven takeover after the previous owner is dead or its record is malformed. Epoch writes are serialized and atomic.
|
|
406
|
-
|
|
407
|
-
A child Worker receives the current controller PID and epoch as a derived execution capability. It may publish heartbeats or terminal state only while that capability still matches the durable owner record. Parallel sibling Runs therefore cannot invalidate each other by reacquiring repository ownership.
|
|
408
|
-
|
|
409
|
-
## 22. Local Job Projection
|
|
410
|
-
|
|
411
|
-
Local Bridge states are compatibility projections of Agent Runs or durable Execution Jobs. `starting` is active and maps to `running`; it is never interpreted as terminal failure. A projected Local Job synchronizes its durable Job before applying action-specific orphan or timeout rules, preventing a compatibility projection from masking a terminal durable result.
|
|
412
|
-
|
|
413
|
-
Runtime storage is bound before the first Local Job is persisted. This prevents the Job from blocking migration of the directory that contains its own state.
|