@moretea-labs/forge 1.6.0 → 1.7.0
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 +2 -0
- package/CHANGELOG.md +26 -0
- package/CLAUDE.md +2 -0
- package/README.md +2 -2
- package/README.zh-CN.md +1 -1
- package/SKILL.md +2 -2
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/agents/openai.yaml +1 -1
- package/assets/hooks/hook-input.sh +11 -8
- package/assets/hooks/lib/session-state.sh +10 -7
- package/assets/hooks/lib/workflow-state.sh +13 -177
- package/assets/hooks/post-tool-observer.sh +8 -2
- package/assets/hooks/prompt-guard.sh +5 -81
- package/assets/hooks/session-start-context.sh +56 -1
- package/assets/partials/05-workflow.partial.md +1 -1
- package/assets/partials-agents/03-orchestration.partial.md +1 -1
- package/assets/plugin-registry.v1.json +1 -1
- package/assets/reference-configs/document-generation.md +1 -1
- package/assets/reference-configs/harness-overview.md +1 -1
- package/assets/reference-configs/sprint-contracts.md +3 -3
- package/assets/skill-version.json +2 -2
- package/assets/templates/contract.template.md +2 -7
- package/assets/templates/helpers/capture-plan.sh +2 -2
- package/assets/templates/helpers/check-task-workflow.sh +4 -4
- package/assets/templates/helpers/contract-worktree.sh +1 -21
- package/assets/templates/helpers/ensure-task-workflow.sh +11 -36
- package/assets/templates/helpers/migrate-project-template.sh +22 -45
- package/assets/templates/helpers/new-plan.sh +1 -1
- package/assets/templates/helpers/plan-to-todo.sh +12 -37
- package/assets/templates/helpers/ship-worktrees.sh +2 -29
- package/assets/templates/helpers/verify-contract.sh +1 -111
- package/assets/templates/helpers/verify-sprint.sh +3 -180
- package/assets/templates/plan.template.md +1 -1
- package/assets/templates/review.template.md +9 -34
- package/assets/workflow-contract.v1.json +10 -19
- package/docs/README.md +10 -10
- package/docs/architecture/CURRENT.md +170 -0
- package/docs/architecture/EVOLUTION.md +42 -0
- package/docs/architecture/current/README.md +4 -156
- package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
- package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
- package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
- package/docs/architecture/history/README.md +7 -0
- package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
- package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
- package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
- package/docs/architecture/history.md +3 -34
- package/docs/architecture/index.md +15 -98
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
- package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
- package/docs/architecture/versions/1.6.md +38 -0
- package/docs/architecture/versions/1.7.md +41 -0
- package/docs/forge-chatgpt-browser-engine.md +2 -2
- package/docs/forge-chatgpt-mcp-setup.md +4 -28
- package/docs/forge-chatgpt-supervised-automation.md +3 -3
- package/docs/forge-github-issue-launcher.md +1 -1
- package/docs/forge-runtime-self-healing-loop.md +1 -1
- package/docs/operations/controller-browser-plugin.md +26 -6
- package/docs/operations/controller-performance-and-502.md +124 -0
- package/docs/operations/controller-reliability-runbook.md +1 -1
- package/docs/operations/features.md +2 -2
- package/docs/operations/github-repository.md +1 -1
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +5 -3
- package/docs/wiki/Architecture.md +6 -6
- package/docs/wiki/Implementation.md +2 -2
- package/docs/wiki/Integrations.md +2 -2
- package/docs/wiki/Work-Lifecycle.md +1 -1
- package/package.json +29 -10
- package/scripts/activate-source-baseline.ts +17 -13
- package/scripts/benchmark-background-check-overlap.ts +228 -0
- package/scripts/benchmark-mcp-host.sh +117 -0
- package/scripts/benchmark-mcp-transport.ts +170 -0
- package/scripts/benchmark-quality-harness.ts +146 -0
- package/scripts/benchmark-route-session-concurrency.ts +207 -6
- package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
- package/scripts/benchmark-typescript-navigation.ts +186 -0
- package/scripts/benchmark-work-efficiency.ts +334 -0
- package/scripts/capture-plan.sh +3 -3
- package/scripts/check-agent-tooling.sh +8 -35
- package/scripts/check-architecture-sync.sh +17 -86
- package/scripts/check-mcp-compatibility.ts +14 -0
- package/scripts/check-runtime-architecture.mjs +107 -64
- package/scripts/check-stable-baseline.ts +92 -0
- package/scripts/check-task-workflow.sh +4 -4
- package/scripts/contract-worktree.sh +1 -21
- package/scripts/ensure-task-workflow.sh +22 -55
- package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
- package/scripts/install-standalone-recovery.ts +24 -0
- package/scripts/lib/project-init-lib.sh +15 -44
- package/scripts/migrate-project-template.sh +23 -1179
- package/scripts/new-plan.sh +1 -1
- package/scripts/plan-to-todo.sh +11 -36
- package/scripts/run-governed-gate.ts +2 -1
- package/scripts/ship-worktrees.sh +2 -29
- package/scripts/smoke-ios-physical-device.ts +4 -2
- package/scripts/smoke-runtime-recovery.ts +1 -35
- package/scripts/smoke-schedule-engine.ts +1 -20
- package/scripts/verify-contract.sh +1 -111
- package/scripts/verify-forge-runtime.sh +0 -1
- package/scripts/verify-sprint.sh +3 -180
- package/scripts/workflow-contract.ts +1 -5
- package/src/cli/commands/init-hook.ts +3 -3
- package/src/cli/commands/mcp.ts +9 -5
- package/src/cli/commands/plugin.ts +1 -1
- package/src/cli/commands/recovery.ts +25 -3
- package/src/cli/commands/runtime.ts +55 -3
- package/src/cli/commands/security.ts +12 -1
- package/src/cli/commands/setup-profile.ts +31 -21
- package/src/cli/controller/check-runner.ts +106 -3
- package/src/cli/controller/composite-result.ts +1 -1
- package/src/cli/controller/context/focus.ts +51 -0
- package/src/cli/controller/context/instruction-context.ts +114 -0
- package/src/cli/controller/context/known-paths.ts +76 -0
- package/src/cli/controller/context/query-planning.ts +110 -0
- package/src/cli/controller/context/rule-resolution.ts +532 -0
- package/src/cli/controller/context/source-materializer.ts +278 -0
- package/src/cli/controller/context/structural.ts +16 -0
- package/src/cli/controller/context/types.ts +286 -0
- package/src/cli/controller/context-pack.ts +785 -469
- package/src/cli/controller/launch-agents.ts +77 -2
- package/src/cli/controller/operational-plan.ts +2 -2
- package/src/cli/controller/work-mode.ts +6 -4
- package/src/cli/editing/edit-session.ts +60 -7
- package/src/cli/github/github.ts +133 -0
- package/src/cli/installer/managed-entries.ts +15 -1
- package/src/cli/local-bridge/console-automations.ts +54 -78
- package/src/cli/local-bridge/console-view-models.ts +1 -35
- package/src/cli/local-bridge/facade-api.ts +0 -217
- package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
- package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +23 -13
- package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
- package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +6 -4
- package/src/cli/local-bridge/frontend/src/lib/api.ts +1 -6
- package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
- package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +2 -2
- package/src/cli/local-bridge/frontend/src/styles.css +1 -1
- package/src/cli/local-bridge/frontend/src/types.ts +5 -8
- package/src/cli/local-bridge/job-store.ts +1 -490
- package/src/cli/local-bridge/server.ts +0 -513
- package/src/cli/local-bridge/ui-dist/app.css +1 -1
- package/src/cli/local-bridge/ui-dist/app.js +3703 -3757
- package/src/cli/mcp/auth.ts +5 -5
- package/src/cli/mcp/instructions.ts +3 -2
- package/src/cli/mcp/legacy-tool-service.ts +0 -189
- package/src/cli/mcp/multi-repository.ts +16 -5
- package/src/cli/mcp/oauth.ts +175 -26
- package/src/cli/mcp/repository-tools.ts +247 -107
- package/src/cli/mcp/server.ts +537 -111
- package/src/cli/mcp/tool-capability-cache.ts +1 -1
- package/src/cli/mcp/toolset-selection.ts +1 -1
- package/src/cli/mcp/toolset.ts +42 -5
- package/src/cli/mcp/transports/http.ts +101 -14
- package/src/cli/mcp/transports/session-registry.ts +43 -5
- package/src/cli/mcp/types.ts +3 -3
- package/src/cli/repositories/command-classifier.ts +101 -19
- package/src/cli/repositories/command-executor.ts +55 -521
- package/src/cli/repositories/command-process.ts +108 -0
- package/src/cli/repositories/command-scope.ts +99 -41
- package/src/cli/repositories/controller-home.ts +7 -8
- package/src/cli/repositories/git-command-executor.ts +2 -0
- package/src/cli/repositories/locks.ts +53 -16
- package/src/cli/repositories/repository-snapshot.ts +121 -0
- package/src/cli/repositories/selected-path-actions.ts +17 -9
- package/src/cli/repositories/structured-git.ts +61 -3
- package/src/cli/repository/inspector.ts +553 -63
- package/src/cli/repository/session-cache.ts +58 -17
- package/src/cli/v81-entry.ts +1 -4
- package/src/effects/fs-transaction.ts +85 -17
- package/src/runtime/context/codegraph-read-provider.ts +233 -2
- package/src/runtime/context/codegraph-sidecar.cjs +74 -40
- package/src/runtime/context/generic-lsp-provider.ts +355 -0
- package/src/runtime/context/lsp-client.ts +283 -0
- package/src/runtime/context/semantic-navigation.ts +275 -0
- package/src/runtime/context/swift-navigation.ts +565 -0
- package/src/runtime/context/typescript-navigation.ts +226 -0
- package/src/runtime/control-plane/dispatch-priority.ts +28 -0
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +47 -8
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
- package/src/runtime/control-plane/execution/session-store.ts +18 -0
- package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
- package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
- package/src/runtime/control-plane/execution/work-task-receipt.ts +54 -11
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +143 -8
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +22 -14
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +85 -8
- package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
- package/src/runtime/control-plane/facade/controller-round-relay.ts +991 -0
- package/src/runtime/control-plane/facade/controller-session-store.ts +132 -1
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +2 -0
- package/src/runtime/control-plane/facade/goal-workloop.ts +686 -129
- package/src/runtime/control-plane/facade/index.ts +1 -0
- package/src/runtime/control-plane/facade/plan-contract-store.ts +185 -20
- package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
- package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
- package/src/runtime/control-plane/facade/types.ts +22 -5
- package/src/runtime/control-plane/facade/work-contract-store.ts +175 -73
- package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
- package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
- package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +145 -0
- package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +273 -542
- package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
- package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
- package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
- package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
- package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
- package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
- package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
- package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
- package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
- package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
- package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +50 -0
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +355 -116
- package/src/runtime/control-plane/launcher/launch-reservation-store.ts +40 -0
- package/src/runtime/control-plane/launcher/thin-launcher.ts +194 -10
- package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
- package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
- package/src/runtime/control-plane/release-retention.ts +62 -2
- package/src/runtime/control-plane/routing/route-policy.ts +7 -16
- package/src/runtime/control-plane/runtime-status-client.ts +0 -2
- package/src/runtime/diagnostics/mcp-timing.ts +13 -0
- package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
- package/src/runtime/diagnostics/performance.ts +24 -1
- package/src/runtime/evidence/event-ledger.ts +1 -1
- package/src/runtime/execution/jobs/store.ts +58 -4
- package/src/runtime/execution/jobs/types.ts +1 -1
- package/src/runtime/execution/managed-workspace.ts +203 -1
- package/src/runtime/execution/process-runtime/check-facade.ts +51 -4
- package/src/runtime/execution/process-runtime/check-result.ts +53 -0
- package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
- package/src/runtime/execution/process-runtime/command-facade.ts +345 -40
- package/src/runtime/execution/process-runtime/gc.ts +38 -6
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +1184 -0
- package/src/runtime/execution/process-runtime/persisted-check.ts +47 -4
- package/src/runtime/execution/process-runtime/resource-claims.ts +10 -6
- package/src/runtime/execution/process-runtime/runtime.ts +43 -3
- package/src/runtime/execution/process-runtime/store.ts +1 -0
- package/src/runtime/execution/process-runtime/types.ts +2 -0
- package/src/runtime/execution/thin-harness/async-process.ts +12 -2
- package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
- package/src/runtime/execution/workers/executor.ts +0 -48
- package/src/runtime/gateway/mcp/execution-tools.ts +1192 -114
- package/src/runtime/gateway/mcp/process-tools.ts +83 -37
- package/src/runtime/gateway/mcp/router.ts +184 -82
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +546 -0
- package/src/runtime/gateway/mcp/runtime-tools.ts +2224 -1589
- package/src/runtime/plugins/app-store-connect-adapter.ts +123 -19
- package/src/runtime/plugins/browser-adapter.ts +2901 -241
- package/src/runtime/plugins/browser-automation-service.ts +10 -0
- package/src/runtime/plugins/browser-handoff.ts +92 -2
- package/src/runtime/plugins/browser-macos-bridge.ts +582 -49
- package/src/runtime/plugins/browser-node-bridge.ts +6 -34
- package/src/runtime/plugins/browser-provider-registry.ts +109 -0
- package/src/runtime/plugins/browser-runtime-contract.ts +152 -0
- package/src/runtime/plugins/browser-runtime.ts +183 -0
- package/src/runtime/plugins/browser-session-authority.ts +332 -0
- package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
- package/src/runtime/plugins/desktop-operator-registration.ts +8 -2
- package/src/runtime/plugins/external-adapter.ts +324 -3
- package/src/runtime/plugins/external-unix-socket.ts +7 -1
- package/src/runtime/plugins/first-party-registry.ts +2 -0
- package/src/runtime/plugins/github-adapter.ts +125 -0
- package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
- package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
- package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
- package/src/runtime/plugins/ios-adapter.ts +106 -16
- package/src/runtime/plugins/ios-agent-device.ts +234 -64
- package/src/runtime/plugins/ios-physical-device.ts +1143 -392
- package/src/runtime/plugins/lightweight-action.ts +153 -0
- package/src/runtime/plugins/local-system-adapter.ts +123 -6
- package/src/runtime/plugins/macos-capability-broker.ts +55 -9
- package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
- package/src/runtime/plugins/plugin-management-adapter.ts +49 -8
- package/src/runtime/plugins/resend-adapter.ts +1 -1
- package/src/runtime/plugins/store.ts +269 -29
- package/src/runtime/plugins/types.ts +35 -2
- package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
- package/src/runtime/projections/git-status-sampler.ts +16 -16
- package/src/runtime/projections/materialized-view.ts +28 -10
- package/src/runtime/recovery/maintenance-executor.ts +393 -28
- package/src/runtime/root/mcp-transport.ts +180 -10
- package/src/runtime/root/package-connector-service.ts +186 -8
- package/src/runtime/root/package-runtime-release.ts +143 -17
- package/src/runtime/root/package-runtime-service.ts +430 -22
- package/src/runtime/root/release-manifest.ts +7 -2
- package/src/runtime/root/release-materialize.ts +19 -0
- package/src/runtime/root/release-store.ts +48 -11
- package/src/runtime/root/runtime.ts +23 -5
- package/src/runtime/root/service.ts +100 -29
- package/src/runtime/root/types.ts +2 -0
- package/src/runtime/safe-tooling/ios-development.ts +321 -63
- package/src/runtime/shared/trusted-executable.ts +62 -0
- package/src/runtime/shared/trusted-node-executable.ts +48 -0
- package/src/runtime/standalone-recovery/core.ts +700 -92
- package/src/runtime/standalone-recovery/entry.ts +99 -23
- package/src/runtime/standalone-recovery/installer.ts +19 -3
- package/src/runtime/standalone-recovery/service-labels.ts +2 -0
- package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
- package/src/runtime/workflow/schedules/browser-probe.ts +81 -3
- package/src/runtime/workflow/schedules/engine.ts +287 -151
- package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
- package/src/runtime/workflow/schedules/settlement.ts +48 -4
- package/src/runtime/workflow/schedules/store.ts +131 -10
- package/src/runtime/workflow/schedules/types.ts +2 -4
- package/src/runtime/workflow/schedules/work-continuation.ts +26 -13
- package/src/testing/test-governance.ts +8 -40
- package/assets/reference-configs/heartbeat-triage.md +0 -57
- package/assets/templates/helpers/harness-trace-grade.sh +0 -150
- package/assets/templates/helpers/heartbeat-triage.sh +0 -361
- package/assets/templates/helpers/maintenance-triage.sh +0 -167
- package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
- package/docs/architecture/current/architecture-invariants.md +0 -331
- package/docs/architecture/current/automation-and-schedule-engine.md +0 -459
- package/docs/architecture/current/codegraph-context-provider.md +0 -238
- package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
- package/docs/architecture/current/controller-repository-decoupling.md +0 -148
- package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -373
- package/docs/architecture/current/entity-model.md +0 -612
- package/docs/architecture/current/external-plugin-governance.md +0 -396
- package/docs/architecture/current/failure-recovery.md +0 -447
- package/docs/architecture/current/governance.md +0 -213
- package/docs/architecture/current/human-interaction-plane.md +0 -87
- package/docs/architecture/current/implementation-status.md +0 -128
- package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
- package/docs/architecture/current/legacy-governance.md +0 -58
- package/docs/architecture/current/local-workspace-target-grants.md +0 -70
- package/docs/architecture/current/migration-roadmap.md +0 -105
- package/docs/architecture/current/multi-repository-execution.md +0 -371
- package/docs/architecture/current/operations-runbook.md +0 -45
- package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
- package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
- package/docs/architecture/current/repository-access-modes.md +0 -102
- package/docs/architecture/current/route-policy.md +0 -15
- package/docs/architecture/current/route-session-concurrency.md +0 -85
- package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
- package/docs/architecture/current/runtime-directory-map.md +0 -49
- package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
- package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
- package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
- package/docs/architecture/current/system-overview.md +0 -169
- package/docs/architecture/current/target-requirements-traceability.md +0 -202
- package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
- package/docs/architecture/current/thin-harness-v1.md +0 -321
- package/docs/architecture/current/verification-and-release-gates.md +0 -391
- package/docs/forge-autonomous-goal-loop.md +0 -9
- package/docs/forge-provider-configuration.md +0 -7
- package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -93
- package/docs/operations/gmail-assistant-routines.md +0 -186
- package/docs/operations/personal-assistant-operator-guide.md +0 -61
- package/docs/operations/provider-configuration.md +0 -31
- package/scripts/harness-trace-grade.sh +0 -150
- package/scripts/heartbeat-triage.sh +0 -361
- package/scripts/maintenance-triage.sh +0 -167
- package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
- package/src/cli/repositories/goal-registry.ts +0 -239
- package/src/runtime/assistant/action-proposals.ts +0 -279
- package/src/runtime/assistant/intent.ts +0 -395
- package/src/runtime/assistant/model-provider.ts +0 -460
- package/src/runtime/assistant/openapi.ts +0 -223
- package/src/runtime/assistant/policy.ts +0 -89
- package/src/runtime/assistant/readiness.ts +0 -258
- package/src/runtime/assistant/routine-runtime.ts +0 -477
- package/src/runtime/assistant/schedule-binding.ts +0 -171
- package/src/runtime/assistant/standing-grants.ts +0 -375
- package/src/runtime/assistant/store.ts +0 -243
- package/src/runtime/assistant/types.ts +0 -135
- package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
- package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
- package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
- package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
- package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
- package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
- package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
- package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
- package/src/runtime/control-plane/goal-loop/index.ts +0 -13
- package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
- package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
- package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
- package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
- package/src/runtime/control-plane/goal-loop/types.ts +0 -378
- package/src/runtime/control-plane/startup-recovery.ts +0 -198
- package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
- package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
- package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
- package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
- package/src/runtime/workflow/findings/store.ts +0 -204
- package/src/runtime/workflow/findings/types.ts +0 -58
- package/src/runtime/workflow/portfolio/engine.ts +0 -20
- package/src/runtime/workflow/portfolio/store.ts +0 -185
- package/src/runtime/workflow/portfolio/types.ts +0 -29
|
@@ -19,85 +19,6 @@ target_branch=""
|
|
|
19
19
|
changed_files_file=""
|
|
20
20
|
format="text"
|
|
21
21
|
|
|
22
|
-
required_current_docs=(
|
|
23
|
-
"docs/architecture/current/README.md"
|
|
24
|
-
"docs/architecture/current/governance.md"
|
|
25
|
-
"docs/architecture/current/system-overview.md"
|
|
26
|
-
"docs/architecture/current/architecture-invariants.md"
|
|
27
|
-
"docs/architecture/current/entity-model.md"
|
|
28
|
-
"docs/architecture/current/job-and-run-lifecycle.md"
|
|
29
|
-
"docs/architecture/current/dispatch-and-agent-strategy.md"
|
|
30
|
-
"docs/architecture/current/scheduler-and-resource-claims.md"
|
|
31
|
-
"docs/architecture/current/multi-repository-execution.md"
|
|
32
|
-
"docs/architecture/current/automation-and-schedule-engine.md"
|
|
33
|
-
"docs/architecture/current/failure-recovery.md"
|
|
34
|
-
"docs/architecture/current/verification-and-release-gates.md"
|
|
35
|
-
"docs/architecture/current/implementation-status.md"
|
|
36
|
-
"docs/architecture/current/migration-roadmap.md"
|
|
37
|
-
"docs/architecture/current/runtime-directory-map.md"
|
|
38
|
-
"docs/architecture/current/operations-runbook.md"
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
historical_runtime_docs=(
|
|
42
|
-
"docs/architecture/history.md"
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
runtime_architecture_gate_enabled() {
|
|
46
|
-
[[ -d "docs/architecture/current" ]] && return 0
|
|
47
|
-
local file
|
|
48
|
-
for file in "${historical_runtime_docs[@]}"; do
|
|
49
|
-
[[ -f "$file" ]] && return 0
|
|
50
|
-
done
|
|
51
|
-
[[ -f "docs/architecture/index.md" ]] && grep -Fq -- "Controller Runtime" "docs/architecture/index.md"
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
architecture_baseline_fail() {
|
|
55
|
-
echo "[ArchitectureSync] current Controller Runtime architecture baseline failed: $1" >&2
|
|
56
|
-
return 1
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
require_architecture_file() {
|
|
60
|
-
local file="$1"
|
|
61
|
-
[[ -f "$file" ]] || architecture_baseline_fail "missing required file $file"
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
require_architecture_text() {
|
|
65
|
-
local file="$1"
|
|
66
|
-
local text="$2"
|
|
67
|
-
if ! require_architecture_file "$file"; then
|
|
68
|
-
return 1
|
|
69
|
-
fi
|
|
70
|
-
grep -Fq -- "$text" "$file" || architecture_baseline_fail "$file must contain: $text"
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
check_runtime_architecture_baseline() {
|
|
74
|
-
local file
|
|
75
|
-
local failed=0
|
|
76
|
-
require_architecture_text "docs/architecture/index.md" "Runtime Authority" || failed=1
|
|
77
|
-
require_architecture_text "docs/architecture/index.md" "docs/architecture/current/" || failed=1
|
|
78
|
-
require_architecture_text "docs/architecture/current/README.md" "Runtime Authority" || failed=1
|
|
79
|
-
require_architecture_text "docs/architecture/current/governance.md" "Runtime Authority" || failed=1
|
|
80
|
-
|
|
81
|
-
for file in "${required_current_docs[@]}"; do
|
|
82
|
-
require_architecture_file "$file" || failed=1
|
|
83
|
-
done
|
|
84
|
-
|
|
85
|
-
for file in "${historical_runtime_docs[@]}"; do
|
|
86
|
-
require_architecture_text "$file" "Historical Design" || failed=1
|
|
87
|
-
require_architecture_text "$file" "Not Runtime Authority" || failed=1
|
|
88
|
-
require_architecture_text "$file" "docs/architecture/current/README.md" || failed=1
|
|
89
|
-
done
|
|
90
|
-
|
|
91
|
-
require_architecture_text "docs/architecture/current/architecture-invariants.md" "Invariant 2 — Persist Before Execute" || failed=1
|
|
92
|
-
require_architecture_text "docs/architecture/current/architecture-invariants.md" "Invariant 4 — Task Is Intent; Run Is Attempt" || failed=1
|
|
93
|
-
require_architecture_text "docs/architecture/current/architecture-invariants.md" "Invariant 16 — Evidence Binds to Exact Revision" || failed=1
|
|
94
|
-
require_architecture_text "docs/architecture/current/architecture-invariants.md" "Invariant 21 — Scheduled Work Is Bounded" || failed=1
|
|
95
|
-
require_architecture_text "docs/architecture/current/implementation-status.md" "## Completion Statement" || failed=1
|
|
96
|
-
require_architecture_text "docs/architecture/current/migration-roadmap.md" "## P0" || failed=1
|
|
97
|
-
require_architecture_text "docs/architecture/current/migration-roadmap.md" "## P5" || failed=1
|
|
98
|
-
return "$failed"
|
|
99
|
-
}
|
|
100
|
-
|
|
101
22
|
while [[ $# -gt 0 ]]; do
|
|
102
23
|
case "$1" in
|
|
103
24
|
--mode)
|
|
@@ -277,13 +198,6 @@ case "$mode" in
|
|
|
277
198
|
;;
|
|
278
199
|
esac
|
|
279
200
|
|
|
280
|
-
# Structural authority checks are invariant and must run even when freshness gating is disabled.
|
|
281
|
-
if runtime_architecture_gate_enabled; then
|
|
282
|
-
if ! check_runtime_architecture_baseline; then
|
|
283
|
-
exit 1
|
|
284
|
-
fi
|
|
285
|
-
fi
|
|
286
|
-
|
|
287
201
|
if [[ ! -x "scripts/architecture-queue.sh" ]]; then
|
|
288
202
|
if [[ "$mode" == "strict" ]]; then
|
|
289
203
|
echo "[ArchitectureSync] strict gate failed: missing scripts/architecture-queue.sh" >&2
|
|
@@ -298,6 +212,23 @@ if ! bash scripts/architecture-queue.sh reindex --check >/dev/null; then
|
|
|
298
212
|
exit 1
|
|
299
213
|
fi
|
|
300
214
|
|
|
215
|
+
if [[ -f "docs/architecture/current/README.md" ]]; then
|
|
216
|
+
if [[ ! -f "docs/architecture/CURRENT.md" ]]; then
|
|
217
|
+
echo "[ArchitectureSync] architecture baseline failed: missing required file docs/architecture/CURRENT.md" >&2
|
|
218
|
+
exit 1
|
|
219
|
+
fi
|
|
220
|
+
|
|
221
|
+
if ! grep -Fq "Runtime Authority" "docs/architecture/CURRENT.md"; then
|
|
222
|
+
echo "[ArchitectureSync] architecture baseline failed: docs/architecture/CURRENT.md must contain: Runtime Authority" >&2
|
|
223
|
+
exit 1
|
|
224
|
+
fi
|
|
225
|
+
|
|
226
|
+
if ! grep -Fq "Not Runtime Authority" "docs/architecture/current/README.md"; then
|
|
227
|
+
echo "[ArchitectureSync] architecture baseline failed: docs/architecture/current/README.md must contain: Not Runtime Authority" >&2
|
|
228
|
+
exit 1
|
|
229
|
+
fi
|
|
230
|
+
fi
|
|
231
|
+
|
|
301
232
|
if [[ "$mode" == "off" ]]; then
|
|
302
233
|
case "$format" in
|
|
303
234
|
json) printf '{"mode":"off","changed_capabilities":0,"blocking":0}\n' ;;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
1
2
|
import { FORGE_TOOL_SURFACE, FORGE_VERSION, forgeToolSurfaceFingerprint } from '../src/cli/controller/runtime-config';
|
|
2
3
|
import { runtimePolicy } from '../src/cli/mcp/multi-repository';
|
|
3
4
|
import { buildMcpToolDefinitions } from '../src/cli/mcp/tools';
|
|
@@ -48,6 +49,16 @@ const missingCatalog = catalogNames.filter((name) => !fullNames.includes(name));
|
|
|
48
49
|
const sourceCollisions = Object.entries(sourceGroups).flatMap(([group, names], groupIndex, entries) =>
|
|
49
50
|
names.filter((name) => entries.slice(0, groupIndex).some(([, earlier]) => earlier.includes(name)))
|
|
50
51
|
.map((name) => `${group}:${name}`));
|
|
52
|
+
const currentToolNames = new Set([
|
|
53
|
+
...sourceGroups.runtime,
|
|
54
|
+
...sourceGroups.execution,
|
|
55
|
+
...sourceGroups.process,
|
|
56
|
+
...sourceGroups.access,
|
|
57
|
+
...sourceGroups.repository,
|
|
58
|
+
]);
|
|
59
|
+
const legacyHandlerSource = readFileSync(new URL('../src/cli/mcp/legacy-tool-service.ts', import.meta.url), 'utf8');
|
|
60
|
+
const legacyHandlerNames = [...legacyHandlerSource.matchAll(/case\s+["']([^"']+)["']\s*:/g)].map((match) => match[1]);
|
|
61
|
+
const legacyHandlerCollisions = [...new Set(legacyHandlerNames.filter((name) => currentToolNames.has(name)))].sort();
|
|
51
62
|
|
|
52
63
|
const failures: string[] = [];
|
|
53
64
|
if (defaultNames.length > MAX_DEFAULT_TOOL_COUNT) {
|
|
@@ -56,6 +67,8 @@ if (defaultNames.length > MAX_DEFAULT_TOOL_COUNT) {
|
|
|
56
67
|
if (duplicateDefault.length) failures.push(`default duplicate names: ${[...new Set(duplicateDefault)].join(', ')}`);
|
|
57
68
|
if (missingDefault.length) failures.push(`default tools missing from registered definitions: ${missingDefault.join(', ')}`);
|
|
58
69
|
if (missingCatalog.length) failures.push(`compatibility catalog tools missing from registered definitions: ${missingCatalog.join(', ')}`);
|
|
70
|
+
if (sourceCollisions.length) failures.push(`tool schema authority collisions: ${sourceCollisions.join(', ')}`);
|
|
71
|
+
if (legacyHandlerCollisions.length) failures.push(`legacy execution authority collisions: ${legacyHandlerCollisions.join(', ')}`);
|
|
59
72
|
if (coreNames.join('\n') !== defaultNames.join('\n')) {
|
|
60
73
|
failures.push('core surface must alias the bounded default ChatGPT surface');
|
|
61
74
|
}
|
|
@@ -89,5 +102,6 @@ console.log(JSON.stringify({
|
|
|
89
102
|
fullCompatibilityFingerprint: fullFingerprint,
|
|
90
103
|
sourceToolCounts: Object.fromEntries(Object.entries(sourceGroups).map(([name, tools]) => [name, tools.length])),
|
|
91
104
|
sourceCollisions: [...new Set(sourceCollisions)].sort(),
|
|
105
|
+
legacyHandlerCollisions,
|
|
92
106
|
accessModeChangesSchema: false,
|
|
93
107
|
}, null, 2));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { readFileSync, existsSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { readFileSync, existsSync, lstatSync, readdirSync } from 'node:fs';
|
|
3
3
|
import { resolve } from 'node:path';
|
|
4
4
|
|
|
5
5
|
const root = resolve(new URL('..', import.meta.url).pathname);
|
|
@@ -15,8 +15,16 @@ function text(path) {
|
|
|
15
15
|
function requireText(path, needle) {
|
|
16
16
|
if (!text(path).includes(needle)) failures.push(`${path} must contain ${JSON.stringify(needle)}`);
|
|
17
17
|
}
|
|
18
|
+
function hasFilesystemContent(path) {
|
|
19
|
+
const absolute = resolve(root, path);
|
|
20
|
+
if (!existsSync(absolute)) return false;
|
|
21
|
+
if (!lstatSync(absolute).isDirectory()) return true;
|
|
22
|
+
return readdirSync(absolute, { withFileTypes: true }).some((entry) =>
|
|
23
|
+
entry.isDirectory() ? hasFilesystemContent(`${path}/${entry.name}`) : true,
|
|
24
|
+
);
|
|
25
|
+
}
|
|
18
26
|
function requireMissing(path) {
|
|
19
|
-
if (
|
|
27
|
+
if (hasFilesystemContent(path)) failures.push(`${path} must be deleted`);
|
|
20
28
|
}
|
|
21
29
|
function requireMatch(path, expression, description) {
|
|
22
30
|
if (!expression.test(text(path))) failures.push(`${path} must ${description}`);
|
|
@@ -44,10 +52,42 @@ function sourceFiles(directory) {
|
|
|
44
52
|
return files;
|
|
45
53
|
}
|
|
46
54
|
|
|
55
|
+
const allowedArchitectureRootMarkdown = new Set(['CURRENT.md', 'EVOLUTION.md', 'history.md', 'index.md']);
|
|
56
|
+
const architectureRootMarkdown = readdirSync(resolve(root, 'docs/architecture'), { withFileTypes: true })
|
|
57
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith('.md'))
|
|
58
|
+
.map((entry) => entry.name)
|
|
59
|
+
.sort();
|
|
60
|
+
for (const name of architectureRootMarkdown) {
|
|
61
|
+
if (!allowedArchitectureRootMarkdown.has(name)) {
|
|
62
|
+
failures.push(`docs/architecture/${name} must be archived under docs/architecture/history/ instead of acting as parallel root architecture authority`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
for (const path of ['README.md', 'docs/ROADMAP.md', 'docs/architecture/CURRENT.md', 'docs/architecture/index.md']) {
|
|
67
|
+
forbid(path, /\/Users\//, 'maintained documentation must not contain personal absolute macOS paths');
|
|
68
|
+
forbid(path, /\bRepo Harness\b/i, 'maintained documentation must use the current Forge product identity');
|
|
69
|
+
forbid(path, /(?:^|\n)\s*(?:>\s*)?(?:\*\*)?Status(?:\*\*)?\s*:\s*[^\n]*(?:implementation in progress|Phase\s+\d+)/i, 'maintained documentation must not carry transient execution status; use Plan/Work/evidence or history');
|
|
70
|
+
}
|
|
71
|
+
|
|
47
72
|
const required = [
|
|
48
73
|
'src/runtime/gateway/mcp/router.ts',
|
|
49
74
|
'src/cli/agent-jobs/executable-resolver.ts',
|
|
50
75
|
'src/runtime/control-plane/global-scheduler/scheduler.ts',
|
|
76
|
+
'src/runtime/control-plane/global-scheduler/config.ts',
|
|
77
|
+
'src/runtime/control-plane/global-scheduler/state.ts',
|
|
78
|
+
'src/runtime/control-plane/global-scheduler/worker-launch.ts',
|
|
79
|
+
'src/runtime/control-plane/global-scheduler/dispatch-capacity.ts',
|
|
80
|
+
'src/runtime/control-plane/global-scheduler/projection-refresh.ts',
|
|
81
|
+
'src/runtime/control-plane/global-scheduler/worker-lifecycle.ts',
|
|
82
|
+
'src/runtime/control-plane/global-scheduler/worker-stderr.ts',
|
|
83
|
+
'src/runtime/control-plane/global-scheduler/worker-attachment.ts',
|
|
84
|
+
'src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts',
|
|
85
|
+
'src/runtime/control-plane/global-scheduler/maintenance.ts',
|
|
86
|
+
'src/runtime/control-plane/global-scheduler/source-scan.ts',
|
|
87
|
+
'src/runtime/control-plane/global-scheduler/durable-admission.ts',
|
|
88
|
+
'src/runtime/control-plane/global-scheduler/worker-exit-decision.ts',
|
|
89
|
+
'src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts',
|
|
90
|
+
'src/runtime/control-plane/global-scheduler/worker-process.ts',
|
|
51
91
|
'src/runtime/control-plane/repo-actor/actor.ts',
|
|
52
92
|
'src/runtime/execution/jobs/store.ts',
|
|
53
93
|
'src/runtime/execution/jobs/timeouts.ts',
|
|
@@ -56,8 +96,7 @@ const required = [
|
|
|
56
96
|
'src/runtime/execution/thin-harness/index.ts',
|
|
57
97
|
'src/runtime/execution/thin-harness/execution-router.ts',
|
|
58
98
|
'src/runtime/control-plane/routing/route-policy.ts',
|
|
59
|
-
'docs/architecture/
|
|
60
|
-
'docs/architecture/current/thin-harness-v1.md',
|
|
99
|
+
'docs/architecture/CURRENT.md',
|
|
61
100
|
'src/runtime/resources/leases/store.ts',
|
|
62
101
|
'src/runtime/evidence/event-ledger.ts',
|
|
63
102
|
'src/runtime/evidence/evidence-store.ts',
|
|
@@ -70,8 +109,6 @@ const required = [
|
|
|
70
109
|
'src/runtime/workflow/schedules/work-continuation.ts',
|
|
71
110
|
'scripts/smoke-runtime-recovery.ts',
|
|
72
111
|
'scripts/smoke-schedule-engine.ts',
|
|
73
|
-
'src/runtime/workflow/portfolio/engine.ts',
|
|
74
|
-
'src/runtime/workflow/findings/store.ts',
|
|
75
112
|
'src/runtime/release/release-gate.ts',
|
|
76
113
|
'src/runtime/root/runtime.ts',
|
|
77
114
|
'src/runtime/root/readiness.ts',
|
|
@@ -85,12 +122,6 @@ const required = [
|
|
|
85
122
|
'src/cli/commands/init-hook.ts',
|
|
86
123
|
'src/cli/commands/runtime.ts',
|
|
87
124
|
'src/cli/index.ts',
|
|
88
|
-
'docs/architecture/current/runtime-architecture-simplification.md',
|
|
89
|
-
'docs/architecture/current/implementation-status.md',
|
|
90
|
-
'docs/architecture/current/runtime-directory-map.md',
|
|
91
|
-
'docs/architecture/current/operations-runbook.md',
|
|
92
|
-
'docs/architecture/current/target-requirements-traceability.md',
|
|
93
|
-
'docs/architecture/current/approved-target-architecture.zh-CN.md',
|
|
94
125
|
];
|
|
95
126
|
for (const path of required) text(path);
|
|
96
127
|
requireText('src/runtime/control-plane/routing/route-policy.ts', "export function decideRoute");
|
|
@@ -110,7 +141,6 @@ forbidBetween(
|
|
|
110
141
|
for (const adapter of [
|
|
111
142
|
'src/cli/controller/work-mode.ts',
|
|
112
143
|
'src/runtime/control-plane/facade/types.ts',
|
|
113
|
-
'src/runtime/control-plane/goal-loop/executor-router.ts',
|
|
114
144
|
]) {
|
|
115
145
|
requireText(adapter, '@deprecated Compatibility adapter');
|
|
116
146
|
requireText(adapter, 'decideRoute(');
|
|
@@ -126,6 +156,16 @@ requireMissing('src/runtime/control-plane/daemon-entry.ts');
|
|
|
126
156
|
requireMissing('scripts/smoke-runtime-control-plane.ts');
|
|
127
157
|
requireMissing('src/cli/controller/lifecycle.ts');
|
|
128
158
|
requireMissing('src/cli/commands/supervisor.ts');
|
|
159
|
+
requireMissing('src/runtime/control-plane/goal-loop');
|
|
160
|
+
requireMissing('src/cli/repositories/goal-registry.ts');
|
|
161
|
+
requireMissing('src/runtime/assistant');
|
|
162
|
+
requireMissing('src/runtime/personal-assistant');
|
|
163
|
+
requireMissing('src/runtime/workflow/findings');
|
|
164
|
+
forbid(
|
|
165
|
+
'src/runtime/control-plane/global-scheduler/scheduler.ts',
|
|
166
|
+
/tickGoalLoopsForController|lastGoalLoopTick/,
|
|
167
|
+
'Scheduler must not restore autonomous Goal Loop polling',
|
|
168
|
+
);
|
|
129
169
|
requireMissing('src/cli/controller/restart-coordinator-entry.ts');
|
|
130
170
|
requireMissing('scripts/controller-runtime.sh');
|
|
131
171
|
requireMissing('scripts/activate-source-baseline.command');
|
|
@@ -145,6 +185,13 @@ requireMissing('OPTIMIZATION_REPORT.md');
|
|
|
145
185
|
requireMissing('docs/architecture/RELIABILITY-PROGRAM.md');
|
|
146
186
|
requireMissing('docs/architecture/p0-canonical-single-runtime-plan.md');
|
|
147
187
|
requireMissing('docs/architecture/transactional-adoption-planner.md');
|
|
188
|
+
requireMissing('docs/architecture/global-hook-runtime.md');
|
|
189
|
+
requireMissing('docs/architecture/ios-semantic-automation-provider-v2.md');
|
|
190
|
+
requireMissing('docs/architecture/chatgpt-handoff-facade.md');
|
|
191
|
+
requireText('docs/architecture/history/global-hook-runtime.md', 'Status: **Historical Evidence — Not Runtime Authority**');
|
|
192
|
+
requireText('docs/architecture/history/ios-semantic-automation-provider-v2.md', 'Status: **Historical Design Evidence — Not Runtime Authority**');
|
|
193
|
+
requireText('docs/architecture/history/chatgpt-handoff-facade.md', 'Status: **Historical Design Rationale — Not Runtime Authority**');
|
|
194
|
+
requireText('docs/architecture/history/README.md', 'Status: **Historical Evidence — Not Runtime Authority**');
|
|
148
195
|
requireMissing('docs/operations/20260802-requirement-portfolio-migration.md');
|
|
149
196
|
requireMissing('docs/runbooks/RELIABILITY-SESSION-PROTOCOL.md');
|
|
150
197
|
requireMissing('docs/architecture/decisions/20260718-mcp-session-lifecycle-and-ingress-isolation.md');
|
|
@@ -156,6 +203,7 @@ requireMissing('bin/repo-harness-hook.mjs');
|
|
|
156
203
|
requireMissing('bin/repo-harness-runtime.mjs');
|
|
157
204
|
requireMissing('src/runtime/control-plane/daemon-client.ts');
|
|
158
205
|
requireMissing('src/runtime/control-plane/daemon-ownership.ts');
|
|
206
|
+
requireMissing('src/runtime/workflow/portfolio');
|
|
159
207
|
for (const path of sourceFiles('src')) {
|
|
160
208
|
const source = text(path);
|
|
161
209
|
for (const retiredAuthority of [
|
|
@@ -209,24 +257,16 @@ for (const projectionPath of [
|
|
|
209
257
|
}
|
|
210
258
|
requireText('src/runtime/projections/invalidation.ts', 'runtimeInstanceId?: string');
|
|
211
259
|
requireText('src/runtime/projections/materialized-view.ts', 'currentOwner.runtimeInstanceId !== owner.runtimeInstanceId');
|
|
212
|
-
requireText('src/runtime/control-plane/global-scheduler/
|
|
260
|
+
requireText('src/runtime/control-plane/global-scheduler/projection-refresh.ts', 'getRuntimeWriteClaim()?.runtimeInstanceId');
|
|
213
261
|
forbid(
|
|
214
262
|
'src/runtime/execution/jobs/receipt-store.ts',
|
|
215
263
|
/ownerEpoch|releaseFencingToken/,
|
|
216
264
|
'persist only non-secret Canonical Runtime/release identity in OperationReceipt ownership evidence',
|
|
217
265
|
);
|
|
218
266
|
|
|
219
|
-
requireText('docs/architecture/
|
|
220
|
-
requireText('docs/architecture/
|
|
221
|
-
requireText('docs/architecture/
|
|
222
|
-
requireText('docs/architecture/current/runtime-architecture-simplification.md', 'Legacy code may receive only deletion-enabling or safety-fencing changes.');
|
|
223
|
-
forbidBetween(
|
|
224
|
-
'docs/architecture/current/runtime-architecture-simplification.md',
|
|
225
|
-
'## 2. Target Runtime',
|
|
226
|
-
'## 3. Seven phases',
|
|
227
|
-
/Stable Supervisor|Stable Ingress|blue\/green|candidate\/current\/previous/i,
|
|
228
|
-
'define the target Runtime without Supervisor, ingress, slots, or component rollback',
|
|
229
|
-
);
|
|
267
|
+
requireText('docs/architecture/CURRENT.md', 'Canonical Runtime is activated as one immutable whole release');
|
|
268
|
+
requireText('docs/architecture/CURRENT.md', 'Runtime availability/recovery keeps Forge itself healthy');
|
|
269
|
+
requireText('docs/architecture/CURRENT.md', 'Historical Issue/Task/Local Job and compatibility projections must not become second mutable authorities.');
|
|
230
270
|
requireText('src/runtime/root/runtime.ts', 'export class CanonicalForgeRuntime');
|
|
231
271
|
forbid('src/runtime/control-plane/runtime-status-client.ts', /ensureControllerDaemon|child_process|daemon-entry|StableSupervisor|ownerEpoch|slot\?:/, 'keep Forge Runtime status observation read-only and free of legacy lifecycle authority');
|
|
232
272
|
requireText('src/runtime/root/runtime.ts', "startInProcessScheduler");
|
|
@@ -354,21 +394,11 @@ forbid(
|
|
|
354
394
|
/\bcreateExecutionJob\b/,
|
|
355
395
|
'Runtime MCP tools must not retain dormant ExecutionJob creation paths',
|
|
356
396
|
);
|
|
357
|
-
forbid(
|
|
358
|
-
'src/runtime/assistant/intent.ts',
|
|
359
|
-
/\bcreateExecutionJob\b/,
|
|
360
|
-
'Assistant intent and routine triggers must use direct plugin actions or external-Controller handoffs',
|
|
361
|
-
);
|
|
362
397
|
forbid(
|
|
363
398
|
'src/runtime/execution/jobs/legacy-adapter.ts',
|
|
364
399
|
/\bcreateExecutionJob\b|\bdispatchLegacyLocalJob\b/,
|
|
365
400
|
'Legacy Local Bridge compatibility must be read-only and must not dispatch new ExecutionJobs',
|
|
366
401
|
);
|
|
367
|
-
forbid(
|
|
368
|
-
'src/runtime/workflow/portfolio/engine.ts',
|
|
369
|
-
/\bcreateExecutionJob\b|\bfindExecutionJob\b/,
|
|
370
|
-
'Portfolio definitions are planning records; Kernel-owned Portfolio execution is retired',
|
|
371
|
-
);
|
|
372
402
|
forbid(
|
|
373
403
|
'src/cli/local-bridge/server.ts',
|
|
374
404
|
/\bsubmitLocalBridgeJob\b|\bdispatchLocalBridgeJob\b|\basyncExecute\b/,
|
|
@@ -425,16 +455,6 @@ forbid(
|
|
|
425
455
|
/\bretryAgentJob\b/,
|
|
426
456
|
'Legacy MCP must not call Agent Run retry',
|
|
427
457
|
);
|
|
428
|
-
forbid(
|
|
429
|
-
'src/runtime/workflow/portfolio/engine.ts',
|
|
430
|
-
/\bacceptTaskJob\b|\bstartTaskJob\b|\bretryAgentJob\b/,
|
|
431
|
-
'Portfolio Engine must not start or retry Kernel-managed Agent Runs',
|
|
432
|
-
);
|
|
433
|
-
forbid(
|
|
434
|
-
'src/runtime/control-plane/goal-loop/goal-loop-engine.ts',
|
|
435
|
-
/\bcreateExecutionJob\b|\bsubmitLocalBridgeJob\b|\bacceptTaskJob\b|\bstartTaskJob\b|\bdispatchProvider\b/,
|
|
436
|
-
'Goal Loop must not create Jobs, Agent Runs, or invoke Kernel Provider dispatch',
|
|
437
|
-
);
|
|
438
458
|
forbid('src/runtime/gateway/mcp/router.ts', /Use process_get \/ process_wait \/ process_logs/, 'Gateway follow-up instructions must use an always-exposed neutral Work facade');
|
|
439
459
|
requireMatch(
|
|
440
460
|
'src/runtime/gateway/mcp/router.ts',
|
|
@@ -446,12 +466,6 @@ requireText('src/runtime/gateway/mcp/runtime-tools.ts', "case 'local_bridge_stat
|
|
|
446
466
|
requireText('src/runtime/gateway/mcp/runtime-tools.ts', 'readAgentExecutableReadinessSnapshot');
|
|
447
467
|
requireText('src/runtime/gateway/mcp/runtime-tools.ts', 'connectorExposedTools');
|
|
448
468
|
requireText('src/runtime/gateway/mcp/runtime-tools.ts', 'currentCallableTools');
|
|
449
|
-
forbid(
|
|
450
|
-
'docs/architecture/current/implementation-status.md',
|
|
451
|
-
/Stable external lifecycle Supervisor \| Implemented|Stable ingress event-loop isolation \| Implemented/,
|
|
452
|
-
'legacy Supervisor or Stable Ingress must not be reported as the target implementation',
|
|
453
|
-
);
|
|
454
|
-
requireText('docs/architecture/current/implementation-status.md', 'Canonical Single Runtime vertical slice');
|
|
455
469
|
forbid('src/runtime/gateway/mcp/runtime-tools.ts', /inspectAgentExecutableReadiness|resolveAgentExecutable|writeAgentExecutableReadinessSnapshot/, 'Gateway readiness must only read the Daemon-produced Agent executable snapshot');
|
|
456
470
|
forbidBetween(
|
|
457
471
|
'src/runtime/gateway/mcp/runtime-tools.ts',
|
|
@@ -491,15 +505,50 @@ requireText('src/runtime/execution/jobs/receipt-store.ts', "state: 'started' | '
|
|
|
491
505
|
requireText('src/runtime/execution/thin-harness/execution-router.ts', "mode: 'fast'");
|
|
492
506
|
requireText('src/runtime/execution/thin-harness/execution-router.ts', 'routeExecution');
|
|
493
507
|
requireText('src/runtime/execution/thin-harness/types.ts', 'FastExecutionReceipt');
|
|
494
|
-
requireText('docs/architecture/
|
|
508
|
+
requireText('docs/architecture/CURRENT.md', '### Ephemeral Direct — default');
|
|
495
509
|
requireText('src/runtime/resources/leases/types.ts', 'fencingToken: number');
|
|
496
510
|
requireText('src/runtime/resources/leases/store.ts', 'assertFencingToken');
|
|
497
511
|
requireText('src/runtime/resources/leases/store.ts', 'expectedLeaseMap');
|
|
498
512
|
requireText('src/runtime/resources/claims/conflicts.ts', "'repo-content:*'");
|
|
499
513
|
requireText('src/runtime/control-plane/repo-actor/actor.ts', 'repo-actor-mailbox');
|
|
500
514
|
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'maxConcurrentRepositories');
|
|
501
|
-
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', '
|
|
502
|
-
requireText('src/runtime/control-plane/global-scheduler/
|
|
515
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'createSchedulerDispatchCapacity');
|
|
516
|
+
requireText('src/runtime/control-plane/global-scheduler/dispatch-capacity.ts', 'maxHeavyChecks');
|
|
517
|
+
requireText('src/runtime/control-plane/global-scheduler/dispatch-capacity.ts', 'maxAgentProcesses');
|
|
518
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'normalizeSchedulerConfig');
|
|
519
|
+
requireText('src/runtime/control-plane/global-scheduler/config.ts', 'normalizeSchedulerConfig');
|
|
520
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'writeSchedulerHealthSnapshot');
|
|
521
|
+
requireText('src/runtime/control-plane/global-scheduler/state.ts', 'writeSchedulerHealthSnapshot');
|
|
522
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'buildSchedulerWorkerLaunchDescriptor');
|
|
523
|
+
requireText('src/runtime/control-plane/global-scheduler/worker-launch.ts', 'buildSchedulerWorkerLaunchDescriptor');
|
|
524
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'refreshSchedulerRepositoryProjections');
|
|
525
|
+
requireText('src/runtime/control-plane/global-scheduler/projection-refresh.ts', 'refreshRepositoryProjectionForRepository');
|
|
526
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'buildSchedulerWorkerSpawnedLifecycle');
|
|
527
|
+
requireText('src/runtime/control-plane/global-scheduler/worker-lifecycle.ts', 'buildSchedulerWorkerExitFailure');
|
|
528
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'createSchedulerWorkerStderrCapture');
|
|
529
|
+
requireText('src/runtime/control-plane/global-scheduler/worker-stderr.ts', 'MAX_SCHEDULER_WORKER_STDERR_BYTES');
|
|
530
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'persistSchedulerWorkerAttachment');
|
|
531
|
+
requireText('src/runtime/control-plane/global-scheduler/worker-attachment.ts', 'attachExecutionWorker');
|
|
532
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'runSchedulerPeriodicCleanup');
|
|
533
|
+
requireText('src/runtime/control-plane/global-scheduler/maintenance.ts', 'runSchedulerValidationReconciliation');
|
|
534
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'planSchedulerSourceSampling');
|
|
535
|
+
requireText('src/runtime/control-plane/global-scheduler/source-scan.ts', 'selectSchedulerSourceScanRepositories');
|
|
536
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'runSchedulerDurableAdmission');
|
|
537
|
+
requireText('src/runtime/control-plane/global-scheduler/durable-admission.ts', 'markExecutionJobSchedulerObserved');
|
|
538
|
+
requireText('src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts', 'persistSchedulerTerminalWorkerLifecycle');
|
|
539
|
+
requireText('src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts', 'TERMINAL_JOB_STATUSES');
|
|
540
|
+
requireText('src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts', 'evaluateSchedulerWorkerExitCandidate');
|
|
541
|
+
requireText('src/runtime/control-plane/global-scheduler/worker-exit-decision.ts', 'TERMINAL_JOB_STATUSES');
|
|
542
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'reconcileSchedulerWorkerExit');
|
|
543
|
+
requireText('src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts', 'releaseExecutionLeases');
|
|
544
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'cleanupSchedulerWorkerProcesses');
|
|
545
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'registerSchedulerWorkerProcess');
|
|
546
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'spawnSchedulerWorkerProcess');
|
|
547
|
+
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'wireSchedulerWorkerProcess');
|
|
548
|
+
requireText('src/runtime/control-plane/global-scheduler/worker-process.ts', 'cleanupSchedulerWorkerProcesses');
|
|
549
|
+
requireText('src/runtime/control-plane/global-scheduler/worker-process.ts', 'dependencies.spawnProcess');
|
|
550
|
+
requireText('src/runtime/control-plane/global-scheduler/worker-process.ts', 'terminateProcessTree');
|
|
551
|
+
requireText('src/runtime/control-plane/global-scheduler/worker-process.ts', "child.once('close'");
|
|
503
552
|
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'writeAgentExecutableReadinessSnapshot');
|
|
504
553
|
requireText('src/runtime/control-plane/global-scheduler/scheduler.ts', 'sampleRepositoryGitStatusForRepositories');
|
|
505
554
|
requireText('src/cli/agent-jobs/executable-resolver.ts', 'revalidateAgentExecutable');
|
|
@@ -533,7 +582,7 @@ forbidBetween(
|
|
|
533
582
|
requireText('src/runtime/control-plane/execution/session-store.ts', 'lastValidatedAt: now');
|
|
534
583
|
requireText('src/runtime/control-plane/execution/validation.ts', 'warnings.push');
|
|
535
584
|
requireText('src/runtime/control-plane/execution/work-handle-store.ts', "failed: ['validating', 'editing', 'committed', 'merged', 'cleaned', 'failed_terminal_cleanup']");
|
|
536
|
-
requireText('src/runtime/gateway/mcp/execution-tools.ts', '
|
|
585
|
+
requireText('src/runtime/gateway/mcp/execution-tools.ts', 'resetFinalizationStagesForRequest');
|
|
537
586
|
requireText('src/runtime/gateway/mcp/execution-tools.ts', 'finalizationComplete');
|
|
538
587
|
forbidBetween(
|
|
539
588
|
'src/runtime/gateway/mcp/execution-tools.ts',
|
|
@@ -546,9 +595,6 @@ requireText('src/runtime/workflow/schedules/types.ts', "'repository-event'");
|
|
|
546
595
|
requireText('src/runtime/workflow/schedules/types.ts', "'dependency-checkpoint'");
|
|
547
596
|
requireText('src/runtime/workflow/schedules/store.ts', 'saveScheduleDecision');
|
|
548
597
|
requireText('src/runtime/workflow/schedules/settlement.ts', 'backoffMinutes');
|
|
549
|
-
requireText('src/runtime/workflow/portfolio/store.ts', "'workflows.json'");
|
|
550
|
-
requireText('src/runtime/workflow/portfolio/store.ts', 'PORTFOLIO_DEPENDENCY_CYCLE');
|
|
551
|
-
requireText('src/runtime/workflow/findings/store.ts', 'observationCount');
|
|
552
598
|
requireText('src/runtime/release/release-gate.ts', 'releaseReady');
|
|
553
599
|
requireText('src/cli/mcp/transports/http.ts', "'/ready'");
|
|
554
600
|
requireText('src/cli/mcp/transports/http.ts', "'/repos/:repoId/health'");
|
|
@@ -568,12 +614,9 @@ for (const path of [
|
|
|
568
614
|
forbid(path, /\b(?:spawnSync|execSync|execFileSync)\s*\(/, 'the non-blocking Gateway/Controller hot-path rule');
|
|
569
615
|
}
|
|
570
616
|
|
|
571
|
-
requireText('docs/architecture/
|
|
572
|
-
requireText('docs/architecture/
|
|
573
|
-
requireText('docs/architecture/
|
|
574
|
-
requireText('docs/architecture/current/implementation-status.md', 'Release Freeze and Gate | Implemented');
|
|
575
|
-
requireText('docs/architecture/current/target-requirements-traceability.md', '## 4. Architecture constitution');
|
|
576
|
-
requireText('docs/architecture/current/target-requirements-traceability.md', '## 16. Standard execution flow');
|
|
617
|
+
requireText('docs/architecture/CURRENT.md', '## State ownership');
|
|
618
|
+
requireText('docs/architecture/CURRENT.md', '## Runtime and MCP boundary');
|
|
619
|
+
requireText('docs/architecture/CURRENT.md', '## Testing and verification');
|
|
577
620
|
requireText('plans/README.md', 'not the runtime execution queue');
|
|
578
621
|
if (text('src/cli/mcp/tools.ts').split(/\r?\n/).length > 40) failures.push('src/cli/mcp/tools.ts must remain a thin compatibility facade');
|
|
579
622
|
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { createHash } from 'crypto';
|
|
3
|
+
import { mkdirSync, renameSync, writeFileSync } from 'fs';
|
|
4
|
+
import { dirname, join } from 'path';
|
|
5
|
+
import { resolveControllerHome } from '../src/cli/repositories/controller-home';
|
|
6
|
+
import { recoveryConnectorDescriptor, verifyRecoveryConnector } from '../src/cli/commands/recovery';
|
|
7
|
+
import { loadRecoveryConfig, verifyStableRuntime } from '../src/runtime/standalone-recovery/core';
|
|
8
|
+
import { observeRuntimeStatus } from '../src/runtime/root/status';
|
|
9
|
+
|
|
10
|
+
interface BaselineReceipt {
|
|
11
|
+
schemaVersion: 1;
|
|
12
|
+
status: 'passed' | 'failed';
|
|
13
|
+
controllerHome: string;
|
|
14
|
+
observedAt: string;
|
|
15
|
+
runtime: ReturnType<typeof observeRuntimeStatus>;
|
|
16
|
+
recovery: {
|
|
17
|
+
connector: ReturnType<typeof recoveryConnectorDescriptor>;
|
|
18
|
+
runtimeVerify: Awaited<ReturnType<typeof verifyStableRuntime>>;
|
|
19
|
+
connectorVerify: Awaited<ReturnType<typeof verifyRecoveryConnector>>;
|
|
20
|
+
};
|
|
21
|
+
blockers: string[];
|
|
22
|
+
receiptId: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function argValue(name: string): string | undefined {
|
|
26
|
+
const index = process.argv.indexOf(name);
|
|
27
|
+
return index >= 0 ? process.argv[index + 1] : undefined;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function atomicJson(path: string, value: unknown): void {
|
|
31
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
32
|
+
const temporary = `${path}.${process.pid}.tmp`;
|
|
33
|
+
writeFileSync(temporary, `${JSON.stringify(value, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 });
|
|
34
|
+
renameSync(temporary, path);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export async function checkStableBaseline(controllerHomeInput?: string): Promise<BaselineReceipt> {
|
|
38
|
+
const controllerHome = resolveControllerHome(controllerHomeInput);
|
|
39
|
+
const config = loadRecoveryConfig(controllerHome);
|
|
40
|
+
const runtime = observeRuntimeStatus(controllerHome);
|
|
41
|
+
const connector = recoveryConnectorDescriptor(controllerHome);
|
|
42
|
+
const runtimeVerify = await verifyStableRuntime(config);
|
|
43
|
+
const connectorVerify = await verifyRecoveryConnector(controllerHome);
|
|
44
|
+
const blockers: string[] = [];
|
|
45
|
+
|
|
46
|
+
if (!runtime.running || !runtime.ready) blockers.push(`runtime_not_ready:${runtime.reasonCodes.join(',') || 'unknown'}`);
|
|
47
|
+
if (!runtimeVerify.ok) blockers.push('recovery_runtime_verify_failed');
|
|
48
|
+
if (!runtimeVerify.releases.coherent) blockers.push('runtime_release_not_coherent');
|
|
49
|
+
if (!connector.readyForChatGPT) blockers.push(...connector.warnings.map((warning) => `recovery_connector:${warning}`));
|
|
50
|
+
if (!connectorVerify.ok) blockers.push(...connectorVerify.failures.map((failure) => `recovery_connector_verify:${failure}`));
|
|
51
|
+
if (!connector.currentRelease) blockers.push('recovery_release_missing');
|
|
52
|
+
|
|
53
|
+
const observedAt = new Date().toISOString();
|
|
54
|
+
const identity = {
|
|
55
|
+
schemaVersion: 1,
|
|
56
|
+
controllerHome,
|
|
57
|
+
runtimeInstanceId: runtime.snapshot?.runtimeInstanceId,
|
|
58
|
+
runtimeRelease: runtimeVerify.releases.active?.revision,
|
|
59
|
+
runtimeManifest: runtimeVerify.releases.active?.manifestSha256,
|
|
60
|
+
runtimeToolSurfaceFingerprint: runtime.snapshot?.toolSurfaceFingerprint,
|
|
61
|
+
runtimeEndpoint: runtime.snapshot?.endpoint,
|
|
62
|
+
recoveryRelease: connector.currentRelease,
|
|
63
|
+
recoveryUrl: connector.url,
|
|
64
|
+
runtimeReady: runtime.ready,
|
|
65
|
+
runtimeVerifyOk: runtimeVerify.ok,
|
|
66
|
+
connectorVerifyOk: connectorVerify.ok,
|
|
67
|
+
};
|
|
68
|
+
const receiptId = createHash('sha256').update(JSON.stringify(identity)).digest('hex');
|
|
69
|
+
const receipt: BaselineReceipt = {
|
|
70
|
+
schemaVersion: 1,
|
|
71
|
+
status: blockers.length === 0 ? 'passed' : 'failed',
|
|
72
|
+
controllerHome,
|
|
73
|
+
observedAt,
|
|
74
|
+
runtime,
|
|
75
|
+
recovery: { connector, runtimeVerify, connectorVerify },
|
|
76
|
+
blockers,
|
|
77
|
+
receiptId,
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const root = join(controllerHome, 'recovery', 'stable-baseline');
|
|
81
|
+
atomicJson(join(root, `${receiptId}.json`), receipt);
|
|
82
|
+
atomicJson(join(root, 'latest.json'), receipt);
|
|
83
|
+
return receipt;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (import.meta.main) {
|
|
87
|
+
const explicit = argValue('--controller-home');
|
|
88
|
+
if (process.argv.includes('--controller-home') && !explicit) throw new Error('STABLE_BASELINE_CONTROLLER_HOME_REQUIRED');
|
|
89
|
+
const receipt = await checkStableBaseline(explicit);
|
|
90
|
+
process.stdout.write(`${JSON.stringify(receipt, null, 2)}\n`);
|
|
91
|
+
if (receipt.status !== 'passed') process.exitCode = 1;
|
|
92
|
+
}
|
|
@@ -161,7 +161,7 @@ plan_evidence_contract_error() {
|
|
|
161
161
|
fi
|
|
162
162
|
|
|
163
163
|
local label line value
|
|
164
|
-
for label in "State/progress path" "Verification evidence" "Evaluator rubric" "Stop condition" "Rollback surface"; do
|
|
164
|
+
for label in "State/progress path" "Verification evidence" "Impact review|Evaluator rubric" "Stop condition" "Rollback surface"; do
|
|
165
165
|
line="$(printf '%s\n' "$section" | grep -Ei "^[[:space:]]*-[[:space:]]*(\\*\\*)?${label}(\\*\\*)?[[:space:]]*:" | head -1 || true)"
|
|
166
166
|
if [[ -z "$line" ]]; then
|
|
167
167
|
echo "missing field: ${label}"
|
|
@@ -189,7 +189,7 @@ check_plan_template_evidence_contract() {
|
|
|
189
189
|
return
|
|
190
190
|
}
|
|
191
191
|
|
|
192
|
-
for label in "State/progress path" "Verification evidence" "
|
|
192
|
+
for label in "State/progress path" "Verification evidence" "Impact review" "Stop condition" "Rollback surface"; do
|
|
193
193
|
if ! grep -Eiq "^[[:space:]]*-[[:space:]]*(\\*\\*)?${label}(\\*\\*)?[[:space:]]*:" "$file"; then
|
|
194
194
|
report_issue "Plan template Evidence Contract is missing field '${label}': $file"
|
|
195
195
|
fi
|
|
@@ -668,11 +668,11 @@ check_helper_runtime_files() {
|
|
|
668
668
|
new-spec.sh new-sprint.sh new-plan.sh capture-plan.sh plan-to-todo.sh
|
|
669
669
|
contract-run.ts contract-worktree.sh ship-worktrees.sh archive-workflow.sh
|
|
670
670
|
refresh-current-status.sh prepare-handoff.sh verify-contract.sh summarize-failures.sh
|
|
671
|
-
verify-sprint.sh
|
|
671
|
+
verify-sprint.sh sprint-backlog.sh check-task-sync.sh check-deploy-sql-order.sh
|
|
672
672
|
check-architecture-sync.sh check-agent-tooling.sh check-context-files.sh
|
|
673
673
|
check-brain-manifest.sh sync-brain-docs.sh check-skill-version.ts
|
|
674
674
|
select-agent-context-blocks.sh ensure-task-workflow.sh check-task-workflow.sh
|
|
675
|
-
|
|
675
|
+
switch-plan.sh workflow-contract.ts
|
|
676
676
|
inspect-project-state.ts migrate-workflow-docs.ts migrate-project-template.sh
|
|
677
677
|
capability-resolver.ts architecture-event.ts capability-config.ts architecture-queue.sh
|
|
678
678
|
archive-architecture-request.sh context-contract-sync.sh workstream-sync.sh
|