@moretea-labs/forge 1.8.0 → 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 +70 -7
- package/CHANGELOG.md +14 -0
- package/CLAUDE.md +17 -2
- package/CONTRIBUTING.md +3 -2
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/adapters/chatgpt/browser-delivery-host.ts +7 -1
- package/adapters/chatgpt/browser-delivery-runtime.ts +529 -56
- package/adapters/chatgpt/controller-binding-store.ts +101 -22
- package/adapters/chatgpt/controller-round-host.ts +15 -25
- package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
- package/adapters/chatgpt/provider-delivery.ts +228 -1
- package/adapters/chatgpt/work-conversation-binding-store.ts +79 -53
- 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-discovery.ts +11 -31
- package/adapters/computer/interaction-target-authority.ts +142 -18
- package/adapters/mcp/auth.ts +0 -1
- package/adapters/mcp/instructions.ts +5 -4
- package/adapters/mcp/multi-repository.ts +3 -19
- package/adapters/mcp/oauth.ts +73 -0
- package/adapters/mcp/paths.ts +4 -1
- 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 +411 -73
- package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -0
- package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
- package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
- package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
- package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
- package/adapters/mcp/runtime-gateway/execution-tools.ts +8 -42
- package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +117 -45
- package/adapters/mcp/runtime-gateway/process-tools.ts +190 -22
- package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
- package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
- package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
- package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
- package/adapters/mcp/runtime-gateway/router.ts +18 -504
- package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +14 -65
- package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +113 -173
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +15 -5
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +1 -0
- package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +358 -266
- package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
- package/adapters/mcp/runtime-gateway/work-adapter.ts +261 -3122
- 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-workflow-operations.ts +113 -0
- package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
- package/adapters/mcp/server.ts +67 -23
- package/adapters/mcp/setup.ts +1 -3
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +44 -170
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +4 -9
- package/adapters/mcp/tool-mapping/repository-tools.ts +133 -142
- package/adapters/mcp/toolset-names.ts +5 -0
- package/adapters/mcp/toolset.ts +6 -5
- package/adapters/mcp/transports/http-observation.ts +365 -0
- package/adapters/mcp/transports/http.ts +154 -677
- package/adapters/mcp/transports/oauth-http.ts +322 -0
- package/adapters/mcp/transports/session-registry.ts +6 -0
- package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
- package/assets/plugin-registry.v1.json +6 -4
- package/assets/reference-configs/agentic-development-flow.md +25 -0
- package/assets/reference-configs/global-working-rules.md +19 -0
- package/assets/skill-version.json +2 -2
- package/docs/architecture/CURRENT.md +111 -41
- 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/20260907-assistant-learning-loop.md +2 -0
- package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
- 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 +1 -0
- package/docs/architecture/domains/workflow-engine.md +6 -0
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
- package/docs/forge-plugin-management.md +2 -2
- 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/releasing.md +2 -0
- package/docs/operations/standalone-disaster-recovery.md +14 -6
- package/docs/wiki/Implementation.md +1 -1
- package/package.json +25 -14
- 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 +1 -0
- package/packages/kernel/controller/application/continuation-service.ts +281 -0
- package/packages/kernel/controller/application/controller-round-service.ts +12 -0
- package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
- package/packages/kernel/controller/domain/controller-round.ts +4 -1
- package/packages/kernel/controller/domain/execution-quality.ts +3 -1
- package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
- package/packages/kernel/controller/infrastructure/controller-session-store.ts +297 -71
- package/packages/kernel/controller/ports/controller-host.ts +2 -0
- package/packages/kernel/identity/api/index.ts +10 -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/user-request.ts +93 -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/owned-resource-store.ts +259 -0
- package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
- package/packages/kernel/scheduler/api/index.ts +0 -2
- package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
- package/packages/kernel/scheduler/application/settlement.ts +0 -15
- package/packages/kernel/scheduler/domain/schedule.ts +87 -0
- package/packages/kernel/scheduler/infrastructure/schedule-store.ts +153 -133
- package/packages/kernel/work/api/index.ts +3 -2
- package/packages/kernel/work/application/work-service.ts +17 -42
- package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
- package/packages/kernel/work/domain/engineering-design.ts +10 -5
- package/packages/kernel/work/domain/engineering-profile.ts +8 -12
- package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
- package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
- package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
- package/packages/kernel/work/domain/implementation-review.ts +14 -331
- package/packages/kernel/work/domain/objective-graph.ts +119 -0
- package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
- package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
- package/packages/kernel/work/domain/state-machine.ts +25 -63
- package/packages/kernel/work/domain/types.ts +57 -51
- package/packages/kernel/work/infrastructure/work-contract-store.ts +819 -728
- package/packages/kernel/work/ports/work-contract-store.ts +5 -2
- package/packages/plugin-runtime/browser/session-authority.ts +2 -1
- 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 +2 -0
- package/packages/plugin-runtime/computer/target-authority.ts +26 -1
- package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
- package/packages/protocols/computer/contract.ts +27 -1
- package/scripts/activate-source-baseline.ts +7 -9
- package/scripts/canary-controller-semantic-wait.ts +12 -24
- package/scripts/check-mcp-compatibility.ts +48 -136
- package/scripts/check-runtime-architecture.mjs +622 -217
- package/scripts/forge-local-recovery-helper.mjs +93 -15
- package/scripts/lib/project-init-lib.sh +3 -0
- package/scripts/open-source-audit-allowlist.txt +1 -2
- package/scripts/run-bounded-command.mjs +5 -0
- package/scripts/run-governed-gate.ts +0 -1
- 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 +5 -0
- package/scripts/smoke-runtime-recovery.ts +12 -43
- package/scripts/smoke-schedule-engine.ts +23 -15
- 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/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 +7 -3
- package/src/cli/commands/brain-assistant.ts +27 -13
- package/src/cli/commands/brain.ts +13 -15
- package/src/cli/commands/chatgpt.ts +1 -163
- package/src/cli/commands/recovery.ts +135 -121
- package/src/cli/commands/runtime.ts +3 -3
- package/src/cli/commands/setup-profile.ts +8 -0
- package/src/cli/controller/check-runner.ts +13 -2
- 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-pack.ts +10 -8
- 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 +39 -1
- package/src/cli/editing/edit-session.ts +1 -7
- package/src/cli/local-bridge/console-automations.ts +18 -13
- package/src/cli/local-bridge/console-view-models.ts +3 -12
- package/src/cli/local-bridge/facade-api.ts +64 -191
- package/src/cli/local-bridge/server.ts +24 -147
- package/src/cli/local-bridge/types.ts +0 -1
- package/src/cli/mcp/oauth-client-retirement.ts +74 -0
- package/src/cli/repositories/command-executor.ts +29 -23
- package/src/cli/repositories/command-scope.ts +35 -16
- package/src/cli/repositories/controller-home.ts +48 -0
- package/src/cli/repositories/ephemeral-workspace.ts +20 -30
- package/src/cli/repositories/git-command-executor.ts +2 -2
- package/src/cli/repositories/registry.ts +77 -11
- package/src/cli/repositories/structured-git.ts +62 -2
- package/src/cli/repository/session-cache.ts +92 -6
- package/src/runtime/context/assistant-context.ts +20 -7
- package/src/runtime/context/assistant-work-context.ts +89 -27
- package/src/runtime/context/automatic-learning.ts +565 -0
- 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 +46 -9
- package/src/runtime/context/context-pack-process.ts +103 -0
- package/src/runtime/context/context-plane.ts +1 -9
- package/src/runtime/context/direct-controller-learning.ts +298 -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/cleanup-artifact-retention.ts +212 -9
- package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
- package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
- package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
- package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
- package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
- package/src/runtime/control-plane/execution/session-store.ts +31 -1
- package/src/runtime/control-plane/execution/validation.ts +6 -8
- package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
- package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
- package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
- package/src/runtime/control-plane/execution/work-delivery-service.ts +497 -0
- package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
- package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
- package/src/runtime/control-plane/execution/work-handle-authority.ts +188 -109
- package/src/runtime/control-plane/execution/work-handle-store.ts +19 -43
- package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
- package/src/runtime/control-plane/execution/work-operation-service.ts +43 -27
- package/src/runtime/control-plane/execution/work-preparation-service.ts +126 -266
- 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 +173 -186
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -84
- package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +5 -1
- package/src/runtime/control-plane/facade/capability-registry.ts +362 -37
- 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/goal-workloop-access.ts +1 -20
- package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
- package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
- package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
- package/src/runtime/control-plane/facade/index.ts +0 -1
- package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
- package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
- package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
- package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
- package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
- package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
- package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
- package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
- package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
- package/src/runtime/control-plane/facade/types.ts +49 -108
- package/src/runtime/control-plane/facade/work-continuation.ts +8 -8
- package/src/runtime/control-plane/generated-cache-retention.ts +97 -1
- package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +239 -112
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +2 -1
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
- package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
- 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 +63 -300
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +28 -300
- package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
- package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
- package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
- package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
- package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
- package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
- package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
- package/src/runtime/control-plane/release-retention.ts +135 -47
- package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
- package/src/runtime/control-plane/runtime-cleanup.ts +290 -21
- package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
- package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
- package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
- package/src/runtime/diagnostics/incident-repair.ts +313 -146
- package/src/runtime/diagnostics/mcp-timing.ts +114 -0
- package/src/runtime/evidence/artifact-store.ts +158 -40
- package/src/runtime/evidence/evidence-store.ts +112 -8
- package/src/runtime/evidence/output-handle-index.ts +225 -0
- package/src/runtime/evidence/result-store.ts +158 -44
- package/src/runtime/execution/jobs/store.ts +3 -4
- package/src/runtime/execution/managed-workspace.ts +57 -0
- package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
- package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
- package/src/runtime/execution/process-runtime/check-result.ts +105 -1
- package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
- package/src/runtime/execution/process-runtime/command-facade.ts +79 -27
- 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 +3 -0
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
- package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
- 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 +65 -61
- package/src/runtime/execution/process-runtime/runtime.ts +35 -2
- package/src/runtime/execution/process-runtime/store.ts +30 -2
- package/src/runtime/execution/process-runtime/types.ts +6 -1
- package/src/runtime/execution/workers/executor.ts +2 -6
- package/src/runtime/platform/service-inventory.ts +130 -0
- package/src/runtime/platform/service-manager.ts +8 -0
- package/src/runtime/plugins/action-application.ts +85 -28
- package/src/runtime/plugins/app-store-connect-adapter.ts +38 -14
- package/src/runtime/plugins/browser-adapter.ts +757 -34
- package/src/runtime/plugins/browser-automation-service.ts +23 -3
- package/src/runtime/plugins/browser-macos-bridge.ts +321 -29
- package/src/runtime/plugins/browser-manifest-surface.ts +45 -11
- package/src/runtime/plugins/browser-native-session-service.ts +63 -13
- package/src/runtime/plugins/browser-registration.ts +16 -0
- package/src/runtime/plugins/browser-runtime.ts +14 -1
- package/src/runtime/plugins/browser-session-authority.ts +2 -2
- package/src/runtime/plugins/browser-session-store.ts +46 -76
- package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
- 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 +222 -11
- package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
- package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
- package/src/runtime/plugins/external-adapter.ts +42 -6
- package/src/runtime/plugins/external-registration.ts +21 -1
- package/src/runtime/plugins/gmail-adapter.ts +23 -2
- package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
- package/src/runtime/plugins/google-shared.ts +14 -7
- package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
- package/src/runtime/plugins/ios-adapter.ts +1 -1
- package/src/runtime/plugins/lightweight-action.ts +208 -2
- package/src/runtime/plugins/local-system-adapter.ts +12 -2
- 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/store.ts +602 -428
- package/src/runtime/plugins/types.ts +20 -0
- package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
- package/src/runtime/projections/invalidation.ts +7 -3
- package/src/runtime/projections/materialized-view.ts +80 -36
- package/src/runtime/recovery/actions.ts +3 -3
- package/src/runtime/recovery/capability-action-application.ts +46 -45
- package/src/runtime/recovery/lifecycle-inventory.ts +29 -29
- package/src/runtime/recovery/maintenance-executor.ts +374 -123
- package/src/runtime/recovery/store.ts +29 -11
- 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/computer-composition.ts +191 -6
- package/src/runtime/root/controller-progression-composition.ts +192 -0
- package/src/runtime/root/controller-round-composition.ts +20 -1
- package/src/runtime/root/deployment-topology.ts +106 -0
- package/src/runtime/root/entry.ts +4 -3
- package/src/runtime/root/known-good-recovery.ts +184 -0
- package/src/runtime/root/local-bridge.ts +0 -1
- package/src/runtime/root/mcp-transport.ts +111 -18
- package/src/runtime/root/ownership.ts +261 -9
- package/src/runtime/root/package-connector-service.ts +105 -19
- package/src/runtime/root/package-runtime-release.ts +117 -18
- package/src/runtime/root/package-runtime-service.ts +17 -11
- package/src/runtime/root/release-execution-canary.ts +44 -12
- package/src/runtime/root/release-loader.ts +90 -8
- package/src/runtime/root/release-manifest.ts +80 -6
- package/src/runtime/root/release-materialize.ts +372 -28
- package/src/runtime/root/release-store.ts +395 -36
- package/src/runtime/root/runtime-lane.ts +191 -0
- package/src/runtime/root/runtime.ts +159 -27
- package/src/runtime/root/scheduled-controller-composition.ts +28 -3
- package/src/runtime/root/service-runner.ts +2 -2
- package/src/runtime/root/service.ts +36 -33
- package/src/runtime/root/status.ts +48 -0
- package/src/runtime/root/types.ts +32 -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/process-environment.ts +20 -9
- package/src/runtime/shared/response-budget.ts +1 -3
- package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
- package/src/runtime/standalone-recovery/core.ts +3702 -342
- package/src/runtime/standalone-recovery/entry.ts +469 -39
- package/src/runtime/standalone-recovery/installer.ts +262 -148
- package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
- package/src/runtime/standalone-recovery/operation-lock.ts +1 -1
- package/src/runtime/standalone-recovery/performance.ts +54 -16
- package/src/runtime/standalone-recovery/release.ts +53 -5
- package/src/runtime/standalone-recovery/service-labels.ts +5 -2
- package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
- package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
- package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +10 -3
- package/src/runtime/workflow/schedules/engine.ts +138 -172
- package/src/runtime/workflow/schedules/work-continuation.ts +44 -5
- package/src/runtime/workflows/runtime.ts +15 -19
- package/src/testing/test-governance.ts +5 -1
- 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/adapters/chatgpt/controller-host.ts +0 -119
- package/adapters/mcp/controller-round-compatibility.ts +0 -184
- package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
- package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
- package/packages/kernel/progression/api/index.ts +0 -2
- package/packages/kernel/progression/application/projector.ts +0 -211
- package/packages/kernel/progression/domain/types.ts +0 -116
- package/packages/kernel/progression/index.ts +0 -1
- package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
- package/packages/kernel/scheduler/domain/continuation.ts +0 -38
- package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
- package/packages/kernel/work/domain/admission-policy.ts +0 -34
- package/scripts/benchmark-background-check-overlap.ts +0 -228
- package/scripts/benchmark-computer-hotpath.ts +0 -255
- package/scripts/benchmark-controller-hotpath.ts +0 -212
- package/scripts/benchmark-controller-round2.ts +0 -191
- package/scripts/benchmark-ios-agent-device.ts +0 -511
- package/scripts/benchmark-mcp-host.sh +0 -117
- package/scripts/benchmark-mcp-transport.ts +0 -169
- package/scripts/benchmark-operational-memory-activation.ts +0 -235
- package/scripts/benchmark-operational-shadow.ts +0 -28
- 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 -150
- 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/stage-runtime-release.ts +0 -44
- 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/content-equivalent-commit-authority.ts +0 -169
- package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
- package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
- package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
- package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
- package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
- package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
- package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
- package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
- 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 -401
- package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHash } from 'crypto';
|
|
2
|
+
import { resolve } from 'path';
|
|
2
3
|
import { controllerCheckExecutionIdentity, listControllerChecks, readLatestControllerCheckEvidence } from '../../../cli/controller/check-runner';
|
|
3
4
|
import { repositoryGitStatus } from '../../../cli/repositories/structured-git';
|
|
4
5
|
import type { RepositoryRecord } from '../../../cli/repositories/types';
|
|
@@ -6,20 +7,26 @@ import {
|
|
|
6
7
|
DEFAULT_WORK_CHECK_LEASE_WAIT_MS,
|
|
7
8
|
checkRequiresDurableWorkflow,
|
|
8
9
|
getProcessRecord,
|
|
10
|
+
isManagedProcessActive,
|
|
11
|
+
listProcessRecords,
|
|
9
12
|
processCheckCompletionReceipt,
|
|
10
13
|
readPersistedCheckResultReceipt,
|
|
11
14
|
runPersistedCheckViaProcessRuntime,
|
|
12
15
|
} from '../../execution/process-runtime';
|
|
13
|
-
import {
|
|
16
|
+
import { projectTerminalCheckVerification } from '../../execution/process-runtime/check-result';
|
|
14
17
|
import { buildCheckExecutionSchedule } from '../../execution/process-runtime/check-scheduling';
|
|
15
18
|
import { ingestCheckCompletionGraceProcess } from '../persistence/operational-prior-store';
|
|
16
19
|
import { buildFacadeResult } from '../facade/facade-result';
|
|
17
20
|
import { classifyVerificationOutcome, normalizeCheckIds } from '../facade/check-normalization';
|
|
18
|
-
import {
|
|
21
|
+
import { recordWorkCheckEvidence } from './work-check-evidence';
|
|
19
22
|
import type { FacadeResult, VerificationRecord, WorkContract } from '../facade/types';
|
|
23
|
+
|
|
20
24
|
import { executionIdentityForRepository } from './execution-identity';
|
|
21
25
|
import { commandFingerprint, effectiveVerificationEvidence, verificationInputFingerprint, workspaceValidationFingerprint } from './verification-evidence';
|
|
22
26
|
import { resolveWorkVerificationContext } from './work-verification-context';
|
|
27
|
+
import { listWorkBoundRepositoryProcessEvidence } from './work-process-evidence';
|
|
28
|
+
import { changedPaths as workChangedPaths, changedPathsFromUnbornBase } from './work-revision-diff';
|
|
29
|
+
import { readWorkHandle, workDeliveryBaseRevision } from './work-handle-store';
|
|
23
30
|
|
|
24
31
|
export interface ExecuteWorkVerificationInput {
|
|
25
32
|
controllerHome: string;
|
|
@@ -30,13 +37,13 @@ export interface ExecuteWorkVerificationInput {
|
|
|
30
37
|
timeoutMs?: number;
|
|
31
38
|
interactiveWaitMs?: number;
|
|
32
39
|
leaseWaitMs?: number;
|
|
40
|
+
/** Exact terminal generic Check Processes to reconcile into this Work. */
|
|
41
|
+
reconcileProcessIds?: readonly string[];
|
|
33
42
|
simulate?: {
|
|
34
43
|
infrastructureFailed?: boolean;
|
|
35
44
|
checkFailed?: boolean;
|
|
36
45
|
skipped?: boolean;
|
|
37
46
|
};
|
|
38
|
-
/** Caller-supplied exact ownership proof for durable-class checks. */
|
|
39
|
-
allowDurableCheckExecution?: (input: { work: WorkContract; checkId: string }) => boolean;
|
|
40
47
|
}
|
|
41
48
|
|
|
42
49
|
export interface ExecuteWorkVerificationResult {
|
|
@@ -48,6 +55,94 @@ function result(facade: FacadeResult, isError = false): ExecuteWorkVerificationR
|
|
|
48
55
|
return { facade, isError };
|
|
49
56
|
}
|
|
50
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Derive the exact current implementation paths for the canonical Work
|
|
60
|
+
* verifier. Review admission cannot rely on Work scope evidence alone: a
|
|
61
|
+
* committed candidate in a managed checkout has no dirty-path signal, while
|
|
62
|
+
* a target-only advance must not become part of the Work candidate.
|
|
63
|
+
*/
|
|
64
|
+
function trustedWorkspaceChangedPaths(input: {
|
|
65
|
+
controllerHome: string;
|
|
66
|
+
repository: RepositoryRecord;
|
|
67
|
+
work: WorkContract;
|
|
68
|
+
verificationStatus: ReturnType<typeof repositoryGitStatus>;
|
|
69
|
+
}): string[] {
|
|
70
|
+
const sourceRevision = input.verificationStatus.head;
|
|
71
|
+
const handle = readWorkHandle(input.controllerHome, input.repository.repoId, input.work.workId);
|
|
72
|
+
const deliveryBaseRevision = workDeliveryBaseRevision(handle ?? {}) ?? input.work.baseRevision;
|
|
73
|
+
const committedPaths = deliveryBaseRevision && sourceRevision
|
|
74
|
+
? input.work.repositoryBaseState === 'unborn'
|
|
75
|
+
? changedPathsFromUnbornBase(input.repository.canonicalRoot, sourceRevision)
|
|
76
|
+
: workChangedPaths(input.repository.canonicalRoot, deliveryBaseRevision, sourceRevision)
|
|
77
|
+
: input.work.scopeEvidence?.actualChangedPaths ?? [];
|
|
78
|
+
return [...new Set([
|
|
79
|
+
...committedPaths,
|
|
80
|
+
...input.verificationStatus.staged,
|
|
81
|
+
...input.verificationStatus.unstaged,
|
|
82
|
+
...input.verificationStatus.untracked,
|
|
83
|
+
])].map((path) => path.trim()).filter(Boolean).sort();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function currentReusableVerificationRecord(input: {
|
|
87
|
+
workContract?: WorkContract;
|
|
88
|
+
checkId: string;
|
|
89
|
+
sourceRevision?: string;
|
|
90
|
+
workspaceFingerprint: string;
|
|
91
|
+
requestedChecks: string[];
|
|
92
|
+
}): VerificationRecord | undefined {
|
|
93
|
+
if (!input.workContract || !input.sourceRevision) return undefined;
|
|
94
|
+
return effectiveVerificationEvidence(input.workContract.checkRefs, {
|
|
95
|
+
sourceRevision: input.sourceRevision,
|
|
96
|
+
workspaceFingerprint: input.workspaceFingerprint,
|
|
97
|
+
checkId: input.checkId,
|
|
98
|
+
requestedChecks: input.requestedChecks,
|
|
99
|
+
}).find((entry) =>
|
|
100
|
+
entry.current
|
|
101
|
+
&& (entry.record.outcome === 'valid_pass' || entry.record.outcome === 'valid_fail')
|
|
102
|
+
&& Boolean(entry.record.receipt)
|
|
103
|
+
)?.record;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function reusedVerificationResult(
|
|
107
|
+
record: VerificationRecord,
|
|
108
|
+
input: {
|
|
109
|
+
workContract?: WorkContract;
|
|
110
|
+
sourceRevision?: string;
|
|
111
|
+
workspaceFingerprint: string;
|
|
112
|
+
workspaceChangedPaths?: readonly string[];
|
|
113
|
+
} = { workspaceFingerprint: '' },
|
|
114
|
+
reconciledProcessIds: string[] = [],
|
|
115
|
+
): ExecuteWorkVerificationResult {
|
|
116
|
+
const receipt = record.receipt!;
|
|
117
|
+
const passed = record.outcome === 'valid_pass';
|
|
118
|
+
// Reused verification is durable evidence only. It never derives a Work next step.
|
|
119
|
+
void input.workContract;
|
|
120
|
+
void input.sourceRevision;
|
|
121
|
+
void input.workspaceFingerprint;
|
|
122
|
+
void input.workspaceChangedPaths;
|
|
123
|
+
return result(buildFacadeResult({
|
|
124
|
+
status: passed ? 'ok' : 'failed',
|
|
125
|
+
summary: `Reused exact current verification receipt for ${record.checkId}; no Process was re-executed.`,
|
|
126
|
+
data: {
|
|
127
|
+
verification: {
|
|
128
|
+
checkId: record.checkId,
|
|
129
|
+
outcome: record.outcome,
|
|
130
|
+
isAcceptanceFailure: !passed,
|
|
131
|
+
isInfrastructureIssue: false,
|
|
132
|
+
executed: false,
|
|
133
|
+
completed: true,
|
|
134
|
+
reused: true,
|
|
135
|
+
processId: receipt.processId,
|
|
136
|
+
processStatus: receipt.runtimeStatus,
|
|
137
|
+
ok: passed,
|
|
138
|
+
evidenceReceiptId: receipt.receiptId,
|
|
139
|
+
reconciledProcessIds,
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
rawAvailable: false,
|
|
143
|
+
}), !passed);
|
|
144
|
+
}
|
|
145
|
+
|
|
51
146
|
export interface ContentEquivalentWorkVerificationTransferPlan {
|
|
52
147
|
transferredRecords: VerificationRecord[];
|
|
53
148
|
reusableCheckIds: string[];
|
|
@@ -164,6 +259,204 @@ function boundedCheckSchedulingPayload(schedule: ReturnType<typeof buildCheckExe
|
|
|
164
259
|
* Every member still executes through executeWorkVerification so Work snapshot,
|
|
165
260
|
* Failure Contract, VerificationRecord, and lifecycle semantics stay singular.
|
|
166
261
|
*/
|
|
262
|
+
export interface ReconcileTerminalWorkVerificationsResult {
|
|
263
|
+
repository?: RepositoryRecord;
|
|
264
|
+
verificationStatus?: ReturnType<typeof repositoryGitStatus>;
|
|
265
|
+
sourceRevision?: string;
|
|
266
|
+
workspaceFingerprint?: string;
|
|
267
|
+
reconciledProcessIds: string[];
|
|
268
|
+
workBoundProcessEvidenceIds: string[];
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Reconcile terminal Work-bound verification Processes into canonical Work
|
|
273
|
+
* verification authority. MCP/other adapters may consume the resulting exact
|
|
274
|
+
* repository/content identity, but Process scanning, semantic fingerprint
|
|
275
|
+
* matching, receipt construction, terminal projection, and Work verification
|
|
276
|
+
* mutation remain owned here.
|
|
277
|
+
*/
|
|
278
|
+
export function reconcileTerminalWorkVerifications(input: {
|
|
279
|
+
controllerHome: string;
|
|
280
|
+
repository: RepositoryRecord;
|
|
281
|
+
workId: string;
|
|
282
|
+
/** Explicit Process ids are required for generic run_check evidence. */
|
|
283
|
+
reconcileProcessIds?: readonly string[];
|
|
284
|
+
}): ReconcileTerminalWorkVerificationsResult {
|
|
285
|
+
const resolved = resolveWorkVerificationContext({
|
|
286
|
+
controllerHome: input.controllerHome,
|
|
287
|
+
repository: input.repository,
|
|
288
|
+
workId: input.workId,
|
|
289
|
+
});
|
|
290
|
+
if (!resolved.ok) return { reconciledProcessIds: [], workBoundProcessEvidenceIds: [] };
|
|
291
|
+
const { store, workContract, repository, checks: availableChecks } = resolved.context;
|
|
292
|
+
if (!workContract || workContract.completionReceipt) return { reconciledProcessIds: [], workBoundProcessEvidenceIds: [] };
|
|
293
|
+
|
|
294
|
+
const verificationStatus = repositoryGitStatus(repository);
|
|
295
|
+
const sourceRevision = verificationStatus.head ?? undefined;
|
|
296
|
+
if (!sourceRevision) return { repository, verificationStatus, reconciledProcessIds: [], workBoundProcessEvidenceIds: [] };
|
|
297
|
+
const workspaceFingerprint = workspaceValidationFingerprint(repository.canonicalRoot, verificationStatus);
|
|
298
|
+
const workspaceChangedPaths = trustedWorkspaceChangedPaths({
|
|
299
|
+
controllerHome: input.controllerHome,
|
|
300
|
+
repository,
|
|
301
|
+
work: workContract,
|
|
302
|
+
verificationStatus,
|
|
303
|
+
});
|
|
304
|
+
const workBoundProcessEvidenceIds = (
|
|
305
|
+
workContract.workKind === 'local_effect'
|
|
306
|
+
|| (workContract.workKind === 'repository_change' && workContract.checks.length === 0)
|
|
307
|
+
)
|
|
308
|
+
? listWorkBoundRepositoryProcessEvidence({
|
|
309
|
+
controllerHome: input.controllerHome,
|
|
310
|
+
repoId: input.repository.repoId,
|
|
311
|
+
checkoutId: repository.activeCheckoutId,
|
|
312
|
+
workId: input.workId,
|
|
313
|
+
}).map((evidence) => evidence.processId)
|
|
314
|
+
: [];
|
|
315
|
+
const seenChecks = new Set<string>();
|
|
316
|
+
const reconciledProcessIds: string[] = [];
|
|
317
|
+
const explicitProcessIds = new Set(
|
|
318
|
+
(input.reconcileProcessIds ?? [])
|
|
319
|
+
.map((processId) => processId.trim())
|
|
320
|
+
.filter(Boolean)
|
|
321
|
+
.slice(0, 32),
|
|
322
|
+
);
|
|
323
|
+
const recordsById = new Map(
|
|
324
|
+
listProcessRecords(input.controllerHome, input.repository.repoId, 500).map((record) => [record.processId, record] as const),
|
|
325
|
+
);
|
|
326
|
+
// An explicitly named Process may be older than the bounded recent scan.
|
|
327
|
+
// Fetching that one exact id preserves bounded reads without treating an
|
|
328
|
+
// arbitrary caller-supplied receipt as authority.
|
|
329
|
+
for (const processId of explicitProcessIds) {
|
|
330
|
+
if (!recordsById.has(processId)) {
|
|
331
|
+
const record = getProcessRecord(input.controllerHome, input.repository.repoId, processId);
|
|
332
|
+
if (record) recordsById.set(processId, record);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
const candidates = [...recordsById.values()].filter((record) => {
|
|
336
|
+
const workSnapshot = (
|
|
337
|
+
record.workId === input.workId
|
|
338
|
+
&& record.checkoutId === repository.activeCheckoutId
|
|
339
|
+
&& !isManagedProcessActive(record)
|
|
340
|
+
&& record.origin?.workVerificationSnapshot === true
|
|
341
|
+
&& typeof record.origin?.checkId === 'string'
|
|
342
|
+
&& typeof record.origin?.requestSemanticFingerprint === 'string'
|
|
343
|
+
);
|
|
344
|
+
if (workSnapshot) return true;
|
|
345
|
+
if (!explicitProcessIds.has(record.processId)) return false;
|
|
346
|
+
|
|
347
|
+
// Generic run_check records have no Work owner. They are eligible only
|
|
348
|
+
// when the caller names the exact terminal Process and the record proves
|
|
349
|
+
// the same repository/checkout, canonical checkout root, checkout-scoped
|
|
350
|
+
// Check execution, and check surface. The persisted semantic result is
|
|
351
|
+
// validated below before any Work mutation.
|
|
352
|
+
const executionIdentity = record.executionIdentity;
|
|
353
|
+
return (
|
|
354
|
+
record.repoId === repository.repoId
|
|
355
|
+
&& record.checkoutId === repository.activeCheckoutId
|
|
356
|
+
&& record.workId == null
|
|
357
|
+
&& !isManagedProcessActive(record)
|
|
358
|
+
&& record.origin?.surface === 'check'
|
|
359
|
+
&& typeof record.origin?.checkId === 'string'
|
|
360
|
+
&& executionIdentity?.repositoryId === repository.repoId
|
|
361
|
+
&& executionIdentity.checkoutId === repository.activeCheckoutId
|
|
362
|
+
&& resolve(executionIdentity.canonicalRoot) === resolve(repository.canonicalRoot)
|
|
363
|
+
&& record.checkExecution?.reuseScope === 'checkout'
|
|
364
|
+
&& record.checkExecution.scopeKey === `checkout:${repository.activeCheckoutId}`
|
|
365
|
+
);
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
for (const record of candidates) {
|
|
369
|
+
const checkId = record.origin?.checkId?.trim() ?? '';
|
|
370
|
+
if (!checkId || seenChecks.has(checkId)) continue;
|
|
371
|
+
seenChecks.add(checkId);
|
|
372
|
+
const classified = classifyVerificationOutcome({ checkId, available: availableChecks });
|
|
373
|
+
if (classified.outcome === 'invalid_check_id' || !classified.normalizedCheckId) continue;
|
|
374
|
+
const normalizedCheckId = classified.normalizedCheckId;
|
|
375
|
+
const requestedChecks = workContract.checks.length ? workContract.checks : [normalizedCheckId];
|
|
376
|
+
const currentFingerprint = verificationInputFingerprint({
|
|
377
|
+
sourceRevision,
|
|
378
|
+
workspaceFingerprint,
|
|
379
|
+
checkId: normalizedCheckId,
|
|
380
|
+
requestedChecks,
|
|
381
|
+
});
|
|
382
|
+
const workSnapshot = record.workId === input.workId && record.origin?.workVerificationSnapshot === true;
|
|
383
|
+
if (workSnapshot && (record.origin?.requestSemanticFingerprint !== currentFingerprint || !record.checkExecution)) continue;
|
|
384
|
+
if (!workSnapshot) {
|
|
385
|
+
const recordedExecution = record.checkExecution;
|
|
386
|
+
if (!recordedExecution) continue;
|
|
387
|
+
const currentExecution = controllerCheckExecutionIdentity(repository.canonicalRoot, normalizedCheckId);
|
|
388
|
+
if (
|
|
389
|
+
currentExecution.cacheKey !== recordedExecution.cacheKey
|
|
390
|
+
|| currentExecution.revision !== recordedExecution.revision
|
|
391
|
+
|| currentExecution.definitionDigest !== recordedExecution.definitionDigest
|
|
392
|
+
|| currentExecution.environmentFingerprint !== recordedExecution.environmentFingerprint
|
|
393
|
+
|| currentExecution.timeoutMs !== recordedExecution.timeoutMs
|
|
394
|
+
|| currentExecution.reuseScope !== recordedExecution.reuseScope
|
|
395
|
+
) continue;
|
|
396
|
+
const structuredReceipt = readPersistedCheckResultReceipt(record.origin?.checkResultReceiptPath);
|
|
397
|
+
if (
|
|
398
|
+
!structuredReceipt
|
|
399
|
+
|| structuredReceipt.checkId !== normalizedCheckId
|
|
400
|
+
|| structuredReceipt.cacheKey !== recordedExecution.cacheKey
|
|
401
|
+
|| structuredReceipt.validatedRevision !== recordedExecution.revision
|
|
402
|
+
) continue;
|
|
403
|
+
}
|
|
404
|
+
const checkExecution = record.checkExecution;
|
|
405
|
+
if (!checkExecution) continue;
|
|
406
|
+
|
|
407
|
+
try {
|
|
408
|
+
const receipt = processCheckCompletionReceipt(record, {
|
|
409
|
+
repoId: repository.repoId,
|
|
410
|
+
checkoutId: repository.activeCheckoutId,
|
|
411
|
+
workId: input.workId,
|
|
412
|
+
checkId: normalizedCheckId,
|
|
413
|
+
processId: record.processId,
|
|
414
|
+
requestId: record.origin?.requestId,
|
|
415
|
+
checkExecution: {
|
|
416
|
+
cacheKey: checkExecution.cacheKey,
|
|
417
|
+
revision: checkExecution.revision,
|
|
418
|
+
definitionDigest: checkExecution.definitionDigest,
|
|
419
|
+
environmentFingerprint: checkExecution.environmentFingerprint,
|
|
420
|
+
timeoutMs: checkExecution.timeoutMs,
|
|
421
|
+
scopeKey: checkExecution.scopeKey,
|
|
422
|
+
},
|
|
423
|
+
});
|
|
424
|
+
if (workContract.checkRefs.some((entry) => entry.receipt?.receiptId === receipt.receiptId)) continue;
|
|
425
|
+
|
|
426
|
+
const legacyEvidence = record.origin?.checkResultReceiptPath
|
|
427
|
+
? undefined
|
|
428
|
+
: readLatestControllerCheckEvidence(repository.canonicalRoot, normalizedCheckId);
|
|
429
|
+
const projection = projectTerminalCheckVerification(record, normalizedCheckId, receipt, { legacyEvidence });
|
|
430
|
+
recordWorkCheckEvidence({
|
|
431
|
+
store,
|
|
432
|
+
workId: input.workId,
|
|
433
|
+
checkId: normalizedCheckId,
|
|
434
|
+
availableChecks,
|
|
435
|
+
sourceRevision,
|
|
436
|
+
workspaceFingerprint,
|
|
437
|
+
verificationInputFingerprint: currentFingerprint,
|
|
438
|
+
commandFingerprint: commandFingerprint(normalizedCheckId, receipt.commandId),
|
|
439
|
+
receipt,
|
|
440
|
+
infrastructureFailed: projection.isInfrastructureIssue,
|
|
441
|
+
checkFailed: projection.isAcceptanceFailure,
|
|
442
|
+
});
|
|
443
|
+
reconciledProcessIds.push(record.processId);
|
|
444
|
+
} catch {
|
|
445
|
+
// Exact receipt/process identity is mandatory. Any malformed, stale, or
|
|
446
|
+
// mismatched terminal Process remains non-authoritative and is ignored.
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
return {
|
|
451
|
+
repository,
|
|
452
|
+
verificationStatus,
|
|
453
|
+
sourceRevision,
|
|
454
|
+
workspaceFingerprint,
|
|
455
|
+
reconciledProcessIds,
|
|
456
|
+
workBoundProcessEvidenceIds,
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
|
|
167
460
|
export async function executeWorkVerificationBatch(input: ExecuteWorkVerificationBatchInput): Promise<ExecuteWorkVerificationResult> {
|
|
168
461
|
const workId = input.workId?.trim() ?? '';
|
|
169
462
|
const requestedCheckIds = [...new Set(input.checkIds.map((value) => value.trim()).filter(Boolean))];
|
|
@@ -337,20 +630,14 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
|
|
|
337
630
|
}), true);
|
|
338
631
|
}
|
|
339
632
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
handoffStore: store,
|
|
343
|
-
repoId: input.repository.repoId,
|
|
344
|
-
availableChecks: checks,
|
|
345
|
-
};
|
|
346
|
-
if (workId && (!workContract || workContract.status === 'completed' || workContract.status === 'cancelled' || workContract.status === 'failed')) {
|
|
347
|
-
const facade = verifyGoalWorkloop(workloopCtx, { workId, checkId });
|
|
633
|
+
if (workId && (!workContract || workContract.semanticState !== 'open')) {
|
|
634
|
+
const facade = recordWorkCheckEvidence({ store, workId, checkId, availableChecks: checks });
|
|
348
635
|
return result(facade, facade.status === 'failed');
|
|
349
636
|
}
|
|
350
637
|
|
|
351
638
|
const classified = classifyVerificationOutcome({ checkId, available: checks });
|
|
352
639
|
if (classified.outcome === 'invalid_check_id') {
|
|
353
|
-
if (workId) return result(
|
|
640
|
+
if (workId) return result(recordWorkCheckEvidence({ store, workId, checkId, availableChecks: checks }));
|
|
354
641
|
return result(buildFacadeResult({
|
|
355
642
|
status: 'ok',
|
|
356
643
|
summary: classified.summary,
|
|
@@ -384,9 +671,11 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
|
|
|
384
671
|
},
|
|
385
672
|
}), input.simulate.checkFailed === true);
|
|
386
673
|
}
|
|
387
|
-
const facade =
|
|
674
|
+
const facade = recordWorkCheckEvidence({
|
|
675
|
+
store,
|
|
388
676
|
workId,
|
|
389
677
|
checkId: classified.normalizedCheckId ?? checkId,
|
|
678
|
+
availableChecks: checks,
|
|
390
679
|
infrastructureFailed: input.simulate.infrastructureFailed === true,
|
|
391
680
|
checkFailed: input.simulate.checkFailed === true,
|
|
392
681
|
skipped: input.simulate.skipped === true,
|
|
@@ -399,6 +688,14 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
|
|
|
399
688
|
const verificationStatus = repositoryGitStatus(verificationRepository);
|
|
400
689
|
const observedGitHead = verificationStatus.head;
|
|
401
690
|
const workspaceFingerprint = workspaceValidationFingerprint(verificationRepository.canonicalRoot, verificationStatus);
|
|
691
|
+
const workspaceChangedPaths = workContract
|
|
692
|
+
? trustedWorkspaceChangedPaths({
|
|
693
|
+
controllerHome: input.controllerHome,
|
|
694
|
+
repository: verificationRepository,
|
|
695
|
+
work: workContract,
|
|
696
|
+
verificationStatus,
|
|
697
|
+
})
|
|
698
|
+
: undefined;
|
|
402
699
|
const requestedChecks = workContract?.checks.length ? workContract.checks : [normalizedCheckId];
|
|
403
700
|
const verificationRequestFingerprint = observedGitHead ? verificationInputFingerprint({
|
|
404
701
|
sourceRevision: observedGitHead,
|
|
@@ -406,6 +703,75 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
|
|
|
406
703
|
checkId: normalizedCheckId,
|
|
407
704
|
requestedChecks,
|
|
408
705
|
}) : undefined;
|
|
706
|
+
|
|
707
|
+
const explicitReconciliationRequested = (input.reconcileProcessIds?.length ?? 0) > 0;
|
|
708
|
+
const currentReceipt = currentReusableVerificationRecord({
|
|
709
|
+
workContract: explicitReconciliationRequested ? undefined : workContract,
|
|
710
|
+
checkId: normalizedCheckId,
|
|
711
|
+
sourceRevision: observedGitHead ?? undefined,
|
|
712
|
+
workspaceFingerprint,
|
|
713
|
+
requestedChecks,
|
|
714
|
+
});
|
|
715
|
+
if (currentReceipt) {
|
|
716
|
+
return reusedVerificationResult(currentReceipt, {
|
|
717
|
+
workContract,
|
|
718
|
+
sourceRevision: observedGitHead ?? undefined,
|
|
719
|
+
workspaceFingerprint,
|
|
720
|
+
workspaceChangedPaths,
|
|
721
|
+
});
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
let reconciledProcessIds: string[] = [];
|
|
725
|
+
if (workContract && observedGitHead) {
|
|
726
|
+
const reconciled = reconcileTerminalWorkVerifications({
|
|
727
|
+
controllerHome: input.controllerHome,
|
|
728
|
+
repository: input.repository,
|
|
729
|
+
workId: workContract.workId,
|
|
730
|
+
reconcileProcessIds: input.reconcileProcessIds,
|
|
731
|
+
});
|
|
732
|
+
reconciledProcessIds = reconciled.reconciledProcessIds;
|
|
733
|
+
if (reconciled.reconciledProcessIds.length > 0) {
|
|
734
|
+
const refreshed = resolveWorkVerificationContext({
|
|
735
|
+
controllerHome: input.controllerHome,
|
|
736
|
+
repository: input.repository,
|
|
737
|
+
workId: workContract.workId,
|
|
738
|
+
});
|
|
739
|
+
if (refreshed.ok) {
|
|
740
|
+
const reconciledReceipt = currentReusableVerificationRecord({
|
|
741
|
+
workContract: refreshed.context.workContract,
|
|
742
|
+
checkId: normalizedCheckId,
|
|
743
|
+
sourceRevision: observedGitHead,
|
|
744
|
+
workspaceFingerprint,
|
|
745
|
+
requestedChecks,
|
|
746
|
+
});
|
|
747
|
+
if (reconciledReceipt) {
|
|
748
|
+
return reusedVerificationResult(reconciledReceipt, {
|
|
749
|
+
workContract: refreshed.context.workContract,
|
|
750
|
+
sourceRevision: observedGitHead,
|
|
751
|
+
workspaceFingerprint,
|
|
752
|
+
workspaceChangedPaths,
|
|
753
|
+
}, reconciled.reconciledProcessIds);
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
if (explicitReconciliationRequested) {
|
|
759
|
+
return result(buildFacadeResult({
|
|
760
|
+
status: 'blocked',
|
|
761
|
+
summary: 'No explicitly requested terminal Process could be reconciled into the exact Work verification authority.',
|
|
762
|
+
data: {
|
|
763
|
+
verification: {
|
|
764
|
+
checkId: normalizedCheckId,
|
|
765
|
+
outcome: 'reconciliation_not_authoritative',
|
|
766
|
+
isAcceptanceFailure: false,
|
|
767
|
+
isInfrastructureIssue: true,
|
|
768
|
+
reconciledProcessIds,
|
|
769
|
+
},
|
|
770
|
+
},
|
|
771
|
+
warnings: ['WORK_VERIFY_RECONCILIATION_NOT_AUTHORIZED: Forge did not re-execute the Check after explicit reconciliation failed.'],
|
|
772
|
+
}), true);
|
|
773
|
+
}
|
|
774
|
+
|
|
409
775
|
const registeredCheck = checks.find((entry) => entry.id === normalizedCheckId);
|
|
410
776
|
const durableClassCheck = checkRequiresDurableWorkflow(registeredCheck);
|
|
411
777
|
const allowDurableCheckExecution = Boolean(
|
|
@@ -413,8 +779,7 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
|
|
|
413
779
|
&& workContract
|
|
414
780
|
&& workContract.checks.includes(normalizedCheckId)
|
|
415
781
|
&& !workContract.completionReceipt
|
|
416
|
-
&& workContract.
|
|
417
|
-
&& input.allowDurableCheckExecution?.({ work: workContract, checkId: normalizedCheckId }),
|
|
782
|
+
&& workContract.dispatchState === 'running',
|
|
418
783
|
);
|
|
419
784
|
|
|
420
785
|
const executed = await runPersistedCheckViaProcessRuntime({
|
|
@@ -431,11 +796,8 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
|
|
|
431
796
|
requestSemanticFingerprint: verificationRequestFingerprint,
|
|
432
797
|
workId: workId || undefined,
|
|
433
798
|
commandId: input.requestId,
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
allowedPaths: workContract.allowedPaths,
|
|
437
|
-
forbiddenPaths: workContract.forbiddenPaths,
|
|
438
|
-
} : undefined,
|
|
799
|
+
// A Work has semantic scope and evidence, not a mutable path fence.
|
|
800
|
+
// Candidate snapshot ownership is supplied only by a bound EditSession.
|
|
439
801
|
allowDurableCheckExecution,
|
|
440
802
|
});
|
|
441
803
|
|
|
@@ -453,14 +815,7 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
|
|
|
453
815
|
observedGitHead,
|
|
454
816
|
},
|
|
455
817
|
},
|
|
456
|
-
suggestedNextActions:
|
|
457
|
-
label: 'Continue Work with the durable check requirement',
|
|
458
|
-
tool: 'rh_work',
|
|
459
|
-
operation: 'continue',
|
|
460
|
-
payload: { work_id: workId },
|
|
461
|
-
risk: 'workspace_write',
|
|
462
|
-
confidence: 'high',
|
|
463
|
-
}] : [],
|
|
818
|
+
suggestedNextActions: [],
|
|
464
819
|
}), true);
|
|
465
820
|
}
|
|
466
821
|
|
|
@@ -517,14 +872,10 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
|
|
|
517
872
|
const legacyEvidence = record.origin?.checkResultReceiptPath
|
|
518
873
|
? undefined
|
|
519
874
|
: readLatestControllerCheckEvidence(verificationRepository.canonicalRoot, normalizedCheckId);
|
|
520
|
-
const
|
|
521
|
-
const
|
|
522
|
-
const
|
|
523
|
-
|
|
524
|
-
|| evidenceState.state !== 'matched'
|
|
525
|
-
|| (!receipt.ok && failureClass !== 'acceptance_failure');
|
|
526
|
-
const checkFailed = !receipt.ok && !infrastructureFailed;
|
|
527
|
-
if (receipt.ok && evidenceState.state === 'matched') {
|
|
875
|
+
const projection = projectTerminalCheckVerification(record, normalizedCheckId, receipt, { legacyEvidence });
|
|
876
|
+
const infrastructureFailed = projection.isInfrastructureIssue;
|
|
877
|
+
const checkFailed = projection.isAcceptanceFailure;
|
|
878
|
+
if (projection.outcome === 'valid_pass') {
|
|
528
879
|
try {
|
|
529
880
|
ingestCheckCompletionGraceProcess({
|
|
530
881
|
controllerHome: input.controllerHome,
|
|
@@ -538,17 +889,18 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
|
|
|
538
889
|
}
|
|
539
890
|
const commonVerification = {
|
|
540
891
|
checkId: normalizedCheckId,
|
|
541
|
-
outcome:
|
|
542
|
-
isAcceptanceFailure:
|
|
543
|
-
isInfrastructureIssue:
|
|
892
|
+
outcome: projection.outcome,
|
|
893
|
+
isAcceptanceFailure: projection.isAcceptanceFailure,
|
|
894
|
+
isInfrastructureIssue: projection.isInfrastructureIssue,
|
|
544
895
|
executed: true,
|
|
545
896
|
completed: true,
|
|
546
897
|
processId: receipt.processId,
|
|
547
898
|
processStatus: receipt.runtimeStatus,
|
|
548
|
-
ok:
|
|
899
|
+
ok: projection.outcome === 'valid_pass',
|
|
900
|
+
processOk: receipt.ok,
|
|
549
901
|
timedOut: receipt.timedOut,
|
|
550
902
|
cancelled: receipt.cancelled,
|
|
551
|
-
failureClass:
|
|
903
|
+
failureClass: projection.failureClass,
|
|
552
904
|
deduplicated: handle.deduplicated === true,
|
|
553
905
|
semanticDeduplicated: handle.semanticDeduplicated === true,
|
|
554
906
|
checkContentRevision: receipt.checkRevision,
|
|
@@ -557,19 +909,21 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
|
|
|
557
909
|
evidenceArtifactPath: record.origin?.workVerificationSnapshot ? undefined : receipt.artifactPath,
|
|
558
910
|
evidenceReceiptId: receipt.receiptId,
|
|
559
911
|
checkResultReceiptId: structuredCheckResult?.receiptId,
|
|
560
|
-
...(
|
|
912
|
+
...(projection.evidence.failureEvidence ? { failureEvidence: projection.evidence.failureEvidence } : {}),
|
|
561
913
|
verificationIsolation: record.origin?.workVerificationSnapshot ? 'work_snapshot' : 'shared_checkout',
|
|
562
|
-
boundedStatus:
|
|
563
|
-
evidenceState:
|
|
564
|
-
...(
|
|
914
|
+
boundedStatus: projection.boundedStatus,
|
|
915
|
+
evidenceState: projection.evidence.state,
|
|
916
|
+
...(projection.infrastructureReason ? { infrastructureReason: projection.infrastructureReason } : {}),
|
|
565
917
|
...(record.error?.code ? { processErrorCode: record.error.code } : {}),
|
|
566
918
|
};
|
|
567
919
|
|
|
568
920
|
if (workId) {
|
|
569
921
|
const sourceRevision = observedGitHead ?? undefined;
|
|
570
|
-
const facade =
|
|
922
|
+
const facade = recordWorkCheckEvidence({
|
|
923
|
+
store,
|
|
571
924
|
workId,
|
|
572
925
|
checkId: normalizedCheckId,
|
|
926
|
+
availableChecks: checks,
|
|
573
927
|
sourceRevision,
|
|
574
928
|
workspaceFingerprint,
|
|
575
929
|
verificationInputFingerprint: sourceRevision ? verificationRequestFingerprint : undefined,
|
|
@@ -588,7 +942,7 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
|
|
|
588
942
|
},
|
|
589
943
|
},
|
|
590
944
|
warnings: infrastructureFailed
|
|
591
|
-
? [...facade.warnings,
|
|
945
|
+
? [...facade.warnings, projection.evidence.warning ?? 'infrastructure_failure is distinct from acceptance failure']
|
|
592
946
|
: facade.warnings,
|
|
593
947
|
}, facade.status === 'failed');
|
|
594
948
|
}
|
|
@@ -601,15 +955,17 @@ export async function executeWorkVerification(input: ExecuteWorkVerificationInpu
|
|
|
601
955
|
? `Check ${normalizedCheckId} passed with persisted Process evidence.`
|
|
602
956
|
: `Check ${normalizedCheckId} failed acceptance.`,
|
|
603
957
|
data: { verification: commonVerification },
|
|
604
|
-
warnings: infrastructureFailed ? [
|
|
958
|
+
warnings: infrastructureFailed ? [projection.evidence.warning ?? 'infrastructure_failure is distinct from acceptance failure'] : [],
|
|
605
959
|
rawAvailable: false,
|
|
606
960
|
}), checkFailed);
|
|
607
961
|
} catch (error) {
|
|
608
962
|
const message = error instanceof Error ? error.message : String(error);
|
|
609
963
|
if (workId) {
|
|
610
|
-
const facade =
|
|
964
|
+
const facade = recordWorkCheckEvidence({
|
|
965
|
+
store,
|
|
611
966
|
workId,
|
|
612
967
|
checkId: classified.normalizedCheckId ?? checkId,
|
|
968
|
+
availableChecks: checks,
|
|
613
969
|
infrastructureFailed: true,
|
|
614
970
|
});
|
|
615
971
|
return result({
|
|
@@ -138,7 +138,11 @@ export function cleanupStaleWorkVerificationSnapshots(
|
|
|
138
138
|
return report;
|
|
139
139
|
}
|
|
140
140
|
for (const entry of entries) {
|
|
141
|
-
|
|
141
|
+
// The canonical root is the ownership boundary. Historical producers did
|
|
142
|
+
// not all use the snapshot-* prefix, so name shape must not make stale
|
|
143
|
+
// physical evidence invisible. Dirent.isDirectory() deliberately excludes
|
|
144
|
+
// symlinks before any recursive removal is considered.
|
|
145
|
+
if (!entry.isDirectory()) continue;
|
|
142
146
|
if (report.inspected >= maxEntries) { report.truncated = true; skip('scan_budget_exhausted'); break; }
|
|
143
147
|
report.inspected += 1;
|
|
144
148
|
const path = join(root, entry.name);
|