@moretea-labs/forge 1.8.0 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +73 -7
- package/CHANGELOG.md +34 -0
- package/CLAUDE.md +17 -2
- package/CONTRIBUTING.md +3 -2
- package/README.en.md +24 -3
- package/README.md +10 -6
- package/README.zh-CN.md +5 -3
- package/THIRD_PARTY_NOTICES.md +1 -2
- package/adapters/chatgpt/browser-delivery-host.ts +7 -1
- package/adapters/chatgpt/browser-delivery-runtime.ts +531 -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 +229 -2
- package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
- package/adapters/computer/chatgpt-extension-target.ts +708 -0
- package/adapters/computer/chrome-extension/background.js +541 -0
- package/adapters/computer/chrome-extension/content.js +402 -0
- package/adapters/computer/chrome-extension/core.js +24 -0
- package/adapters/computer/chrome-extension/manifest.json +32 -0
- package/adapters/computer/desktop-operator-discovery.ts +11 -31
- package/adapters/computer/desktop-operator-provider.ts +18 -6
- package/adapters/computer/interaction-target-authority.ts +178 -24
- package/adapters/mcp/access-mode.ts +18 -39
- package/adapters/mcp/auth.ts +2 -7
- package/adapters/mcp/instructions.ts +6 -5
- package/adapters/mcp/multi-repository.ts +10 -47
- package/adapters/mcp/oauth.ts +73 -0
- package/adapters/mcp/paths.ts +4 -1
- 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 +490 -113
- package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -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 +14 -54
- package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
- package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
- 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 +19 -507
- package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
- package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
- package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
- package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
- package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
- 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 +229 -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 +320 -0
- package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
- package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
- package/adapters/mcp/server.ts +91 -26
- package/adapters/mcp/setup.ts +5 -13
- package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
- package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
- package/adapters/mcp/toolset-names.ts +11 -37
- package/adapters/mcp/toolset.ts +19 -92
- package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
- package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
- package/adapters/mcp/transports/http-observation.ts +377 -0
- package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
- package/adapters/mcp/transports/http.ts +200 -683
- 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/adapters/mcp/types.ts +0 -6
- package/assets/hooks/lib/session-state.sh +0 -38
- package/assets/hooks/post-bash.sh +1 -1
- package/assets/hooks/post-tool-observer.sh +0 -5
- package/assets/hooks/prompt-guard.sh +0 -55
- package/assets/partials/04-project-structure.partial.md +1 -1
- package/assets/partials/07-footer.partial.md +1 -1
- package/assets/partials-agents/02-operating-mode.partial.md +1 -1
- package/assets/partials-agents/08-deep-docs.partial.md +1 -1
- package/assets/plugin-registry.v1.json +6 -4
- package/assets/reference-configs/agentic-development-flow.md +26 -1
- package/assets/reference-configs/external-tooling.md +0 -76
- package/assets/reference-configs/global-working-rules.md +19 -0
- package/assets/reference-configs/release-deploy.md +1 -1
- package/assets/templates/helpers/architecture-queue.sh +1 -1
- package/assets/templates/helpers/check-agent-tooling.sh +1 -327
- package/assets/templates/helpers/check-task-workflow.sh +1 -1
- package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
- package/assets/templates/helpers/migrate-project-template.sh +2 -2
- package/assets/workflow-contract.v1.json +0 -2
- package/docs/README.md +5 -2
- package/docs/architecture/CURRENT.md +205 -51
- 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/20260904-ios-device-migration-baseline.md +42 -0
- 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 +234 -0
- package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
- package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
- package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
- package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
- package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
- package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
- package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
- package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
- package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
- package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
- package/docs/architecture/domains/public-surface.md +3 -5
- package/docs/architecture/domains/verification.md +6 -5
- package/docs/architecture/domains/workflow-engine.md +6 -0
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
- package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
- package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
- package/docs/forge-plugin-management.md +16 -4
- package/docs/operations/controller-browser-plugin.md +23 -0
- package/docs/operations/controller-performance-and-502.md +17 -0
- package/docs/operations/controller-reliability-runbook.md +2 -2
- package/docs/operations/features.md +6 -7
- package/docs/operations/features.zh-CN.md +1 -1
- package/docs/operations/github-repository.md +4 -4
- package/docs/operations/github-semantic-release-projection.md +20 -0
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +13 -52
- package/docs/operations/releasing.md +2 -0
- package/docs/operations/runtime-performance-diagnostics.md +8 -0
- package/docs/operations/standalone-disaster-recovery.md +15 -7
- package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
- package/docs/tutorials/03-first-repository-task.md +2 -0
- package/docs/wiki/Computer-and-Plugins.md +78 -0
- package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
- package/docs/wiki/Home.md +16 -2
- package/docs/wiki/Implementation.md +25 -13
- package/docs/wiki/Installation.md +28 -32
- package/docs/wiki/Integrations.md +4 -0
- package/docs/wiki/Quick-Start.md +35 -22
- package/docs/wiki/Releases-and-Upgrades.md +15 -25
- package/docs/wiki/_Sidebar.md +5 -1
- package/package.json +25 -25
- 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 +348 -97
- 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 +87 -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/eligibility.ts +4 -1
- 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 +166 -143
- package/packages/kernel/work/api/index.ts +3 -2
- package/packages/kernel/work/application/work-service.ts +18 -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 +34 -65
- package/packages/kernel/work/domain/types.ts +57 -51
- package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
- package/packages/kernel/work/ports/work-contract-store.ts +5 -2
- package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
- 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 +153 -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/assemble-template.ts +11 -72
- package/scripts/canary-controller-semantic-wait.ts +12 -24
- package/scripts/check-mcp-compatibility.ts +94 -201
- package/scripts/check-package-identity.mjs +0 -5
- package/scripts/check-runtime-architecture.mjs +921 -239
- package/scripts/forge-local-recovery-helper.mjs +93 -15
- package/scripts/init-project.sh +0 -46
- package/scripts/install-ios-hid-toolchain.sh +60 -0
- package/scripts/install-standalone-recovery.ts +1 -1
- package/scripts/lib/project-init-lib.sh +6 -3
- package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
- package/scripts/open-source-audit-allowlist.txt +1 -3
- package/scripts/run-bounded-command.mjs +5 -0
- package/scripts/run-governed-gate.ts +2 -1
- package/scripts/run-mobile-monitor-bridge.ts +0 -1
- package/scripts/smoke-control-plane-failure-domain.ts +94 -0
- package/scripts/smoke-ios-physical-device.ts +38 -10
- package/scripts/smoke-mcp-http-runtime.ts +12 -8
- package/scripts/smoke-mcp-tool-surface.ts +27 -41
- 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 +95 -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/sync-generated-authority.mjs +0 -1
- package/scripts/verify-forge-runtime.sh +2 -1
- package/src/cli/agent-jobs/executor-health.ts +12 -35
- package/src/cli/agent-jobs/integration.ts +20 -51
- package/src/cli/agent-jobs/job-manager.ts +7 -3
- package/src/cli/chatgpt-browser/file-policy.ts +2 -2
- 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/doctor.ts +1 -143
- package/src/cli/commands/global-runtime.ts +3 -196
- package/src/cli/commands/init-hook.ts +6 -23
- package/src/cli/commands/init.ts +3 -252
- package/src/cli/commands/mcp.ts +0 -5
- package/src/cli/commands/prompt-guard-decision.ts +0 -2
- package/src/cli/commands/recovery.ts +137 -135
- package/src/cli/commands/repository.ts +17 -1
- package/src/cli/commands/runtime.ts +3 -3
- package/src/cli/commands/setup-execution.ts +41 -0
- 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 +5 -44
- package/src/cli/controller/completion-target.ts +3 -72
- package/src/cli/controller/composite-operations.ts +1 -1
- package/src/cli/controller/context/instruction-context.ts +1 -1
- package/src/cli/controller/context/known-paths.ts +2 -2
- package/src/cli/controller/context/query-planning.ts +11 -4
- package/src/cli/controller/context/rule-resolution.ts +2 -2
- package/src/cli/controller/context/source-materializer.ts +83 -102
- package/src/cli/controller/context/structural-provider.ts +84 -0
- package/src/cli/controller/context/structural.ts +6 -6
- package/src/cli/controller/context/types.ts +8 -9
- package/src/cli/controller/context-pack.ts +107 -84
- 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 +25 -52
- 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 +42 -10
- package/src/cli/editing/edit-session.ts +18 -12
- package/src/cli/github/github.ts +4 -4
- package/src/cli/github/semantic-projection.ts +174 -0
- package/src/cli/hook/prompt-intents.ts +0 -9
- package/src/cli/index.ts +1 -43
- package/src/cli/local-bridge/connector-freshness.ts +1 -12
- package/src/cli/local-bridge/console-automations.ts +19 -14
- package/src/cli/local-bridge/console-view-models.ts +4 -13
- package/src/cli/local-bridge/facade-api.ts +64 -193
- 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-classifier.ts +0 -9
- package/src/cli/repositories/command-executor.ts +29 -23
- package/src/cli/repositories/command-scope.ts +37 -18
- 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/locks.ts +20 -0
- package/src/cli/repositories/registry.ts +79 -12
- package/src/cli/repositories/safe-patch.ts +2 -12
- package/src/cli/repositories/structured-git.ts +101 -5
- package/src/cli/repository/inspector.ts +185 -343
- package/src/cli/repository/session-cache.ts +92 -6
- package/src/effects/process-runner.ts +17 -1
- 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/generic-lsp-provider.ts +1 -1
- package/src/runtime/context/semantic-navigation-contract.ts +16 -0
- package/src/runtime/context/semantic-navigation.ts +7 -35
- 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 +215 -12
- 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 +616 -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 +197 -110
- package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
- 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 +60 -34
- package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
- package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
- 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 +201 -199
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
- package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
- package/src/runtime/control-plane/facade/capability-registry.ts +364 -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 +9 -9
- package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
- 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 +256 -117
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
- 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/governance/external-effects.ts +1 -1
- package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -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 +295 -107
- 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/evidence/sensitive-output.ts +22 -2
- package/src/runtime/execution/jobs/child-reference.ts +11 -0
- package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
- package/src/runtime/execution/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 +82 -30
- 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 +55 -18
- package/src/runtime/execution/process-runtime/store.ts +30 -2
- package/src/runtime/execution/process-runtime/types.ts +6 -1
- package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
- package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
- package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
- package/src/runtime/execution/workers/executor.ts +3 -8
- package/src/runtime/maintenance/cleanup.ts +41 -5
- 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 +97 -29
- package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
- package/src/runtime/plugins/browser-adapter.ts +1124 -333
- package/src/runtime/plugins/browser-automation-service.ts +23 -3
- package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
- package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
- package/src/runtime/plugins/browser-native-session-service.ts +63 -13
- package/src/runtime/plugins/browser-registration.ts +18 -0
- package/src/runtime/plugins/browser-runtime.ts +40 -36
- 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 +228 -0
- package/src/runtime/plugins/computer-registration.ts +298 -20
- 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/github-adapter.ts +30 -3
- package/src/runtime/plugins/gmail-adapter.ts +189 -3
- package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
- package/src/runtime/plugins/google-shared.ts +24 -12
- package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
- package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
- package/src/runtime/plugins/ios-adapter.ts +46 -41
- package/src/runtime/plugins/ios-agent-device.ts +54 -4
- package/src/runtime/plugins/ios-device-ownership.ts +103 -0
- package/src/runtime/plugins/ios-physical-device.ts +497 -79
- package/src/runtime/plugins/lightweight-action.ts +208 -2
- package/src/runtime/plugins/local-system-adapter.ts +12 -100
- 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 +682 -435
- package/src/runtime/plugins/types.ts +24 -0
- package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
- package/src/runtime/projections/git-status-sampler.ts +2 -19
- package/src/runtime/projections/invalidation.ts +7 -3
- package/src/runtime/projections/materialized-view.ts +80 -36
- package/src/runtime/recovery/actions.ts +4 -4
- package/src/runtime/recovery/capability-action-application.ts +46 -45
- package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
- package/src/runtime/recovery/maintenance-executor.ts +374 -123
- package/src/runtime/recovery/probe.ts +2 -2
- package/src/runtime/recovery/store.ts +29 -11
- package/src/runtime/release/release-coordinator.ts +312 -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 +254 -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 +227 -29
- package/src/runtime/root/package-runtime-release.ts +117 -30
- package/src/runtime/root/package-runtime-service.ts +24 -24
- package/src/runtime/root/release-execution-canary.ts +57 -12
- package/src/runtime/root/release-loader.ts +90 -8
- package/src/runtime/root/release-manifest.ts +80 -40
- package/src/runtime/root/release-materialize.ts +372 -106
- package/src/runtime/root/release-store.ts +395 -36
- package/src/runtime/root/runtime-lane.ts +191 -0
- package/src/runtime/root/runtime.ts +160 -29
- package/src/runtime/root/scheduled-controller-composition.ts +29 -3
- package/src/runtime/root/service-runner.ts +2 -2
- package/src/runtime/root/service.ts +126 -44
- package/src/runtime/root/status.ts +48 -0
- package/src/runtime/root/types.ts +32 -9
- package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
- package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
- package/src/runtime/root/write-fence.ts +50 -2
- package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
- package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
- package/src/runtime/safe-tooling/ios-development.ts +22 -8
- package/src/runtime/safe-tooling/job-summary.ts +1 -1
- package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
- package/src/runtime/shared/atomic-text-file.ts +21 -0
- package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
- package/src/runtime/shared/json-files.ts +8 -3
- 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 +3792 -417
- package/src/runtime/standalone-recovery/entry.ts +507 -45
- 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 +12 -2
- 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 +11 -3
- package/src/runtime/workflow/schedules/engine.ts +166 -178
- package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
- package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
- 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 +218 -0
- package/supervisor/control-plane.ts +963 -0
- package/supervisor/entry.ts +15 -0
- package/supervisor/forge-validators.ts +147 -0
- package/supervisor/index.ts +5 -0
- package/supervisor/native-browser-adapter.ts +1151 -0
- package/supervisor/native-messaging/host.ts +58 -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 +250 -0
- package/supervisor/server.ts +412 -0
- package/supervisor/store.ts +1870 -0
- package/supervisor/tsconfig.json +8 -0
- package/supervisor/types.ts +261 -0
- package/SKILL.md +0 -427
- 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/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
- package/adapters/mcp/toolset-selection.ts +0 -41
- package/agents/openai.yaml +0 -4
- package/assets/skill-hooks.json +0 -41
- package/assets/skill-version.json +0 -189
- package/assets/skills/claude-review/SKILL.md +0 -231
- package/assets/skills/codex-review/SKILL.md +0 -103
- package/assets/templates/helpers/check-skill-version.ts +0 -193
- package/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-skill-version.ts +0 -5
- package/scripts/check-tarball-install-smoke.sh +0 -150
- package/scripts/ensure-codegraph.sh +0 -16
- package/scripts/package-source-archive.sh +0 -147
- package/scripts/public-release-files.txt +0 -39
- package/scripts/public-release.ts +0 -174
- package/scripts/publish-release-tarball.sh +0 -27
- package/scripts/route-nl-vs-ts-eval.ts +0 -679
- package/scripts/run-skill-hook.ts +0 -244
- package/scripts/stage-runtime-release.ts +0 -44
- package/scripts/sync-codex-installed-copies.sh +0 -182
- package/src/cli/commands/tools.ts +0 -167
- 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/cli/mcp/access-mode.ts +0 -2
- package/src/cli/mcp/access-tools.ts +0 -2
- package/src/cli/mcp/audit.ts +0 -2
- package/src/cli/mcp/auth.ts +0 -2
- package/src/cli/mcp/instructions.ts +0 -2
- package/src/cli/mcp/legacy-context.ts +0 -2
- package/src/cli/mcp/legacy-tool-service.ts +0 -2
- package/src/cli/mcp/multi-repository.ts +0 -2
- package/src/cli/mcp/oauth.ts +0 -2
- package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
- package/src/cli/mcp/paths.ts +0 -2
- package/src/cli/mcp/policy.ts +0 -2
- package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
- package/src/cli/mcp/proxy-env.ts +0 -2
- package/src/cli/mcp/readiness-projection.ts +0 -2
- package/src/cli/mcp/redaction.ts +0 -2
- package/src/cli/mcp/repo.ts +0 -2
- package/src/cli/mcp/repository-tools.ts +0 -2
- package/src/cli/mcp/server.ts +0 -2
- package/src/cli/mcp/setup.ts +0 -2
- package/src/cli/mcp/tool-capability-cache.ts +0 -2
- package/src/cli/mcp/tool-contract.ts +0 -2
- package/src/cli/mcp/tools.ts +0 -2
- package/src/cli/mcp/toolset-names.ts +0 -2
- package/src/cli/mcp/toolset-selection.ts +0 -2
- package/src/cli/mcp/toolset.ts +0 -2
- package/src/cli/mcp/transports/http.ts +0 -2
- package/src/cli/mcp/transports/session-registry.ts +0 -2
- package/src/cli/mcp/transports/stdio.ts +0 -2
- package/src/cli/mcp/types.ts +0 -2
- package/src/cli/mcp/umbrella-tools.ts +0 -2
- package/src/cli/tools/codegraph.ts +0 -695
- package/src/core/adoption/helper-wrapper-plan.ts +0 -159
- package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
- package/src/runtime/context/codegraph-read-provider.ts +0 -611
- package/src/runtime/context/codegraph-sidecar.cjs +0 -248
- package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
- package/src/runtime/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
- package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
- package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
- package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
- package/src/runtime/gateway/mcp/process-tools.ts +0 -2
- package/src/runtime/gateway/mcp/router.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
- package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
- package/src/runtime/plugins/browser-provider-registry.ts +0 -2
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
appendWorkEvidence as persistWorkEvidence,
|
|
3
3
|
getWorkContract as readWorkContract,
|
|
4
|
-
recordWorkCompletionReceipt as
|
|
4
|
+
recordWorkCompletionReceipt as persistWorkDeliveryReceipt,
|
|
5
5
|
canonicalizeWorkContractForAuthority,
|
|
6
|
-
rebindPlanBoundWorkContract as buildPlanBoundWorkRebind,
|
|
7
|
-
refreshPlanBoundWorkRevision as buildPlanBoundWorkRevisionRefresh,
|
|
8
|
-
retirePlanBoundWorkContract as buildPlanBoundWorkRetirement,
|
|
9
6
|
} from '../infrastructure/work-contract-store';
|
|
10
7
|
import type { WorkContract } from '../domain/types';
|
|
11
8
|
import type { WorkContractStoreOptions } from '../ports/work-contract-store';
|
|
@@ -20,11 +17,10 @@ export interface CompleteRemoteEffectProcessInput {
|
|
|
20
17
|
}
|
|
21
18
|
|
|
22
19
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* kind checks, evidence append, and terminal lifecycle mutation stay here.
|
|
20
|
+
* Record one trusted repository remote-effect Process receipt as Work evidence.
|
|
21
|
+
* This never changes semantic Work state; the model/user decides completion via complete.
|
|
26
22
|
*/
|
|
27
|
-
export function
|
|
23
|
+
export function recordRemoteEffectWorkProcessReceipt(
|
|
28
24
|
options: WorkContractStoreOptions,
|
|
29
25
|
workId: string,
|
|
30
26
|
input: CompleteRemoteEffectProcessInput,
|
|
@@ -34,7 +30,7 @@ export function completeRemoteEffectWorkFromProcessReceipt(
|
|
|
34
30
|
if (work.workKind !== 'remote_effect') {
|
|
35
31
|
throw new Error(`WORK_REMOTE_EFFECT_PROCESS_KIND_MISMATCH: ${workId} is ${work.workKind}, expected remote_effect`);
|
|
36
32
|
}
|
|
37
|
-
if (work.
|
|
33
|
+
if (work.completionReceipt?.source === 'remote_effect') return work;
|
|
38
34
|
if (!work.evidenceRefs.some((candidate) => candidate.evidenceId === input.processId)) {
|
|
39
35
|
persistWorkEvidence(options, workId, {
|
|
40
36
|
evidenceId: input.processId,
|
|
@@ -43,7 +39,7 @@ export function completeRemoteEffectWorkFromProcessReceipt(
|
|
|
43
39
|
detailLevel: 'summary',
|
|
44
40
|
});
|
|
45
41
|
}
|
|
46
|
-
return
|
|
42
|
+
return persistWorkDeliveryReceipt(
|
|
47
43
|
options,
|
|
48
44
|
workId,
|
|
49
45
|
{
|
|
@@ -77,29 +73,33 @@ export {
|
|
|
77
73
|
emptyWorkContractStore,
|
|
78
74
|
readWorkContractStore,
|
|
79
75
|
writeWorkContractStore,
|
|
76
|
+
createWorkSemanticContext,
|
|
80
77
|
createWorkContract,
|
|
81
78
|
getWorkContractByRequestId,
|
|
82
79
|
acceptSubmittedWorkContract,
|
|
83
80
|
listWorkContracts,
|
|
84
81
|
readActiveWorkCandidates,
|
|
82
|
+
readWorkContractLineageSnapshot,
|
|
85
83
|
initializeWorkCandidateIndex,
|
|
86
84
|
isCurrentWorkContract,
|
|
87
85
|
supersedeWorkContract,
|
|
88
86
|
getWorkContract,
|
|
87
|
+
semanticWorkState,
|
|
88
|
+
workSemanticView,
|
|
89
|
+
listWorkSemanticRevisionRecords,
|
|
90
|
+
reviseWorkSemanticContext,
|
|
89
91
|
summarizeWorkContract,
|
|
90
92
|
updateWorkContract,
|
|
93
|
+
updateWorkContractPlacementAtomically,
|
|
91
94
|
promoteWorkToRepositoryChange,
|
|
92
95
|
recordWorkEvidenceState,
|
|
93
96
|
activateWorkContract,
|
|
94
97
|
failWorkContract,
|
|
95
98
|
cancelWorkContract,
|
|
96
|
-
|
|
99
|
+
recordCancelledWorkCleanupCompleted,
|
|
97
100
|
recordWorkScopeEvidence,
|
|
98
101
|
transitionWorkContractPhase,
|
|
99
|
-
requestWorkImplementationReview,
|
|
100
102
|
recordWorkImplementationReview,
|
|
101
|
-
recordContentEquivalentCommitAuthorityTransfer,
|
|
102
|
-
reconcileApprovedWorkImplementationReviewProjection,
|
|
103
103
|
appendWorkEvidence,
|
|
104
104
|
appendWorkHandoffRef,
|
|
105
105
|
appendVerificationRecord,
|
|
@@ -107,42 +107,18 @@ export {
|
|
|
107
107
|
canonicalizeWorkContractForAuthority,
|
|
108
108
|
} from '../infrastructure/work-contract-store';
|
|
109
109
|
export type {
|
|
110
|
+
CreateWorkSemanticInput,
|
|
110
111
|
CreateWorkContractInput,
|
|
111
112
|
ListWorkContractOptions,
|
|
112
113
|
InvalidActiveWorkCandidate,
|
|
113
114
|
ActiveWorkCandidateSnapshot,
|
|
115
|
+
WorkContractLineageSnapshot,
|
|
114
116
|
SupersedeWorkContractInput,
|
|
115
117
|
WorkContractSummary,
|
|
118
|
+
WorkSemanticRevisionRecord,
|
|
119
|
+
ReviseWorkSemanticInput,
|
|
116
120
|
AcceptSubmittedWorkInput,
|
|
117
121
|
WorkContractStoreLocation,
|
|
118
122
|
WorkContractStoreOptions,
|
|
119
123
|
WorkContractMetadataPatch,
|
|
120
124
|
} from '../infrastructure/work-contract-store';
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Public Work application command for constructing a validated scope-only
|
|
124
|
-
* successor-Plan binding. Persistence remains with the caller so a higher-level
|
|
125
|
-
* control-plane transaction can atomically update Plan + Work authority.
|
|
126
|
-
*/
|
|
127
|
-
export function rebindPlanBoundWorkContract(
|
|
128
|
-
current: WorkContract,
|
|
129
|
-
input: Parameters<typeof buildPlanBoundWorkRebind>[1],
|
|
130
|
-
): WorkContract {
|
|
131
|
-
return buildPlanBoundWorkRebind(current, input);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/** Build a validated terminal authority-retirement transition for a Work whose Plan is no longer current. */
|
|
135
|
-
/** Refresh a Work against a newer revision of the same stable Plan identity. */
|
|
136
|
-
export function refreshPlanBoundWorkRevision(
|
|
137
|
-
current: WorkContract,
|
|
138
|
-
input: Parameters<typeof buildPlanBoundWorkRevisionRefresh>[1],
|
|
139
|
-
): WorkContract {
|
|
140
|
-
return buildPlanBoundWorkRevisionRefresh(current, input);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
export function retirePlanBoundWorkContract(
|
|
144
|
-
current: WorkContract,
|
|
145
|
-
input: Parameters<typeof buildPlanBoundWorkRetirement>[1],
|
|
146
|
-
): WorkContract {
|
|
147
|
-
return buildPlanBoundWorkRetirement(current, input);
|
|
148
|
-
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { ScopeRef } from '../../identity/api/index';
|
|
2
|
+
import { semanticScopeRefForWork, type WorkContract } from './types';
|
|
3
|
+
|
|
4
|
+
export interface CurrentTaskSemanticProjection {
|
|
5
|
+
schemaVersion: 1;
|
|
6
|
+
workId: string;
|
|
7
|
+
objective: string;
|
|
8
|
+
semanticScope: ScopeRef;
|
|
9
|
+
lifecycleRole: 'primary' | 'execution_child';
|
|
10
|
+
requirementId?: string;
|
|
11
|
+
planId?: string;
|
|
12
|
+
planStepId?: string;
|
|
13
|
+
parentWorkId?: string;
|
|
14
|
+
/** Objective graph metadata is projected for clients but never expands exact current-task authority. */
|
|
15
|
+
semanticParentWorkId?: string;
|
|
16
|
+
dependsOnWorkIds: string[];
|
|
17
|
+
predecessorWorkId?: string;
|
|
18
|
+
supersedes: string[];
|
|
19
|
+
supersededBy?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Exact semantic identity for the task currently being executed.
|
|
24
|
+
* Broader Requirement/Plan membership is descriptive lineage metadata only.
|
|
25
|
+
*/
|
|
26
|
+
export function currentTaskSemanticProjectionForWork(work: WorkContract): CurrentTaskSemanticProjection {
|
|
27
|
+
return {
|
|
28
|
+
schemaVersion: 1,
|
|
29
|
+
workId: work.workId,
|
|
30
|
+
objective: work.objective,
|
|
31
|
+
semanticScope: semanticScopeRefForWork(work),
|
|
32
|
+
lifecycleRole: work.lifecycleRole ?? 'primary',
|
|
33
|
+
...(work.requirementId?.trim() ? { requirementId: work.requirementId.trim() } : {}),
|
|
34
|
+
...(work.planId?.trim() ? { planId: work.planId.trim() } : {}),
|
|
35
|
+
...(work.planStepId?.trim() ? { planStepId: work.planStepId.trim() } : {}),
|
|
36
|
+
...(work.parentWorkId?.trim() ? { parentWorkId: work.parentWorkId.trim() } : {}),
|
|
37
|
+
...(work.semanticParentWorkId?.trim() ? { semanticParentWorkId: work.semanticParentWorkId.trim() } : {}),
|
|
38
|
+
dependsOnWorkIds: [...new Set((work.dependsOnWorkIds ?? []).map((id) => id.trim()).filter(Boolean))].sort(),
|
|
39
|
+
...(work.predecessorWorkId?.trim() ? { predecessorWorkId: work.predecessorWorkId.trim() } : {}),
|
|
40
|
+
supersedes: [...new Set((work.supersedes ?? []).map((id) => id.trim()).filter(Boolean))].sort(),
|
|
41
|
+
...(work.supersededBy?.trim() ? { supersededBy: work.supersededBy.trim() } : {}),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Derive only explicit Work lineage. Broad Requirement/Plan membership is
|
|
47
|
+
* deliberately ignored because it is Goal scope, not current-task authority.
|
|
48
|
+
*/
|
|
49
|
+
export function currentTaskLineageWorkIds(
|
|
50
|
+
originWorkIds: readonly string[],
|
|
51
|
+
contracts: readonly WorkContract[],
|
|
52
|
+
): Set<string> {
|
|
53
|
+
const byId = new Map(contracts.map((contract) => [contract.workId, contract] as const));
|
|
54
|
+
const forward = new Set(originWorkIds.map((id) => id.trim()).filter((id) => id && byId.has(id)));
|
|
55
|
+
|
|
56
|
+
// Expand only *forward* from the exact origin(s). A child may include its
|
|
57
|
+
// parent as ancestry later, but that parent must never become a new forward
|
|
58
|
+
// seed that pulls sibling children into the current task.
|
|
59
|
+
let expanded = true;
|
|
60
|
+
while (expanded) {
|
|
61
|
+
expanded = false;
|
|
62
|
+
for (const work of contracts) {
|
|
63
|
+
if (forward.has(work.workId)) {
|
|
64
|
+
const explicitSuccessor = work.supersededBy?.trim();
|
|
65
|
+
if (explicitSuccessor && byId.has(explicitSuccessor) && !forward.has(explicitSuccessor)) {
|
|
66
|
+
forward.add(explicitSuccessor);
|
|
67
|
+
expanded = true;
|
|
68
|
+
}
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const parentWorkId = work.parentWorkId?.trim();
|
|
72
|
+
const predecessorWorkId = work.predecessorWorkId?.trim();
|
|
73
|
+
const supersedes = (work.supersedes ?? []).map((id) => id.trim()).filter(Boolean);
|
|
74
|
+
if (
|
|
75
|
+
(parentWorkId && forward.has(parentWorkId))
|
|
76
|
+
|| (predecessorWorkId && forward.has(predecessorWorkId))
|
|
77
|
+
|| supersedes.some((id) => forward.has(id))
|
|
78
|
+
) {
|
|
79
|
+
forward.add(work.workId);
|
|
80
|
+
expanded = true;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Preserve explicit ancestry for audit/fencing, but never use ancestors as
|
|
86
|
+
// descendant-expansion seeds. That keeps fork siblings independent.
|
|
87
|
+
const linked = new Set(forward);
|
|
88
|
+
const upstream = [...forward];
|
|
89
|
+
while (upstream.length > 0) {
|
|
90
|
+
const work = byId.get(upstream.pop()!);
|
|
91
|
+
if (!work) continue;
|
|
92
|
+
const ancestors = [
|
|
93
|
+
work.parentWorkId,
|
|
94
|
+
work.predecessorWorkId,
|
|
95
|
+
...(work.supersedes ?? []),
|
|
96
|
+
].map((id) => id?.trim()).filter((id): id is string => Boolean(id));
|
|
97
|
+
for (const id of ancestors) {
|
|
98
|
+
if (!byId.has(id) || linked.has(id)) continue;
|
|
99
|
+
linked.add(id);
|
|
100
|
+
upstream.push(id);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return linked;
|
|
104
|
+
}
|
|
@@ -31,8 +31,8 @@ export const ENGINEERING_DECISION_AREAS = [
|
|
|
31
31
|
] as const;
|
|
32
32
|
export type EngineeringDecisionArea = (typeof ENGINEERING_DECISION_AREAS)[number];
|
|
33
33
|
export type EngineeringCritiqueDecision = 'approved' | 'changes_required' | 'blocked';
|
|
34
|
-
export type EngineeringBlockerClassification = 'same_root_cause' | 'unrelated';
|
|
35
|
-
export type EngineeringBlockerAction = 'return_to_design' | 'linked_work';
|
|
34
|
+
export type EngineeringBlockerClassification = 'same_root_cause' | 'same_root_cause_scope_extension' | 'unrelated';
|
|
35
|
+
export type EngineeringBlockerAction = 'return_to_design' | 'extend_candidate' | 'linked_work';
|
|
36
36
|
|
|
37
37
|
const MAX_ITEMS = 64;
|
|
38
38
|
const MAX_TEXT = 2_000;
|
|
@@ -256,15 +256,20 @@ export function buildEngineeringBlockerDispositionReceipt(input: {
|
|
|
256
256
|
rationale: string;
|
|
257
257
|
recordedAt: string;
|
|
258
258
|
}): EngineeringBlockerDispositionReceipt {
|
|
259
|
-
if (!['same_root_cause', 'unrelated'].includes(input.classification)) throw new Error('ENGINEERING_BLOCKER_CLASSIFICATION_INVALID');
|
|
259
|
+
if (!['same_root_cause', 'same_root_cause_scope_extension', 'unrelated'].includes(input.classification)) throw new Error('ENGINEERING_BLOCKER_CLASSIFICATION_INVALID');
|
|
260
260
|
const linkedWorkId = input.linkedWorkId?.trim() || undefined;
|
|
261
|
+
const sameRootCause = input.classification !== 'unrelated';
|
|
261
262
|
if (input.classification === 'unrelated' && !linkedWorkId) throw new Error('ENGINEERING_BLOCKER_LINKED_WORK_REQUIRED');
|
|
262
|
-
if (
|
|
263
|
+
if (sameRootCause && linkedWorkId) throw new Error('ENGINEERING_BLOCKER_LINKED_WORK_FORBIDDEN');
|
|
263
264
|
const core = {
|
|
264
265
|
sourceRevision: text(input.sourceRevision, 'ENGINEERING_BLOCKER_SOURCE_REQUIRED'),
|
|
265
266
|
blockerId: text(input.blockerId, 'ENGINEERING_BLOCKER_ID_REQUIRED'),
|
|
266
267
|
classification: input.classification,
|
|
267
|
-
action: input.classification === 'same_root_cause'
|
|
268
|
+
action: input.classification === 'same_root_cause'
|
|
269
|
+
? 'return_to_design' as const
|
|
270
|
+
: input.classification === 'same_root_cause_scope_extension'
|
|
271
|
+
? 'extend_candidate' as const
|
|
272
|
+
: 'linked_work' as const,
|
|
268
273
|
semanticScopeKeys: list(input.semanticScopeKeys ?? [], 'ENGINEERING_BLOCKER_SCOPE_INVALID', false),
|
|
269
274
|
...(linkedWorkId ? { linkedWorkId: text(linkedWorkId, 'ENGINEERING_BLOCKER_LINKED_WORK_INVALID') } : {}),
|
|
270
275
|
rationale: text(input.rationale, 'ENGINEERING_BLOCKER_RATIONALE_REQUIRED'),
|
|
@@ -73,7 +73,9 @@ const PROFILES: Record<EngineeringRiskClass, EngineeringWorkProfile> = {
|
|
|
73
73
|
schemaVersion: 1,
|
|
74
74
|
profileVersion: ENGINEERING_WORK_PROFILE_VERSION,
|
|
75
75
|
riskClass: 'high',
|
|
76
|
-
|
|
76
|
+
// Engineering evidence is useful model/project guidance, never a Kernel
|
|
77
|
+
// mutation-admission authority. Safety/resource admission lives elsewhere.
|
|
78
|
+
admissionEnforcement: 'observe',
|
|
77
79
|
evidenceRequirements: requirement('required', 'required', 'required', 'required', 'required', 'conditional', 'required', 'conditional', 'required'),
|
|
78
80
|
admissionEvidence: ['project_contract', 'context_closure', 'product_dod', 'design_decision', 'independent_critique'],
|
|
79
81
|
completionEvidence: ['focused_validation', 'fresh_review'],
|
|
@@ -82,7 +84,7 @@ const PROFILES: Record<EngineeringRiskClass, EngineeringWorkProfile> = {
|
|
|
82
84
|
schemaVersion: 1,
|
|
83
85
|
profileVersion: ENGINEERING_WORK_PROFILE_VERSION,
|
|
84
86
|
riskClass: 'critical',
|
|
85
|
-
admissionEnforcement: '
|
|
87
|
+
admissionEnforcement: 'observe',
|
|
86
88
|
evidenceRequirements: requirement('required', 'required', 'required', 'required', 'required', 'required', 'required', 'required', 'required'),
|
|
87
89
|
admissionEvidence: ['project_contract', 'context_closure', 'product_dod', 'design_decision', 'independent_critique', 'semantic_tools'],
|
|
88
90
|
completionEvidence: ['focused_validation', 'real_journey', 'fresh_review'],
|
|
@@ -208,16 +210,10 @@ export function evaluateEngineeringAdmission(input: {
|
|
|
208
210
|
receipt: EngineeringContextReceipt;
|
|
209
211
|
mutation: boolean;
|
|
210
212
|
}): { allowed: true } | { allowed: false; code: string; missing: EngineeringEvidenceKind[] } {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
if (input.receipt.designState === 'revisit_required') {
|
|
216
|
-
return { allowed: false, code: 'ENGINEERING_DESIGN_REVISIT_REQUIRED', missing: ['design_decision', 'independent_critique'] };
|
|
217
|
-
}
|
|
218
|
-
if (input.receipt.missingAdmissionEvidence.length > 0) {
|
|
219
|
-
return { allowed: false, code: 'ENGINEERING_ADMISSION_EVIDENCE_REQUIRED', missing: input.receipt.missingAdmissionEvidence };
|
|
220
|
-
}
|
|
213
|
+
// Forge records these receipts for model judgment, audit, and project-level
|
|
214
|
+
// acceptance. It must not prescribe an engineering methodology before a
|
|
215
|
+
// mutation. Source/CAS/security/resource safety is enforced by capabilities.
|
|
216
|
+
void input;
|
|
221
217
|
return { allowed: true };
|
|
222
218
|
}
|
|
223
219
|
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import type { WorkImplementationReviewEvidenceIdentity } from './implementation-review';
|
|
3
|
+
|
|
4
|
+
export const EVALUATION_PROMOTION_RECEIPT_SCHEMA = 'forge-evaluation-promotion-receipt/v1' as const;
|
|
5
|
+
export const EVALUATION_PROMOTION_RECEIPT_AUTHORITY = 'evaluation_evidence_only' as const;
|
|
6
|
+
export const EVALUATION_CANDIDATE_IDENTITY_SCHEMA = 'forge-candidate-identity/v1' as const;
|
|
7
|
+
|
|
8
|
+
export interface EvaluationPromotionCandidateIdentity {
|
|
9
|
+
schemaVersion: typeof EVALUATION_CANDIDATE_IDENTITY_SCHEMA;
|
|
10
|
+
candidateId: string;
|
|
11
|
+
versionLabel: string;
|
|
12
|
+
artifactDigest: string;
|
|
13
|
+
sourceRevision?: string;
|
|
14
|
+
executionSurface: 'public_cli' | 'public_mcp';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface EvaluationPromotionReceipt {
|
|
18
|
+
schemaVersion: typeof EVALUATION_PROMOTION_RECEIPT_SCHEMA;
|
|
19
|
+
authority: typeof EVALUATION_PROMOTION_RECEIPT_AUTHORITY;
|
|
20
|
+
receiptId: string;
|
|
21
|
+
baseline: EvaluationPromotionCandidateIdentity;
|
|
22
|
+
candidate: EvaluationPromotionCandidateIdentity;
|
|
23
|
+
evidence: {
|
|
24
|
+
paired: {
|
|
25
|
+
protocolDigest: string;
|
|
26
|
+
environmentFingerprint: string;
|
|
27
|
+
pairCount: number;
|
|
28
|
+
evidenceDigest: string;
|
|
29
|
+
};
|
|
30
|
+
shadow: {
|
|
31
|
+
protocolDigest: string;
|
|
32
|
+
pairedScenarioCount: number;
|
|
33
|
+
evidenceDigest: string;
|
|
34
|
+
};
|
|
35
|
+
certification?: {
|
|
36
|
+
manifestDigest: string;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export type EvaluationPromotionReceiptCore = Omit<EvaluationPromotionReceipt, 'receiptId'>;
|
|
42
|
+
|
|
43
|
+
function requiredText(value: unknown, field: string): string {
|
|
44
|
+
const normalized = typeof value === 'string' ? value.trim() : '';
|
|
45
|
+
if (!normalized) throw new Error(`EVALUATION_PROMOTION_RECEIPT_${field.toUpperCase()}_REQUIRED`);
|
|
46
|
+
return normalized;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function nonNegativeInteger(value: unknown, field: string): number {
|
|
50
|
+
if (!Number.isInteger(value) || Number(value) < 0) {
|
|
51
|
+
throw new Error(`EVALUATION_PROMOTION_RECEIPT_${field.toUpperCase()}_INVALID`);
|
|
52
|
+
}
|
|
53
|
+
return Number(value);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function candidateIdentity(value: unknown, field: 'baseline' | 'candidate'): EvaluationPromotionCandidateIdentity {
|
|
57
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
58
|
+
throw new Error(`EVALUATION_PROMOTION_RECEIPT_${field.toUpperCase()}_REQUIRED`);
|
|
59
|
+
}
|
|
60
|
+
const input = value as Record<string, unknown>;
|
|
61
|
+
if (input.schemaVersion !== EVALUATION_CANDIDATE_IDENTITY_SCHEMA) {
|
|
62
|
+
throw new Error(`EVALUATION_PROMOTION_RECEIPT_${field.toUpperCase()}_SCHEMA_INVALID`);
|
|
63
|
+
}
|
|
64
|
+
if (input.executionSurface !== 'public_cli' && input.executionSurface !== 'public_mcp') {
|
|
65
|
+
throw new Error(`EVALUATION_PROMOTION_RECEIPT_${field.toUpperCase()}_SURFACE_INVALID`);
|
|
66
|
+
}
|
|
67
|
+
const sourceRevision = typeof input.sourceRevision === 'string' && input.sourceRevision.trim()
|
|
68
|
+
? input.sourceRevision.trim()
|
|
69
|
+
: undefined;
|
|
70
|
+
return {
|
|
71
|
+
schemaVersion: EVALUATION_CANDIDATE_IDENTITY_SCHEMA,
|
|
72
|
+
candidateId: requiredText(input.candidateId, `${field}_candidate_id`),
|
|
73
|
+
versionLabel: requiredText(input.versionLabel, `${field}_version_label`),
|
|
74
|
+
artifactDigest: requiredText(input.artifactDigest, `${field}_artifact_digest`),
|
|
75
|
+
...(sourceRevision ? { sourceRevision } : {}),
|
|
76
|
+
executionSurface: input.executionSurface,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function receiptCore(value: unknown): EvaluationPromotionReceiptCore {
|
|
81
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
82
|
+
throw new Error('EVALUATION_PROMOTION_RECEIPT_INVALID');
|
|
83
|
+
}
|
|
84
|
+
const input = value as Record<string, unknown>;
|
|
85
|
+
if (input.schemaVersion !== EVALUATION_PROMOTION_RECEIPT_SCHEMA) {
|
|
86
|
+
throw new Error('EVALUATION_PROMOTION_RECEIPT_SCHEMA_INVALID');
|
|
87
|
+
}
|
|
88
|
+
if (input.authority !== EVALUATION_PROMOTION_RECEIPT_AUTHORITY) {
|
|
89
|
+
throw new Error('EVALUATION_PROMOTION_RECEIPT_AUTHORITY_INVALID');
|
|
90
|
+
}
|
|
91
|
+
if (!input.evidence || typeof input.evidence !== 'object' || Array.isArray(input.evidence)) {
|
|
92
|
+
throw new Error('EVALUATION_PROMOTION_RECEIPT_EVIDENCE_REQUIRED');
|
|
93
|
+
}
|
|
94
|
+
const evidence = input.evidence as Record<string, unknown>;
|
|
95
|
+
if (!evidence.paired || typeof evidence.paired !== 'object' || Array.isArray(evidence.paired)) {
|
|
96
|
+
throw new Error('EVALUATION_PROMOTION_RECEIPT_PAIRED_REQUIRED');
|
|
97
|
+
}
|
|
98
|
+
if (!evidence.shadow || typeof evidence.shadow !== 'object' || Array.isArray(evidence.shadow)) {
|
|
99
|
+
throw new Error('EVALUATION_PROMOTION_RECEIPT_SHADOW_REQUIRED');
|
|
100
|
+
}
|
|
101
|
+
const paired = evidence.paired as Record<string, unknown>;
|
|
102
|
+
const shadow = evidence.shadow as Record<string, unknown>;
|
|
103
|
+
let certification: EvaluationPromotionReceipt['evidence']['certification'];
|
|
104
|
+
if (evidence.certification !== undefined) {
|
|
105
|
+
if (!evidence.certification || typeof evidence.certification !== 'object' || Array.isArray(evidence.certification)) {
|
|
106
|
+
throw new Error('EVALUATION_PROMOTION_RECEIPT_CERTIFICATION_INVALID');
|
|
107
|
+
}
|
|
108
|
+
certification = {
|
|
109
|
+
manifestDigest: requiredText(
|
|
110
|
+
(evidence.certification as Record<string, unknown>).manifestDigest,
|
|
111
|
+
'certification_manifest_digest',
|
|
112
|
+
),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
schemaVersion: EVALUATION_PROMOTION_RECEIPT_SCHEMA,
|
|
117
|
+
authority: EVALUATION_PROMOTION_RECEIPT_AUTHORITY,
|
|
118
|
+
baseline: candidateIdentity(input.baseline, 'baseline'),
|
|
119
|
+
candidate: candidateIdentity(input.candidate, 'candidate'),
|
|
120
|
+
evidence: {
|
|
121
|
+
paired: {
|
|
122
|
+
protocolDigest: requiredText(paired.protocolDigest, 'paired_protocol_digest'),
|
|
123
|
+
environmentFingerprint: requiredText(paired.environmentFingerprint, 'paired_environment_fingerprint'),
|
|
124
|
+
pairCount: nonNegativeInteger(paired.pairCount, 'paired_pair_count'),
|
|
125
|
+
evidenceDigest: requiredText(paired.evidenceDigest, 'paired_evidence_digest'),
|
|
126
|
+
},
|
|
127
|
+
shadow: {
|
|
128
|
+
protocolDigest: requiredText(shadow.protocolDigest, 'shadow_protocol_digest'),
|
|
129
|
+
pairedScenarioCount: nonNegativeInteger(shadow.pairedScenarioCount, 'shadow_paired_scenario_count'),
|
|
130
|
+
evidenceDigest: requiredText(shadow.evidenceDigest, 'shadow_evidence_digest'),
|
|
131
|
+
},
|
|
132
|
+
...(certification ? { certification } : {}),
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function receiptIdentity(core: EvaluationPromotionReceiptCore): string {
|
|
138
|
+
const digest = createHash('sha256')
|
|
139
|
+
.update(EVALUATION_PROMOTION_RECEIPT_SCHEMA)
|
|
140
|
+
.update('\0')
|
|
141
|
+
.update(JSON.stringify(core))
|
|
142
|
+
.digest('hex');
|
|
143
|
+
return `evaluation-promotion:sha256:${digest}`;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function deepFreeze<T>(value: T): T {
|
|
147
|
+
if (value && typeof value === 'object' && !Object.isFrozen(value)) {
|
|
148
|
+
for (const nested of Object.values(value as Record<string, unknown>)) deepFreeze(nested);
|
|
149
|
+
Object.freeze(value);
|
|
150
|
+
}
|
|
151
|
+
return value;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Identity constructor only. Eligibility authority remains in evaluation/.
|
|
156
|
+
* Callers outside the evaluator must not treat this helper as proof that A/B,
|
|
157
|
+
* shadow, or certification gates ran.
|
|
158
|
+
*/
|
|
159
|
+
export function buildEvaluationPromotionReceipt(coreInput: EvaluationPromotionReceiptCore): EvaluationPromotionReceipt {
|
|
160
|
+
const core = receiptCore(coreInput);
|
|
161
|
+
return deepFreeze({ ...core, receiptId: receiptIdentity(core) });
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function validateEvaluationPromotionReceipt(value: unknown): EvaluationPromotionReceipt {
|
|
165
|
+
const core = receiptCore(value);
|
|
166
|
+
const receiptId = requiredText((value as Record<string, unknown>).receiptId, 'receipt_id');
|
|
167
|
+
const expected = receiptIdentity(core);
|
|
168
|
+
if (receiptId !== expected) throw new Error('EVALUATION_PROMOTION_RECEIPT_ID_INVALID');
|
|
169
|
+
return deepFreeze({ ...core, receiptId });
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export function evaluationPromotionReceiptArchitectureEvidence(
|
|
173
|
+
value: unknown,
|
|
174
|
+
expectedSourceRevision: string,
|
|
175
|
+
): WorkImplementationReviewEvidenceIdentity {
|
|
176
|
+
const receipt = validateEvaluationPromotionReceipt(value);
|
|
177
|
+
const sourceRevision = receipt.candidate.sourceRevision?.trim() ?? '';
|
|
178
|
+
const expected = expectedSourceRevision.trim();
|
|
179
|
+
if (!expected || !sourceRevision || sourceRevision !== expected) {
|
|
180
|
+
throw new Error(`EVALUATION_PROMOTION_RECEIPT_CANDIDATE_SOURCE_MISMATCH: expected=${expected || 'missing'} actual=${sourceRevision || 'missing'}`);
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
evidenceId: receipt.receiptId,
|
|
184
|
+
digest: receipt.receiptId.slice('evaluation-promotion:'.length),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
@@ -3,7 +3,6 @@ import type { WorkContract } from './types';
|
|
|
3
3
|
|
|
4
4
|
export type WorkExecutionLane = 'read' | 'review' | 'isolated_write' | 'integration_write' | 'external_effect';
|
|
5
5
|
export type WorkExecutionIsolation = 'shared' | 'isolated';
|
|
6
|
-
export type WorkExecutionControllerRole = 'mutable_owner' | 'reviewer';
|
|
7
6
|
export type WorkExecutionResourceMode = 'read' | 'write' | 'exclusive';
|
|
8
7
|
|
|
9
8
|
export interface WorkExecutionResourceIntent {
|
|
@@ -14,13 +13,11 @@ export interface WorkExecutionResourceIntent {
|
|
|
14
13
|
export type WorkExecutionWakeTrigger =
|
|
15
14
|
| { kind: 'work_terminal'; workId: string }
|
|
16
15
|
| { kind: 'resource_release'; resourceKeys: string[] }
|
|
17
|
-
| { kind: 'controller_release'; workId: string }
|
|
18
16
|
| { kind: 'scheduler_capacity'; capacityKey: string }
|
|
19
17
|
| { kind: 'work_contract_change'; workId: string };
|
|
20
18
|
|
|
21
19
|
export interface WorkExecutionConcurrencyBlocker {
|
|
22
20
|
code:
|
|
23
|
-
| 'reviewer_mutation_forbidden'
|
|
24
21
|
| 'same_semantic_scope_mutation'
|
|
25
22
|
| 'shared_mutation_lane_conflict'
|
|
26
23
|
| 'integration_target_conflict'
|
|
@@ -44,7 +41,6 @@ export interface WorkExecutionConcurrencyContract {
|
|
|
44
41
|
resourceIntents: WorkExecutionResourceIntent[];
|
|
45
42
|
blockers: WorkExecutionConcurrencyBlocker[];
|
|
46
43
|
isolation: WorkExecutionIsolation;
|
|
47
|
-
controllerRole: WorkExecutionControllerRole;
|
|
48
44
|
}
|
|
49
45
|
|
|
50
46
|
export interface WorkExecutionConcurrencyInput {
|
|
@@ -81,7 +77,7 @@ function fallbackMutationClass(work: WorkContract): EngineeringMutationClass {
|
|
|
81
77
|
|| work.workKind === 'reconciliation'
|
|
82
78
|
|| work.workKind === 'superseded') return 'readonly';
|
|
83
79
|
if (work.workKind === 'local_effect' || work.workKind === 'remote_effect') return 'external_effect';
|
|
84
|
-
if (work.worktreePolicy.required || work.constraints.workspaceMode === 'isolated'
|
|
80
|
+
if (work.worktreePolicy.required || work.constraints.workspaceMode === 'isolated') {
|
|
85
81
|
return 'isolated_write';
|
|
86
82
|
}
|
|
87
83
|
return 'integration_write';
|
|
@@ -94,7 +90,20 @@ function semanticScopeKeys(work: WorkContract): string[] {
|
|
|
94
90
|
return [`work:${work.workId}`];
|
|
95
91
|
}
|
|
96
92
|
|
|
97
|
-
function defaultLane(
|
|
93
|
+
function defaultLane(
|
|
94
|
+
work: WorkContract,
|
|
95
|
+
mutationClass: EngineeringMutationClass,
|
|
96
|
+
resourceIntents: readonly WorkExecutionResourceIntent[],
|
|
97
|
+
requestedLane?: WorkExecutionLane,
|
|
98
|
+
): WorkExecutionLane {
|
|
99
|
+
const hasMutableResourceIntent = resourceIntents.some((intent) => intent.mode !== 'read');
|
|
100
|
+
if (hasMutableResourceIntent && (!requestedLane || !workExecutionLaneMutates(requestedLane))) {
|
|
101
|
+
if (mutationClass === 'external_effect') return 'external_effect';
|
|
102
|
+
return work.worktreePolicy.required || work.constraints.workspaceMode === 'isolated'
|
|
103
|
+
? 'isolated_write'
|
|
104
|
+
: 'integration_write';
|
|
105
|
+
}
|
|
106
|
+
if (requestedLane) return requestedLane;
|
|
98
107
|
if (work.workKind === 'read_only_review') return 'review';
|
|
99
108
|
if (mutationClass === 'readonly') return 'read';
|
|
100
109
|
return mutationClass;
|
|
@@ -105,6 +114,7 @@ export function buildWorkExecutionConcurrencyContract(
|
|
|
105
114
|
input: WorkExecutionConcurrencyInput = {},
|
|
106
115
|
): WorkExecutionConcurrencyContract {
|
|
107
116
|
const mutationClass = work.engineeringContext?.semanticScope?.mutationClass ?? fallbackMutationClass(work);
|
|
117
|
+
const resourceIntents = normalizedResourceIntents(input.resourceIntents ?? []);
|
|
108
118
|
return {
|
|
109
119
|
schemaVersion: 1,
|
|
110
120
|
workId: work.workId,
|
|
@@ -112,13 +122,12 @@ export function buildWorkExecutionConcurrencyContract(
|
|
|
112
122
|
observedWorkUpdatedAt: work.updatedAt,
|
|
113
123
|
semanticScopeKeys: semanticScopeKeys(work),
|
|
114
124
|
mutationClass,
|
|
115
|
-
lane:
|
|
116
|
-
resourceIntents
|
|
125
|
+
lane: defaultLane(work, mutationClass, resourceIntents, input.lane),
|
|
126
|
+
resourceIntents,
|
|
117
127
|
blockers: [...(input.blockers ?? [])],
|
|
118
|
-
isolation: work.worktreePolicy.required || work.constraints.workspaceMode === 'isolated'
|
|
128
|
+
isolation: work.worktreePolicy.required || work.constraints.workspaceMode === 'isolated'
|
|
119
129
|
? 'isolated'
|
|
120
130
|
: 'shared',
|
|
121
|
-
controllerRole: work.workKind === 'read_only_review' ? 'reviewer' : 'mutable_owner',
|
|
122
131
|
};
|
|
123
132
|
}
|
|
124
133
|
|
|
@@ -145,25 +154,11 @@ function sharedMutableResourceKeys(
|
|
|
145
154
|
return mutableResourceKeys(left).filter((key) => rightKeys.has(key));
|
|
146
155
|
}
|
|
147
156
|
|
|
148
|
-
function invalidReviewerBlocker(contract: WorkExecutionConcurrencyContract): WorkExecutionConcurrencyBlocker | undefined {
|
|
149
|
-
if (contract.controllerRole !== 'reviewer'
|
|
150
|
-
|| (!workExecutionLaneMutates(contract.lane) && mutableResourceKeys(contract).length === 0)) return undefined;
|
|
151
|
-
return {
|
|
152
|
-
code: 'reviewer_mutation_forbidden',
|
|
153
|
-
disposition: 'invalid',
|
|
154
|
-
semanticScopeKeys: contract.semanticScopeKeys,
|
|
155
|
-
resourceKeys: mutableResourceKeys(contract),
|
|
156
|
-
wakeTrigger: { kind: 'work_contract_change', workId: contract.workId },
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
|
|
160
157
|
export function evaluateWorkExecutionCompatibility(
|
|
161
158
|
candidate: WorkExecutionConcurrencyContract,
|
|
162
159
|
active: readonly WorkExecutionConcurrencyContract[],
|
|
163
160
|
): WorkExecutionCompatibilityDecision {
|
|
164
161
|
const blockers: WorkExecutionConcurrencyBlocker[] = [];
|
|
165
|
-
const reviewerBlocker = invalidReviewerBlocker(candidate);
|
|
166
|
-
if (reviewerBlocker) blockers.push(reviewerBlocker);
|
|
167
162
|
if (candidate.lane === 'external_effect' && mutableResourceKeys(candidate).length === 0) {
|
|
168
163
|
blockers.push({
|
|
169
164
|
code: 'external_effect_target_unknown',
|
|
@@ -178,8 +173,6 @@ export function evaluateWorkExecutionCompatibility(
|
|
|
178
173
|
|
|
179
174
|
for (const current of active) {
|
|
180
175
|
if (current.workId === candidate.workId) continue;
|
|
181
|
-
const currentReviewerBlocker = invalidReviewerBlocker(current);
|
|
182
|
-
if (currentReviewerBlocker) continue;
|
|
183
176
|
if (!workExecutionLaneMutates(current.lane)) continue;
|
|
184
177
|
|
|
185
178
|
const overlap = scopesOverlap(candidate, current);
|
|
@@ -1,33 +1,2 @@
|
|
|
1
1
|
/** Immutable access-policy value captured by a Work contract. */
|
|
2
2
|
export type WorkAccessMode = 'request' | 'full_access';
|
|
3
|
-
|
|
4
|
-
export type WorkRouteExecutionMode = 'direct_control' | 'goal_workloop' | 'handoff_only';
|
|
5
|
-
export type WorkRouteMode = 'direct_edit' | 'bounded_work' | 'quick_agent' | 'issue_task';
|
|
6
|
-
export type WorkRouteExecutionPath = 'fast' | 'durable';
|
|
7
|
-
export type WorkRouteExecutorKind = 'direct_edit' | 'local_cli' | 'remote_api' | 'cloud_agent' | 'external_controller' | 'handoff_only';
|
|
8
|
-
export type WorkRouteApprovalState = 'approval_not_required' | 'normal_authorization_required' | 'strong_confirmation_required' | 'blocked_by_policy';
|
|
9
|
-
|
|
10
|
-
export interface WorkRouteReason {
|
|
11
|
-
code: string;
|
|
12
|
-
message: string;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/** Persistence-safe snapshot of a routing decision. The routing engine remains outside Kernel. */
|
|
16
|
-
export interface WorkRouteDecisionSnapshot {
|
|
17
|
-
executionMode: WorkRouteExecutionMode;
|
|
18
|
-
executorKind: WorkRouteExecutorKind;
|
|
19
|
-
selectedProviderId: string | null;
|
|
20
|
-
workMode: WorkRouteMode;
|
|
21
|
-
executionPath: WorkRouteExecutionPath;
|
|
22
|
-
requiresWork: boolean;
|
|
23
|
-
requiresApproval: boolean;
|
|
24
|
-
requiresIsolation: boolean;
|
|
25
|
-
requiresRecovery: boolean;
|
|
26
|
-
createHandoff: boolean;
|
|
27
|
-
waitForUser: boolean;
|
|
28
|
-
approvalState: WorkRouteApprovalState;
|
|
29
|
-
alternatives: string[];
|
|
30
|
-
reasons: WorkRouteReason[];
|
|
31
|
-
inputFingerprint: string;
|
|
32
|
-
policyVersion: string;
|
|
33
|
-
}
|