swarm-orchestrator 14.0.2 → 14.2.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/CHANGELOG.md +390 -1
- package/README.md +217 -524
- package/dist/agent-escalation.js +74 -0
- package/dist/agent-escalation.js.map +1 -0
- package/dist/agent-prompt.js +55 -0
- package/dist/agent-prompt.js.map +1 -0
- package/dist/agent-run.js +350 -160
- package/dist/agent-run.js.map +1 -1
- package/dist/cli-bond-report.js +37 -0
- package/dist/cli-bond-report.js.map +1 -0
- package/dist/cli-bundle.js +64 -0
- package/dist/cli-bundle.js.map +1 -0
- package/dist/cli-calibrate.js +282 -0
- package/dist/cli-calibrate.js.map +1 -0
- package/dist/cli-ci.js +227 -0
- package/dist/cli-ci.js.map +1 -0
- package/dist/cli-command-definitions.js +134 -0
- package/dist/cli-command-definitions.js.map +1 -0
- package/dist/cli-evidence-summary.js +25 -0
- package/dist/cli-evidence-summary.js.map +1 -0
- package/dist/cli-gates.js +124 -0
- package/dist/cli-gates.js.map +1 -0
- package/dist/cli-init.js +175 -0
- package/dist/cli-init.js.map +1 -0
- package/dist/cli-model-default.js +107 -0
- package/dist/cli-model-default.js.map +1 -0
- package/dist/cli-model-preflight.js +18 -0
- package/dist/cli-model-preflight.js.map +1 -0
- package/dist/cli-options.js +104 -155
- package/dist/cli-options.js.map +1 -1
- package/dist/cli-parallel-output.js +158 -0
- package/dist/cli-parallel-output.js.map +1 -0
- package/dist/cli-parallel.js +585 -0
- package/dist/cli-parallel.js.map +1 -0
- package/dist/cli-preflight.js +33 -0
- package/dist/cli-preflight.js.map +1 -0
- package/dist/cli-provider-settings.js +21 -0
- package/dist/cli-provider-settings.js.map +1 -0
- package/dist/cli-run-commands.js +32 -23
- package/dist/cli-run-commands.js.map +1 -1
- package/dist/cli-run-report.js +63 -0
- package/dist/cli-run-report.js.map +1 -0
- package/dist/cli-run-settings.js +30 -0
- package/dist/cli-run-settings.js.map +1 -0
- package/dist/cli-runtime-inputs.js +25 -0
- package/dist/cli-runtime-inputs.js.map +1 -0
- package/dist/cli-select.js +23 -10
- package/dist/cli-select.js.map +1 -1
- package/dist/cli-session.js +286 -0
- package/dist/cli-session.js.map +1 -0
- package/dist/cli-task-contract.js +24 -0
- package/dist/cli-task-contract.js.map +1 -0
- package/dist/cli-task-cost.js +76 -0
- package/dist/cli-task-cost.js.map +1 -0
- package/dist/cli-task-goal.js +114 -0
- package/dist/cli-task-goal.js.map +1 -0
- package/dist/cli-terminal.js +103 -0
- package/dist/cli-terminal.js.map +1 -0
- package/dist/cli-verification-evidence.js +51 -0
- package/dist/cli-verification-evidence.js.map +1 -0
- package/dist/cli-verify-options.js +146 -0
- package/dist/cli-verify-options.js.map +1 -0
- package/dist/cli-verify.js +18 -0
- package/dist/cli-verify.js.map +1 -0
- package/dist/cli.js +259 -1376
- package/dist/cli.js.map +1 -1
- package/dist/config/approval-mode.js +26 -0
- package/dist/config/approval-mode.js.map +1 -0
- package/dist/config/init.js +67 -5
- package/dist/config/init.js.map +1 -1
- package/dist/config/interface-settings.js +7 -0
- package/dist/config/interface-settings.js.map +1 -0
- package/dist/config/node-harness.js +34 -0
- package/dist/config/node-harness.js.map +1 -0
- package/dist/config/package-discovery.js +50 -0
- package/dist/config/package-discovery.js.map +1 -0
- package/dist/config/settings.js +7 -0
- package/dist/config/settings.js.map +1 -1
- package/dist/config/swarm-toml.js +16 -3
- package/dist/config/swarm-toml.js.map +1 -1
- package/dist/core/compaction.js +29 -27
- package/dist/core/compaction.js.map +1 -1
- package/dist/core/degenerate-output.js +44 -0
- package/dist/core/degenerate-output.js.map +1 -0
- package/dist/core/loop.js +166 -18
- package/dist/core/loop.js.map +1 -1
- package/dist/core/model-cancellation.js +17 -0
- package/dist/core/model-cancellation.js.map +1 -0
- package/dist/core/model-client.js.map +1 -1
- package/dist/core/termination.js.map +1 -1
- package/dist/durable/controller-location.js +30 -0
- package/dist/durable/controller-location.js.map +1 -0
- package/dist/durable/legacy-run-store.js +86 -0
- package/dist/durable/legacy-run-store.js.map +1 -0
- package/dist/durable/recovery-context.js +179 -0
- package/dist/durable/recovery-context.js.map +1 -0
- package/dist/durable/run-journal.js +161 -0
- package/dist/durable/run-journal.js.map +1 -0
- package/dist/durable/run-store.js +203 -200
- package/dist/durable/run-store.js.map +1 -1
- package/dist/durable/session-evidence.js +21 -0
- package/dist/durable/session-evidence.js.map +1 -0
- package/dist/eval/agent-session.js +146 -0
- package/dist/eval/agent-session.js.map +1 -0
- package/dist/eval/arm-dispatch.js +33 -0
- package/dist/eval/arm-dispatch.js.map +1 -0
- package/dist/eval/arms.js +13 -5
- package/dist/eval/arms.js.map +1 -1
- package/dist/eval/campaign-history.js +48 -0
- package/dist/eval/campaign-history.js.map +1 -0
- package/dist/eval/campaign-record.js +232 -0
- package/dist/eval/campaign-record.js.map +1 -0
- package/dist/eval/campaign-run.js +30 -14
- package/dist/eval/campaign-run.js.map +1 -1
- package/dist/eval/deadline-overshoot.js +73 -0
- package/dist/eval/deadline-overshoot.js.map +1 -0
- package/dist/eval/empty-patch-attribution.js +19 -0
- package/dist/eval/empty-patch-attribution.js.map +1 -0
- package/dist/eval/endpoint-health.js +126 -0
- package/dist/eval/endpoint-health.js.map +1 -0
- package/dist/eval/false-green-rate.js +133 -0
- package/dist/eval/false-green-rate.js.map +1 -0
- package/dist/eval/feedback-study-analysis.js +747 -0
- package/dist/eval/feedback-study-analysis.js.map +1 -0
- package/dist/eval/feedback-study-report.js +156 -0
- package/dist/eval/feedback-study-report.js.map +1 -0
- package/dist/eval/feedback-study.js +854 -0
- package/dist/eval/feedback-study.js.map +1 -0
- package/dist/eval/first-run-observation.js +105 -0
- package/dist/eval/first-run-observation.js.map +1 -0
- package/dist/eval/frozen-campaign.js +127 -0
- package/dist/eval/frozen-campaign.js.map +1 -0
- package/dist/eval/goal-campaign-report.js +143 -0
- package/dist/eval/goal-campaign-report.js.map +1 -0
- package/dist/eval/goal-observation.js +50 -0
- package/dist/eval/goal-observation.js.map +1 -0
- package/dist/eval/goal-protocol.js +104 -0
- package/dist/eval/goal-protocol.js.map +1 -0
- package/dist/eval/known-total.js +7 -0
- package/dist/eval/known-total.js.map +1 -0
- package/dist/eval/npm-failure.js +24 -0
- package/dist/eval/npm-failure.js.map +1 -0
- package/dist/eval/oracle-challenge.js +80 -0
- package/dist/eval/oracle-challenge.js.map +1 -0
- package/dist/eval/oracle-filter.js +74 -7
- package/dist/eval/oracle-filter.js.map +1 -1
- package/dist/eval/patch-metrics.js +74 -0
- package/dist/eval/patch-metrics.js.map +1 -0
- package/dist/eval/pr-task-judge.js +241 -0
- package/dist/eval/pr-task-judge.js.map +1 -0
- package/dist/eval/pr-task-paths.js +26 -0
- package/dist/eval/pr-task-paths.js.map +1 -0
- package/dist/eval/protocol-fixture.js +97 -0
- package/dist/eval/protocol-fixture.js.map +1 -0
- package/dist/eval/protocol.js +80 -0
- package/dist/eval/protocol.js.map +1 -0
- package/dist/eval/reach-pressure-analysis.js +507 -0
- package/dist/eval/reach-pressure-analysis.js.map +1 -0
- package/dist/eval/reach-pressure-derivation.js +201 -0
- package/dist/eval/reach-pressure-derivation.js.map +1 -0
- package/dist/eval/reach-pressure-report.js +266 -0
- package/dist/eval/reach-pressure-report.js.map +1 -0
- package/dist/eval/reach-pressure.js +645 -0
- package/dist/eval/reach-pressure.js.map +1 -0
- package/dist/eval/repair-progress.js +109 -0
- package/dist/eval/repair-progress.js.map +1 -0
- package/dist/eval/sealed-workspace.js +61 -0
- package/dist/eval/sealed-workspace.js.map +1 -0
- package/dist/eval/security-corpus.js +139 -0
- package/dist/eval/security-corpus.js.map +1 -0
- package/dist/eval/statistics.js +187 -0
- package/dist/eval/statistics.js.map +1 -1
- package/dist/eval/task-difficulty.js +28 -0
- package/dist/eval/task-difficulty.js.map +1 -0
- package/dist/eval/task-identity.js +0 -0
- package/dist/eval/task-identity.js.map +1 -0
- package/dist/eval/test-case-split.js +56 -5
- package/dist/eval/test-case-split.js.map +1 -1
- package/dist/eval/verification-closure.js +56 -0
- package/dist/eval/verification-closure.js.map +1 -0
- package/dist/evidence/acceptance-contract.js +34 -0
- package/dist/evidence/acceptance-contract.js.map +1 -0
- package/dist/evidence/attestation.js +63 -10
- package/dist/evidence/attestation.js.map +1 -1
- package/dist/evidence/behavior-check.js +93 -0
- package/dist/evidence/behavior-check.js.map +1 -0
- package/dist/evidence/blob-manifest.js +5 -1
- package/dist/evidence/blob-manifest.js.map +1 -1
- package/dist/evidence/browser-execution.js +12 -0
- package/dist/evidence/browser-execution.js.map +1 -0
- package/dist/evidence/bundle-manifest.js +4 -0
- package/dist/evidence/bundle-manifest.js.map +1 -1
- package/dist/evidence/bundle.js +36 -4
- package/dist/evidence/bundle.js.map +1 -1
- package/dist/evidence/canonical-json.js +1 -1
- package/dist/evidence/canonical-json.js.map +1 -1
- package/dist/evidence/ci-summary.js +58 -0
- package/dist/evidence/ci-summary.js.map +1 -0
- package/dist/evidence/frozen-json.js +10 -0
- package/dist/evidence/frozen-json.js.map +1 -0
- package/dist/evidence/goal-contract.js +90 -0
- package/dist/evidence/goal-contract.js.map +1 -0
- package/dist/evidence/ledger-file.js +45 -0
- package/dist/evidence/ledger-file.js.map +1 -0
- package/dist/evidence/ledger-record.js +28 -0
- package/dist/evidence/ledger-record.js.map +1 -1
- package/dist/evidence/ledger.js +19 -9
- package/dist/evidence/ledger.js.map +1 -1
- package/dist/evidence/model-call-recording.js +32 -5
- package/dist/evidence/model-call-recording.js.map +1 -1
- package/dist/evidence/predicate-catalogue.js +219 -0
- package/dist/evidence/predicate-catalogue.js.map +1 -1
- package/dist/evidence/record-kind.js +2 -0
- package/dist/evidence/record-kind.js.map +1 -1
- package/dist/evidence/replay.js +14 -0
- package/dist/evidence/replay.js.map +1 -1
- package/dist/evidence/routine-claims.js +38 -0
- package/dist/evidence/routine-claims.js.map +1 -0
- package/dist/evidence/run-assessment.js +131 -0
- package/dist/evidence/run-assessment.js.map +1 -0
- package/dist/evidence/run-spec.js +19 -4
- package/dist/evidence/run-spec.js.map +1 -1
- package/dist/evidence/scrub.js +1 -0
- package/dist/evidence/scrub.js.map +1 -1
- package/dist/evidence/session.js +8 -1
- package/dist/evidence/session.js.map +1 -1
- package/dist/evidence/signer-trust.js.map +1 -1
- package/dist/evidence/signing.js +14 -6
- package/dist/evidence/signing.js.map +1 -1
- package/dist/evidence/task-contract.js +120 -0
- package/dist/evidence/task-contract.js.map +1 -0
- package/dist/evidence/task-preset.js +52 -0
- package/dist/evidence/task-preset.js.map +1 -0
- package/dist/evidence/transcript.js +89 -0
- package/dist/evidence/transcript.js.map +1 -0
- package/dist/evidence/verdict.js +62 -2
- package/dist/evidence/verdict.js.map +1 -1
- package/dist/evidence/verifier/behavior.d.mts +5 -0
- package/dist/evidence/verifier/behavior.mjs +161 -0
- package/dist/evidence/verifier/controller.d.mts +15 -0
- package/dist/evidence/verifier/controller.mjs +751 -0
- package/dist/evidence/verifier/rederive.d.mts +44 -1
- package/dist/evidence/verifier/rederive.mjs +253 -49
- package/dist/evidence/verifier/status.d.mts +9 -0
- package/dist/evidence/verifier/status.mjs +157 -0
- package/dist/evidence/verifier/upgrade.d.mts +6 -0
- package/dist/evidence/verifier/upgrade.mjs +80 -0
- package/dist/evidence/verifier/verify.d.mts +8 -1
- package/dist/evidence/verifier/verify.mjs +885 -13
- package/dist/evidence/verify-report.js +25 -8
- package/dist/evidence/verify-report.js.map +1 -1
- package/dist/exec/child-environment.js +40 -0
- package/dist/exec/child-environment.js.map +1 -1
- package/dist/exec/container-backend.js +138 -35
- package/dist/exec/container-backend.js.map +1 -1
- package/dist/exec/container-image.js +7 -0
- package/dist/exec/container-image.js.map +1 -0
- package/dist/exec/controlled-network.js +39 -0
- package/dist/exec/controlled-network.js.map +1 -0
- package/dist/exec/execution-mode.js +46 -19
- package/dist/exec/execution-mode.js.map +1 -1
- package/dist/exec/isolation-option.js +3 -1
- package/dist/exec/isolation-option.js.map +1 -1
- package/dist/exec/resource-pool.js +47 -0
- package/dist/exec/resource-pool.js.map +1 -0
- package/dist/exec/run-cancellation.js +2 -1
- package/dist/exec/run-cancellation.js.map +1 -1
- package/dist/exec/run-process.js +31 -10
- package/dist/exec/run-process.js.map +1 -1
- package/dist/exec/runtime-resource.js +93 -0
- package/dist/exec/runtime-resource.js.map +1 -0
- package/dist/exec/task-contract-enforcement.js +28 -0
- package/dist/exec/task-contract-enforcement.js.map +1 -0
- package/dist/gates/acceptance-package.js +75 -0
- package/dist/gates/acceptance-package.js.map +1 -0
- package/dist/gates/auto-resolve.js +18 -0
- package/dist/gates/auto-resolve.js.map +1 -1
- package/dist/gates/behavior-artifacts.js +88 -0
- package/dist/gates/behavior-artifacts.js.map +1 -0
- package/dist/gates/behavior-check.js +144 -0
- package/dist/gates/behavior-check.js.map +1 -0
- package/dist/gates/browser-instrument-runner.mjs +80 -0
- package/dist/gates/browser-instrument.js +33 -0
- package/dist/gates/browser-instrument.js.map +1 -0
- package/dist/gates/browser-results.js +75 -0
- package/dist/gates/browser-results.js.map +1 -0
- package/dist/gates/certification.js +65 -0
- package/dist/gates/certification.js.map +1 -0
- package/dist/gates/change-source.js +150 -0
- package/dist/gates/change-source.js.map +1 -0
- package/dist/gates/contract-executor.js +81 -0
- package/dist/gates/contract-executor.js.map +1 -0
- package/dist/gates/contract-scope.js +21 -0
- package/dist/gates/contract-scope.js.map +1 -0
- package/dist/gates/contract-verification.js +51 -0
- package/dist/gates/contract-verification.js.map +1 -0
- package/dist/gates/default-gates.js +19 -152
- package/dist/gates/default-gates.js.map +1 -1
- package/dist/gates/dependency-install.js +181 -0
- package/dist/gates/dependency-install.js.map +1 -0
- package/dist/gates/engine.js +13 -2
- package/dist/gates/engine.js.map +1 -1
- package/dist/gates/environment-preflight.js +108 -0
- package/dist/gates/environment-preflight.js.map +1 -0
- package/dist/gates/file-set-tool.js +57 -13
- package/dist/gates/file-set-tool.js.map +1 -1
- package/dist/gates/file-set.js +105 -9
- package/dist/gates/file-set.js.map +1 -1
- package/dist/gates/gate-command.js +69 -0
- package/dist/gates/gate-command.js.map +1 -0
- package/dist/gates/gate-definition.js.map +1 -1
- package/dist/gates/gate-runner.js +50 -45
- package/dist/gates/gate-runner.js.map +1 -1
- package/dist/gates/gate-set-seal.js +11 -1
- package/dist/gates/gate-set-seal.js.map +1 -1
- package/dist/gates/git-workspace.js +18 -2
- package/dist/gates/git-workspace.js.map +1 -1
- package/dist/gates/github-source.js +44 -0
- package/dist/gates/github-source.js.map +1 -0
- package/dist/gates/goal-acceptance.js +167 -0
- package/dist/gates/goal-acceptance.js.map +1 -0
- package/dist/gates/goal-checkout.js +109 -0
- package/dist/gates/goal-checkout.js.map +1 -0
- package/dist/gates/goal-effects.js +38 -0
- package/dist/gates/goal-effects.js.map +1 -0
- package/dist/gates/http-check-runner.mjs +96 -0
- package/dist/gates/independent-checks.js +34 -0
- package/dist/gates/independent-checks.js.map +1 -0
- package/dist/gates/independent-verification.js +623 -97
- package/dist/gates/independent-verification.js.map +1 -1
- package/dist/gates/inspection-gates.js +25 -3
- package/dist/gates/inspection-gates.js.map +1 -1
- package/dist/gates/measure-snapshot.js +5 -0
- package/dist/gates/measure-snapshot.js.map +1 -1
- package/dist/gates/mutant-parse.js +47 -0
- package/dist/gates/mutant-parse.js.map +1 -0
- package/dist/gates/mutant-witness.js +99 -0
- package/dist/gates/mutant-witness.js.map +1 -0
- package/dist/gates/node-command-runner.js +67 -6
- package/dist/gates/node-command-runner.js.map +1 -1
- package/dist/gates/node-gates.js +91 -0
- package/dist/gates/node-gates.js.map +1 -0
- package/dist/gates/node-test-command.js +91 -23
- package/dist/gates/node-test-command.js.map +1 -1
- package/dist/gates/oracle-bond-run.js +128 -0
- package/dist/gates/oracle-bond-run.js.map +1 -0
- package/dist/gates/oracle-bond.js +49 -0
- package/dist/gates/oracle-bond.js.map +1 -0
- package/dist/gates/oracle-instrumentation.js +115 -0
- package/dist/gates/oracle-instrumentation.js.map +1 -0
- package/dist/gates/oracle-mutants.js +628 -0
- package/dist/gates/oracle-mutants.js.map +1 -0
- package/dist/gates/oracle-reach.js +175 -0
- package/dist/gates/oracle-reach.js.map +1 -0
- package/dist/gates/package-scope.js +115 -0
- package/dist/gates/package-scope.js.map +1 -0
- package/dist/gates/parsers.js +3 -0
- package/dist/gates/parsers.js.map +1 -1
- package/dist/gates/prepare-dependencies.js +35 -0
- package/dist/gates/prepare-dependencies.js.map +1 -0
- package/dist/gates/prepared-python.js +92 -0
- package/dist/gates/prepared-python.js.map +1 -0
- package/dist/gates/preset-verification.js +65 -0
- package/dist/gates/preset-verification.js.map +1 -0
- package/dist/gates/project-environment.js +59 -0
- package/dist/gates/project-environment.js.map +1 -0
- package/dist/gates/project-type.js +79 -15
- package/dist/gates/project-type.js.map +1 -1
- package/dist/gates/python-gates.js +67 -0
- package/dist/gates/python-gates.js.map +1 -0
- package/dist/gates/ratchet.js +6 -1
- package/dist/gates/ratchet.js.map +1 -1
- package/dist/gates/repair-policy.js +64 -0
- package/dist/gates/repair-policy.js.map +1 -0
- package/dist/gates/resolved-path.js +21 -0
- package/dist/gates/resolved-path.js.map +1 -0
- package/dist/gates/runner-results.js +77 -0
- package/dist/gates/runner-results.js.map +1 -0
- package/dist/gates/scratch-index.js +14 -1
- package/dist/gates/scratch-index.js.map +1 -1
- package/dist/gates/structured-runner.js +37 -0
- package/dist/gates/structured-runner.js.map +1 -0
- package/dist/gates/upgrade-contract.js +81 -0
- package/dist/gates/upgrade-contract.js.map +1 -0
- package/dist/gates/upgrade-resolution.js +56 -0
- package/dist/gates/upgrade-resolution.js.map +1 -0
- package/dist/gates/v8-coverage.js +142 -0
- package/dist/gates/v8-coverage.js.map +1 -0
- package/dist/install/health.js +26 -0
- package/dist/install/health.js.map +1 -1
- package/dist/node-floor-check.js +12 -0
- package/dist/node-floor-check.js.map +1 -0
- package/dist/node-floor.js +32 -13
- package/dist/node-floor.js.map +1 -1
- package/dist/providers/ai-sdk-model-client.js +32 -2
- package/dist/providers/ai-sdk-model-client.js.map +1 -1
- package/dist/providers/registry.js +8 -4
- package/dist/providers/registry.js.map +1 -1
- package/dist/select/calibration-measures.js +17 -3
- package/dist/select/calibration-measures.js.map +1 -1
- package/dist/select/calibration-run.js +1 -1
- package/dist/select/calibration-run.js.map +1 -1
- package/dist/select/production-routing.js +66 -0
- package/dist/select/production-routing.js.map +1 -0
- package/dist/select/recommendation.js +10 -0
- package/dist/select/recommendation.js.map +1 -1
- package/dist/select/routing-candidates.js +29 -0
- package/dist/select/routing-candidates.js.map +1 -0
- package/dist/select/routing-mode.js +10 -5
- package/dist/select/routing-mode.js.map +1 -1
- package/dist/select/served-pick.js +36 -0
- package/dist/select/served-pick.js.map +1 -0
- package/dist/select/task-cost.js +10 -3
- package/dist/select/task-cost.js.map +1 -1
- package/dist/select/ucb.js +4 -3
- package/dist/select/ucb.js.map +1 -1
- package/dist/swarm-verify.js +51 -0
- package/dist/swarm-verify.js.map +1 -0
- package/dist/task-brief.js +20 -0
- package/dist/task-brief.js.map +1 -0
- package/dist/tools/bounded-file.js +66 -0
- package/dist/tools/bounded-file.js.map +1 -0
- package/dist/tools/chokepoint-record.js +16 -2
- package/dist/tools/chokepoint-record.js.map +1 -1
- package/dist/tools/chokepoint.js +45 -3
- package/dist/tools/chokepoint.js.map +1 -1
- package/dist/tools/claim-reference-tool.js +17 -0
- package/dist/tools/claim-reference-tool.js.map +1 -0
- package/dist/tools/file-tools.js +18 -10
- package/dist/tools/file-tools.js.map +1 -1
- package/dist/tools/policy-guard.js +25 -2
- package/dist/tools/policy-guard.js.map +1 -1
- package/dist/tools/regex-worker.js +63 -0
- package/dist/tools/regex-worker.js.map +1 -0
- package/dist/tools/search-tool.js +57 -30
- package/dist/tools/search-tool.js.map +1 -1
- package/dist/tools/shell-command.js +47 -1
- package/dist/tools/shell-command.js.map +1 -1
- package/dist/tools/shell-tool.js +19 -5
- package/dist/tools/shell-tool.js.map +1 -1
- package/dist/tools/tool-definition.js +1 -1
- package/dist/tools/tool-definition.js.map +1 -1
- package/dist/tui/confirmation-queue.js +6 -6
- package/dist/tui/confirmation-queue.js.map +1 -1
- package/dist/tui/controller-screen-model.js +28 -0
- package/dist/tui/controller-screen-model.js.map +1 -0
- package/dist/tui/controller-screen.js +17 -0
- package/dist/tui/controller-screen.js.map +1 -0
- package/dist/tui/elapsed.js +13 -0
- package/dist/tui/elapsed.js.map +1 -1
- package/dist/tui/evidence-panel.js +72 -12
- package/dist/tui/evidence-panel.js.map +1 -1
- package/dist/tui/glyphs.js +23 -0
- package/dist/tui/glyphs.js.map +1 -0
- package/dist/tui/hyperlink.js +38 -0
- package/dist/tui/hyperlink.js.map +1 -0
- package/dist/tui/key-bindings.js +2 -0
- package/dist/tui/key-bindings.js.map +1 -1
- package/dist/tui/key-dispatcher.js +5 -2
- package/dist/tui/key-dispatcher.js.map +1 -1
- package/dist/tui/layout.js +3 -1
- package/dist/tui/layout.js.map +1 -1
- package/dist/tui/plain-lines.js +2 -0
- package/dist/tui/plain-lines.js.map +1 -1
- package/dist/tui/screen-model.js +127 -24
- package/dist/tui/screen-model.js.map +1 -1
- package/dist/tui/screen.js +5 -3
- package/dist/tui/screen.js.map +1 -1
- package/dist/tui/session-interface.js +23 -5
- package/dist/tui/session-interface.js.map +1 -1
- package/dist/tui/session-store.js +3 -3
- package/dist/tui/session-store.js.map +1 -1
- package/dist/tui/session-view.js +20 -0
- package/dist/tui/session-view.js.map +1 -1
- package/dist/workers/bootstrap-history.js +66 -0
- package/dist/workers/bootstrap-history.js.map +1 -0
- package/dist/workers/bootstrap-schema.js +48 -0
- package/dist/workers/bootstrap-schema.js.map +1 -0
- package/dist/workers/bootstrap.js +257 -0
- package/dist/workers/bootstrap.js.map +1 -0
- package/dist/workers/controller-administration.js +80 -0
- package/dist/workers/controller-administration.js.map +1 -0
- package/dist/workers/controller-cleanup.js +16 -0
- package/dist/workers/controller-cleanup.js.map +1 -0
- package/dist/workers/controller-configuration.js +94 -0
- package/dist/workers/controller-configuration.js.map +1 -0
- package/dist/workers/controller-events.js +99 -0
- package/dist/workers/controller-events.js.map +1 -0
- package/dist/workers/controller-jobs.js +225 -0
- package/dist/workers/controller-jobs.js.map +1 -0
- package/dist/workers/controller-launch.js +87 -0
- package/dist/workers/controller-launch.js.map +1 -0
- package/dist/workers/controller-owner.js +65 -0
- package/dist/workers/controller-owner.js.map +1 -0
- package/dist/workers/controller-recovery.js +344 -0
- package/dist/workers/controller-recovery.js.map +1 -0
- package/dist/workers/controller-revisions.js +171 -0
- package/dist/workers/controller-revisions.js.map +1 -0
- package/dist/workers/controller-schedule.js +18 -0
- package/dist/workers/controller-schedule.js.map +1 -0
- package/dist/workers/controller-scheduler.js +282 -0
- package/dist/workers/controller-scheduler.js.map +1 -0
- package/dist/workers/controller-scope.js +59 -0
- package/dist/workers/controller-scope.js.map +1 -0
- package/dist/workers/controller-state.js +457 -0
- package/dist/workers/controller-state.js.map +1 -0
- package/dist/workers/controller-verification.js +41 -0
- package/dist/workers/controller-verification.js.map +1 -0
- package/dist/workers/controller-view.js +136 -0
- package/dist/workers/controller-view.js.map +1 -0
- package/dist/workers/coordination.js +165 -0
- package/dist/workers/coordination.js.map +1 -0
- package/dist/workers/goal-candidates.js +92 -0
- package/dist/workers/goal-candidates.js.map +1 -0
- package/dist/workers/goal-outcome.js +102 -0
- package/dist/workers/goal-outcome.js.map +1 -0
- package/dist/workers/goal-repair.js +103 -0
- package/dist/workers/goal-repair.js.map +1 -0
- package/dist/workers/goal-selection.js +81 -0
- package/dist/workers/goal-selection.js.map +1 -0
- package/dist/workers/graph-record.js +1 -3
- package/dist/workers/graph-record.js.map +1 -1
- package/dist/workers/graph-revision.js +286 -0
- package/dist/workers/graph-revision.js.map +1 -0
- package/dist/workers/merge-queue.js +47 -6
- package/dist/workers/merge-queue.js.map +1 -1
- package/dist/workers/parallel-report.js +12 -1
- package/dist/workers/parallel-report.js.map +1 -1
- package/dist/workers/parallel-run.js +439 -201
- package/dist/workers/parallel-run.js.map +1 -1
- package/dist/workers/planner-run.js +61 -15
- package/dist/workers/planner-run.js.map +1 -1
- package/dist/workers/run-context.js +204 -0
- package/dist/workers/run-context.js.map +1 -0
- package/dist/workers/task-contract.js +15 -80
- package/dist/workers/task-contract.js.map +1 -1
- package/dist/workers/worktree.js +69 -28
- package/dist/workers/worktree.js.map +1 -1
- package/docs/README.md +5 -0
- package/docs/build-guide.md +49 -10
- package/docs/claims.md +20 -0
- package/docs/security-coverage.md +40 -0
- package/package.json +11 -5
package/README.md
CHANGED
|
@@ -1,554 +1,247 @@
|
|
|
1
|
-
|
|
1
|
+
<a id="readme-top"></a>
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
[](https://github.com/moonrunnerkc/swarm-orchestrator/actions/workflows/nightly-proof.yml)
|
|
5
|
-
[](https://github.com/moonrunnerkc/swarm-orchestrator/actions/workflows/weekly-evidence.yml)
|
|
6
|
-
[](https://www.npmjs.com/package/swarm-orchestrator)
|
|
7
|
-
[](package.json)
|
|
8
|
-
[](LICENSE)
|
|
3
|
+
<div align="center">
|
|
9
4
|
|
|
10
|
-
|
|
5
|
+
<h1>swarm-orchestrator</h1>
|
|
11
6
|
|
|
12
|
-
|
|
13
|
-
and it will tell you what that patch actually establishes. Either way what comes back is a
|
|
14
|
-
signed, hash-chained record of what ran, what passed, and what nobody measured, which anybody
|
|
15
|
-
can check without installing this tool.
|
|
7
|
+
<p><strong>A coding agent for the terminal that leaves a signed, offline-checkable record of what it ran and what passed.</strong></p>
|
|
16
8
|
|
|
17
|
-
|
|
18
|
-
|
|
9
|
+
<p>
|
|
10
|
+
The model can say whatever it likes.<br />
|
|
11
|
+
It cannot make a check pass, mark a claim verified, or change a record after the fact.
|
|
12
|
+
</p>
|
|
19
13
|
|
|
20
|
-
|
|
14
|
+
<p>
|
|
15
|
+
<a href="docs/README.md"><strong>Explore the docs »</strong></a>
|
|
16
|
+
·
|
|
17
|
+
<a href="docs/evidence/2026-08-18/live-tasks.md">See a real run</a>
|
|
18
|
+
·
|
|
19
|
+
<a href="https://github.com/moonrunnerkc/swarm-orchestrator/issues/new?labels=bug">Report a bug</a>
|
|
20
|
+
</p>
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
[](https://github.com/moonrunnerkc/swarm-orchestrator/actions/workflows/gates.yml)
|
|
23
|
+
[](https://www.npmjs.com/package/swarm-orchestrator)
|
|
24
|
+
[](package.json)
|
|
25
|
+
[](LICENSE)
|
|
23
26
|
|
|
24
|
-
|
|
27
|
+
</div>
|
|
25
28
|
|
|
26
|
-
|
|
27
|
-
intends to touch, edits through a chokepoint that records every tool call, runs your gates, and
|
|
28
|
-
retries failures under a numeric ratchet that refuses a fix which trades away tests, assertions
|
|
29
|
-
or coverage. Then it exports the evidence.
|
|
29
|
+
---
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
the producing tree cannot reach, applies the patch there, and runs the checks in that checkout.
|
|
33
|
-
Nothing the producer said travels except the patch. It reads another agent's own event stream
|
|
34
|
-
beside it if you have one.
|
|
31
|
+
## What it is
|
|
35
32
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
`swarm` takes a task and a git repository, makes a bounded change, runs your project's checks
|
|
34
|
+
over it, and writes a record of every command it ran and every check that passed or failed.
|
|
35
|
+
The record is a hash-chained ledger, exported as a signed bundle that carries its own
|
|
36
|
+
dependency-free verifier, so anyone can check it later with nothing but Node and without
|
|
37
|
+
trusting the machine that produced it.
|
|
40
38
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
[`installed-package-run.md`](docs/evidence/2026-08-23/installed-package-run.md).
|
|
39
|
+
It is for two kinds of people. Engineers who want an agent to make a change and want to review
|
|
40
|
+
what it did from evidence rather than from the agent's own summary. And reviewers who are handed
|
|
41
|
+
somebody else's patch or bundle and need to check it without installing the agent or believing
|
|
42
|
+
its author.
|
|
46
43
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
npm install -g swarm-orchestrator
|
|
50
|
-
|
|
51
|
-
That is **14.0.2**, and it leaves `swarm` on your path.
|
|
52
|
-
|
|
53
|
-
Installing from a tag works too, but only into a project rather than globally:
|
|
54
|
-
|
|
55
|
-
npm install github:moonrunnerkc/swarm-orchestrator#v14.0.2
|
|
56
|
-
|
|
57
|
-
`dist/` is not committed, so a git ref builds itself on install and needs this package's
|
|
58
|
-
devDependencies to do it. npm does not install those when a git ref is installed with `-g`: it
|
|
59
|
-
carries the global context into its git-dependency preparation, places the clone as a root
|
|
60
|
-
package, and runs the build without the compiler. The published package needs no build, which
|
|
61
|
-
is why the line above it is the one to use.
|
|
62
|
-
|
|
63
|
-
Anything below 13 is a different program. This package name carried a pull-request auditor
|
|
64
|
-
through 12.x, and `npm install -g swarm-orchestrator@12` still installs it, so pin the major if
|
|
65
|
-
you depend on one or the other: [Upgrading from v12](#upgrading-from-v12).
|
|
66
|
-
|
|
67
|
-
If `swarm` turns out to be an older version than you installed, something else owns the command.
|
|
68
|
-
The usual cause is a development checkout linked into the global prefix with `npm link`, which
|
|
69
|
-
owns it until it is removed and which npm cannot install over: the install either fails renaming
|
|
70
|
-
a symlinked directory aside, or succeeds behind a stale executable still pointing at the
|
|
71
|
-
checkout. `swarm doctor` says which of those happened and `swarm doctor --fix` repairs it.
|
|
72
|
-
|
|
73
|
-
Node 24 or newer. That is a runtime floor rather than a preference: the coverage cycle
|
|
74
|
-
spawns the test runner with `--test-isolation=process`, which Node 22 rejects as a bad
|
|
75
|
-
option, so on anything older that measurement does not happen.
|
|
76
|
-
|
|
77
|
-
## Use
|
|
78
|
-
|
|
79
|
-
swarm "make slugify collapse whitespace and strip punctuation"
|
|
80
|
-
|
|
81
|
-
swarm # a session: type tasks, one after another
|
|
82
|
-
swarm doctor # what owns the swarm command, and --fix to repair it
|
|
83
|
-
swarm init # write swarm.toml from package.json's scripts
|
|
84
|
-
swarm gates # run the gates over a workspace, no model
|
|
85
|
-
--allowed-files <a,b> # the scope you authorise, for the file-set check
|
|
86
|
-
swarm select # probe this machine, recommend a local model
|
|
87
|
-
swarm calibrate # measure candidate models on the golden set
|
|
88
|
-
swarm routing # what the reward log adds up to
|
|
89
|
-
swarm parallel --tasks <file> # a worker per task, then a merge queue
|
|
90
|
-
swarm parallel --goal <text> # break the goal into tasks, then run them
|
|
91
|
-
--redundancy <n> # try each task n ways, land the best of them
|
|
92
|
-
--concurrency <n> # how many workers may hold a worktree at once
|
|
93
|
-
|
|
94
|
-
swarm ci --patch <file> # verify a patch in a fresh checkout of the base
|
|
95
|
-
--immutable <a,b> # paths the patch may not touch
|
|
96
|
-
--agent-stream <file> # another agent's event stream, read beside it
|
|
97
|
-
--agent-format claude-code # or generic
|
|
98
|
-
swarm verify <bundle> # check a bundle, and who signed it
|
|
99
|
-
--signer <fingerprint> # the identity you expect, from outside the bundle
|
|
100
|
-
swarm review <bundle> # what a past run produced, and open it
|
|
101
|
-
swarm replay <bundle> # read a bundle back
|
|
102
|
-
|
|
103
|
-
swarm list-runs # runs this machine has state for
|
|
104
|
-
swarm inspect <run-id> # what a run did, and what it still owes
|
|
105
|
-
swarm resume <run-id> # take up a run that was interrupted
|
|
106
|
-
swarm retry-step <run-id> <step> # run one step again
|
|
107
|
-
swarm abort <run-id> # stop a run and refuse it new work
|
|
108
|
-
swarm repair <run-id> # release what a dead run left held
|
|
109
|
-
swarm gc [--older-than 30d] # what stored evidence would be removed, --remove to do it
|
|
110
|
-
|
|
111
|
-
swarm --isolation docker "..." # run commands behind a kernel-enforced boundary
|
|
112
|
-
swarm --json "..." # line-delimited JSON: one line per event, one result
|
|
113
|
-
swarm --no-tui "..." # plain lines even on a terminal
|
|
114
|
-
swarm --no-color "..." # no colour, whatever the terminal says
|
|
115
|
-
swarm --open-evidence "..." # open the review page when it finishes
|
|
116
|
-
swarm --model local:<id> "..." # a specific model
|
|
117
|
-
swarm --workspace <dir> "..." # a repository other than the current directory
|
|
118
|
-
swarm --base <ref> "..." # what the diff and the ratchet measure against
|
|
119
|
-
swarm --attempts <n> "..." # how many times the ratchet may retry a gate
|
|
120
|
-
swarm --max-steps <n> "..." # how long the loop may run before it stops
|
|
121
|
-
swarm --max-wall-minutes <n> "..." # the whole run's clock: the loop and every retry together
|
|
122
|
-
swarm --local-endpoint <url> # an OpenAI-compatible server other than the default
|
|
123
|
-
|
|
124
|
-
`swarm --help` prints all of it, including the calibration flags.
|
|
125
|
-
|
|
126
|
-
Set `ANTHROPIC_API_KEY`, `OPENAI_API_KEY` or `GOOGLE_GENERATIVE_AI_API_KEY` for a frontier
|
|
127
|
-
model, or start Ollama or rapid-mlx and pass `--model local:<id>`. With no model named, the
|
|
128
|
-
router picks one from what the calibration measured on this machine, and `swarm routing` shows
|
|
129
|
-
what it has learned. Keys come from the environment or your OS keychain and have no
|
|
130
|
-
`swarm.toml` setting: that file is committed and cloned, so a key in it has already been shared
|
|
131
|
-
with everyone holding the repository, and a file naming one is refused with rotation guidance.
|
|
132
|
-
|
|
133
|
-
Settings live in one optional `swarm.toml`: providers and endpoints, gate definitions, budgets,
|
|
134
|
-
model pins, and the `[interface]`, `[theme]` and `[keys]` tables. Flags win over the file.
|
|
135
|
-
|
|
136
|
-
Two of those are worth knowing about before you need them.
|
|
137
|
-
|
|
138
|
-
[providers]
|
|
139
|
-
local_thinking = false # the model behind the local endpoint answers without reasoning first
|
|
140
|
-
|
|
141
|
-
[interface]
|
|
142
|
-
confirm_timeout_minutes = 30 # an unanswered confirmation refuses itself; 0 waits for ever
|
|
143
|
-
|
|
144
|
-
`local_thinking` matters on a reasoning model served locally. Left unset, nothing is sent and
|
|
145
|
-
the server's own default stands, which is the only safe default: the field is a vendor
|
|
146
|
-
extension and a server that rejects what it does not recognise would fail every call rather
|
|
147
|
-
than one. Set it, and a model that would otherwise spend its whole output budget thinking
|
|
148
|
-
answers instead. Against rapid-mlx serving qwen3.8:27b, one request cost 37 completion tokens
|
|
149
|
-
with reasoning on and 2 with it off. Ollama's OpenAI-compatible route ignores the field; that
|
|
150
|
-
is the server's limit rather than this one's.
|
|
151
|
-
|
|
152
|
-
`confirm_timeout_minutes` is why a run left alone no longer waits for ever. The chokepoint asks
|
|
153
|
-
before it runs a command that is not on the allowlist, and a question nobody answers used to
|
|
154
|
-
hold the run until somebody came back to it. Refusing is what a declined question records
|
|
155
|
-
either way, so the deadline costs that one tool call and the run carries on.
|
|
156
|
-
|
|
157
|
-
## Verifying somebody else's work
|
|
158
|
-
|
|
159
|
-
Every gate a run executes runs in the workspace that run was editing, with the tests that run
|
|
160
|
-
may have changed, reading reports that run's own processes wrote. The sealed criteria and the
|
|
161
|
-
ratchet close most of that. What they cannot close is the shape of it: a subject grading its
|
|
162
|
-
own paper.
|
|
163
|
-
|
|
164
|
-
`swarm ci` is the separate opinion.
|
|
165
|
-
|
|
166
|
-
swarm ci --patch candidate.diff --install --oracle "npx jest tests/the-task.test.ts"
|
|
167
|
-
|
|
168
|
-
It clones the base commit into a fresh checkout, applies the patch there, and runs the checks in
|
|
169
|
-
that checkout, with the gates assembled from the base commit's manifests rather than the patched
|
|
170
|
-
tree's, so a patch that rewrites the test script does not get to choose the instrument that
|
|
171
|
-
measures it. A patch touching a path you declared immutable is refused before anything runs. A
|
|
172
|
-
patch that will not apply reports that no check happened rather than passing on an unchanged
|
|
173
|
-
tree.
|
|
174
|
-
|
|
175
|
-
**It reports two answers, not one, and the second is the one a suite cannot give you.**
|
|
176
|
-
|
|
177
|
-
regression: pass task: unjudged
|
|
178
|
-
|
|
179
|
-
`regression` is whether the repository's own suite still passes: it says nothing broke. `task` is
|
|
180
|
-
whether the work was actually done, and only an oracle can say that, because a suite tests the
|
|
181
|
-
behaviour a project already had and a task adds behaviour it did not. A patch that adds a
|
|
182
|
-
feature badly still passes a suite written before the feature existed. Measured: four of
|
|
183
|
-
eighteen real-repository patches passed their project's whole suite and failed a hidden
|
|
184
|
-
acceptance test, which is a 22% false-green rate until the two answers were separated.
|
|
185
|
-
`--oracle <command>` supplies the second; without it the task is `unjudged` and nothing is
|
|
186
|
-
verified, which is the honest answer rather than a pass by omission.
|
|
187
|
-
|
|
188
|
-
`--install` installs the fresh checkout's dependencies from its lockfile, with install scripts
|
|
189
|
-
off. It is not the default, because installing runs whatever the registry serves. Without it a
|
|
190
|
-
real project has no test runner in the checkout and every check stands down, which is reported
|
|
191
|
-
as `not measured` rather than as a refusal: those are different findings.
|
|
192
|
-
|
|
193
|
-
It does not need this tool's agent to have produced the patch. Pass `--agent-stream` with
|
|
194
|
-
`--agent-format claude-code` or `generic` and another agent's own event stream is read beside
|
|
195
|
-
it; a line the adapter does not recognise refuses the whole stream by line number rather than
|
|
196
|
-
being skipped, because a skipped line is evidence that quietly went unread.
|
|
197
|
-
|
|
198
|
-
## What a run reports
|
|
199
|
-
|
|
200
|
-
Nine answers, not one:
|
|
201
|
-
|
|
202
|
-
```
|
|
203
|
-
verdict:
|
|
204
|
-
integrity valid
|
|
205
|
-
signer untrusted
|
|
206
|
-
no expected signer was matched, so the signature shows the bundle is
|
|
207
|
-
unchanged since it was written and not who wrote it
|
|
208
|
-
executionTrust restricted
|
|
209
|
-
commands ran under a lexical path and program policy, which is not containment
|
|
210
|
-
policy pass
|
|
211
|
-
mechanical pass
|
|
212
|
-
lint passed
|
|
213
|
-
behavioral unmeasured
|
|
214
|
-
no dynamic gate ran, so nothing executed the change (tests stood down)
|
|
215
|
-
semantic unmeasured
|
|
216
|
-
task unjudged
|
|
217
|
-
humanApproval not-required
|
|
218
|
-
|
|
219
|
-
acceptable: no
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
`unmeasured` is a value, not a missing one. A change whose only passing gate was a linter is
|
|
223
|
-
not a change anything ran: linting proves the source parses and establishes nothing about
|
|
224
|
-
whether any of it was executed. `semantic` abstains by construction, because judging whether a
|
|
225
|
-
change means what the task asked for is a judgement about meaning and nothing here is allowed
|
|
226
|
-
to make one.
|
|
227
|
-
|
|
228
|
-
`--json` gives the same thing as one line of JSON per event and one result at the end, each
|
|
229
|
-
naming its schema. Exit codes are a taxonomy rather than zero-or-not: acceptable, not
|
|
230
|
-
acceptable, invalid request, cancelled, unavailable, internal error.
|
|
44
|
+
**Upgrading from 12.x?** That was a pull-request auditor; 13 and later are a coding agent under
|
|
45
|
+
the same package name, with no migration path. Stay on the `v12-final` tag, or pin the major.
|
|
231
46
|
|
|
232
|
-
##
|
|
47
|
+
## Source upgrade workflows
|
|
233
48
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
49
|
+
The [broad-use source guide](docs/broad-use.md) covers model-free patch, branch and PR verification;
|
|
50
|
+
Node/Python initialization and selected packages; CLI, local HTTP and optional Playwright checks;
|
|
51
|
+
one explicit escalation; and bugfix, refactor and dependency-upgrade presets. The full and
|
|
52
|
+
standalone CLIs share the verifier. [Delivery evidence](docs/upgrade-completion.md) distinguishes
|
|
53
|
+
implemented source, exact-source validation and remote delivery. These additions are not an
|
|
54
|
+
npm publication; use the documented source tarball installation until a release is verified.
|
|
238
55
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
56
|
+
Browser acceptance requires a sealed `instrument` and an immutable Playwright container runtime.
|
|
57
|
+
Project `argv` reports remain unjudged. Unavailable package checks remain visible; missing
|
|
58
|
+
required checks prevent complete verification. See the linked broad-use guide for migration.
|
|
242
59
|
|
|
243
|
-
|
|
244
|
-
`swarm resume`, `swarm retry-step`, `swarm abort`, `swarm repair`. Intent is written before
|
|
245
|
-
every effect, so a crash between the two is visible rather than invisible, and idempotency is
|
|
246
|
-
keyed on the work rather than a clock, so resuming does not repeat an effect that already
|
|
247
|
-
committed.
|
|
248
|
-
|
|
249
|
-
## A session, or a single task
|
|
250
|
-
|
|
251
|
-
Run `swarm` with no task and it opens a session: one process, one ledger, and tasks typed one
|
|
252
|
-
after another, each continuing the conversation the last one left.
|
|
253
|
-
|
|
254
|
-
```
|
|
255
|
-
› create calculator.js exporting add and multiply, and calculator.test.js covering both
|
|
256
|
-
8 gate(s) passed, 8 step(s)
|
|
60
|
+
## Install
|
|
257
61
|
|
|
258
|
-
|
|
62
|
+
```sh
|
|
63
|
+
npm install -g swarm-orchestrator
|
|
259
64
|
```
|
|
260
65
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
`swarm "task"` still runs one task and exits, exactly as before.
|
|
267
|
-
|
|
268
|
-
## Several workers at once
|
|
66
|
+
That is **14.1.0**. It runs on Node 22 or newer. Node 24 or newer is recommended, because the
|
|
67
|
+
changed-line coverage measurement spawns node's test runner with `--test-isolation=process`,
|
|
68
|
+
which Node 22 rejects; below 24 that one measurement reports unmeasured and never counts as a
|
|
69
|
+
pass. `swarm doctor` says which Node it found and what owns the `swarm` command, and `--fix`
|
|
70
|
+
repairs an install that an older build is shadowing.
|
|
269
71
|
|
|
270
|
-
|
|
271
|
-
one at a time under the same ratchet a single run answers to. Nothing is merged into the
|
|
272
|
-
branch you are sitting on; the result waits on an integration branch and the report tells you
|
|
273
|
-
how to take it.
|
|
72
|
+
## Try it
|
|
274
73
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
model text, every line names the peer it is about, and no signal reports a success, so there
|
|
282
|
-
is nothing in it to mistake for a gate result.
|
|
283
|
-
|
|
284
|
-
**`--redundancy <n>` tries each task several ways and lands the best of them.** The winner is
|
|
285
|
-
chosen by reading which attempt moved the measured numbers, never by asking a model which
|
|
286
|
-
answer it likes. The whole ranking goes on the chain, losers and the reason each was left out
|
|
287
|
-
included, so you re-read the choice instead of taking it.
|
|
288
|
-
|
|
289
|
-
**`--goal <text>` breaks the goal into tasks itself.** A planner reads the workspace with
|
|
290
|
-
read-only tools and declares a task graph, which is checked for unique ids, resolving
|
|
291
|
-
dependencies, no cycle, and files that two unordered tasks do not share, and recorded before
|
|
292
|
-
the first worker starts. Nodes land layer by layer.
|
|
293
|
-
|
|
294
|
-
Two runs of this, committed with their bundles, are in
|
|
295
|
-
[`swarm.md`](docs/evidence/2026-08-24/swarm.md). The second one is the more useful: every
|
|
296
|
-
structural check passed on a decomposition that could not work, because the planner left out
|
|
297
|
-
a dependency. Whether a set of tasks adds up to a goal is a judgement about meaning, and this
|
|
298
|
-
tool makes none.
|
|
299
|
-
|
|
300
|
-
## Watching it work
|
|
74
|
+
```sh
|
|
75
|
+
export ANTHROPIC_API_KEY=... # or OPENAI_API_KEY, GOOGLE_GENERATIVE_AI_API_KEY,
|
|
76
|
+
# or start Ollama and pass --model local:<id>
|
|
77
|
+
cd your-repository
|
|
78
|
+
swarm "make slugify collapse whitespace and strip punctuation"
|
|
79
|
+
```
|
|
301
80
|
|
|
302
|
-
|
|
303
|
-
|
|
81
|
+
Keys come from the environment or your OS keychain, never from `swarm.toml`: that file is
|
|
82
|
+
committed and cloned, so a key in it has already been shared with everyone holding the
|
|
83
|
+
repository. Every command and flag is in [docs/cli.md](docs/cli.md).
|
|
84
|
+
|
|
85
|
+
<p align="right">(<a href="#readme-top">back to top</a>)</p>
|
|
86
|
+
|
|
87
|
+
## How it verifies
|
|
88
|
+
|
|
89
|
+
Every tool call and every check goes through one recording chokepoint, and the record is an
|
|
90
|
+
append-only, hash-chained ledger that lives outside the workspace. When a run ends it is
|
|
91
|
+
exported as a signed bundle carrying a dependency-free verifier, so the bundle can be checked
|
|
92
|
+
anywhere with plain Node.
|
|
93
|
+
|
|
94
|
+
Five words carry most of the weight. A **gate** is a check declared as data: a command, a
|
|
95
|
+
parser, and whether it blocks. The **ratchet** is the rule that a retry may not trade away
|
|
96
|
+
tests, assertions or coverage to turn a gate green. A **bond** is one file a passing gate is
|
|
97
|
+
handed that it must refuse, so a pass that cannot fail is caught. An **oracle** is the check
|
|
98
|
+
you supply that says the task was done, as distinct from nothing broke. **Reach** is whether
|
|
99
|
+
that oracle executed the lines a patch added. And **unmeasured** is a verdict of its own:
|
|
100
|
+
nobody checked is not the same as checked and passed, and it never renders green.
|
|
101
|
+
|
|
102
|
+
The mechanics, the nine-answer report and worked examples are in
|
|
103
|
+
[docs/verifying.md](docs/verifying.md). Retries under the ratchet, sessions and several workers
|
|
104
|
+
at once are in [docs/using.md](docs/using.md).
|
|
105
|
+
|
|
106
|
+
## Use it without a model
|
|
107
|
+
|
|
108
|
+
Three commands need no model, no API key and no local backend. `swarm gates` measures a
|
|
109
|
+
workspace, `swarm ci --patch <file>` verifies a patch in a fresh checkout of its base, and
|
|
110
|
+
`swarm verify <bundle>` checks a bundle and who signed it. They also ship on their own as the
|
|
111
|
+
`swarm-verify` package under [packages/swarm-verify](packages/swarm-verify), the same code with
|
|
112
|
+
none of the agent. The walkthrough, over the committed tamper demo, and the install for the
|
|
113
|
+
standalone package are in [docs/verify-only.md](docs/verify-only.md).
|
|
114
|
+
|
|
115
|
+
<p align="right">(<a href="#readme-top">back to top</a>)</p>
|
|
116
|
+
|
|
117
|
+
## Measured
|
|
118
|
+
|
|
119
|
+
Every number here links to the committed artifact of the thing happening. The full table, and
|
|
120
|
+
the list of things that may not be said, is [docs/claims.md](docs/claims.md).
|
|
121
|
+
|
|
122
|
+
- **One changed byte breaks verification.** The same bundle verified and then tampered with in
|
|
123
|
+
a single byte, exit 0 and exit 1 side by side, with a script to reproduce it:
|
|
124
|
+
[tamper demo](docs/evidence/2026-08-18/tamper-demo).
|
|
125
|
+
- **A bundle verifies on a machine that has never seen this repository.** Run in a `node:24`
|
|
126
|
+
container with no network and no mount of this repository:
|
|
127
|
+
[clean-container-verification.md](docs/evidence/2026-08-23/clean-container-verification.md).
|
|
128
|
+
- **A green verdict is computed by the harness, and the model cannot produce one.** In a real
|
|
129
|
+
run the model asserted a predicate the language does not parse; the harness rendered it
|
|
130
|
+
`UNVERIFIED` and carried on, twice: [shakedown results](docs/evidence/2026-08-18/shakedown/results.md).
|
|
131
|
+
- **A suite passing is not the task being done.** Four of eighteen real-repository patches
|
|
132
|
+
passed their project's whole suite and failed a hidden acceptance test, which is why `swarm ci`
|
|
133
|
+
reports `regression` and `task` as two answers: [docs/verifying.md](docs/verifying.md).
|
|
134
|
+
- **The oracle is judged too.** Certified tasks turned out to rest on oracles that could not
|
|
135
|
+
fail. The last false green standing, `commander#1671`, was certified by an oracle that runs
|
|
136
|
+
every line the patch adds and never tests the precedence those lines decide; it is refused now
|
|
137
|
+
because that oracle accepted a change to a line it had run:
|
|
138
|
+
[docs/verifying.md](docs/verifying.md#the-oracle-is-judged-too).
|
|
139
|
+
- **The September 6 mined-corpus false-green rate was 0 in 15**, 0.0%, 95% CI [0.0, 20.4], with
|
|
140
|
+
two oracles per task, one handed to the tool and one held back:
|
|
141
|
+
[mined-corpus](docs/evidence/2026-09-06/mined-corpus/README.md). The denominator moved when
|
|
142
|
+
the tool did: four patches both oracles accept are refused because the tool's own oracle never
|
|
143
|
+
ran part of what they changed, five because the sealed half rejects work the held-back half
|
|
144
|
+
accepts, and one because its oracle accepted a change to a line it had run.
|
|
145
|
+
- **Twelve tasks reported as unjudgeable were the agent having written nothing at all**, which
|
|
146
|
+
is a model failure and is recorded as one. An earlier 0-of-18 was withdrawn rather than
|
|
147
|
+
corrected quietly: the same test was handed to the tool and then used as the ground truth it
|
|
148
|
+
was scored against, so it agreed with itself:
|
|
149
|
+
[false-green-measurement.md](docs/evidence/2026-09-05/false-green-measurement.md).
|
|
150
|
+
- **Of the gates this project agreed not to call itself production-ready without**, the
|
|
151
|
+
historical assessment records eight passing, two partial, two unproven, and two reported
|
|
152
|
+
rather than barred: [docs/beta-gates.md](docs/beta-gates.md).
|
|
153
|
+
|
|
154
|
+
<p align="right">(<a href="#readme-top">back to top</a>)</p>
|
|
304
155
|
|
|
305
|
-
|
|
306
|
-
swarm make the parser trim before it splits
|
|
307
|
-
local:qwen3-coder:30b-a3b /Users/brad/projects/scratch-repo 20s step 4 5812 tokens attempt 1/3
|
|
308
|
-
plan
|
|
309
|
-
read the failing test, fix the parser, run the gates
|
|
310
|
-
actions
|
|
311
|
-
edit path=src/parse.ts find=text.split replace=text.trim().split
|
|
312
|
-
shell command=npm test
|
|
313
|
-
shell failed: 1 failing
|
|
314
|
-
ratchet accepted: tests collected 12 to 12, assertions 34 to 35, skips 0 to 0
|
|
315
|
-
gates attempt 1/3
|
|
316
|
-
PASS tests: 12 collected, 0 failed
|
|
317
|
-
PASS lint: no findings in 208 files
|
|
318
|
-
N/A coverage: no lcov artifact was written to the path the harness named
|
|
319
|
-
WARN diff-budget (advisory): 1 file changed, 1 line added, budget 12 files and 400 lines
|
|
320
|
-
DONE stopped: completed (4 steps, 5812 tokens)
|
|
321
|
-
j scroll enter expand tab pane / filter e evidence ? help q detach ctrl+c cancel run
|
|
322
|
-
```
|
|
156
|
+
## What is not claimed
|
|
323
157
|
|
|
324
|
-
|
|
325
|
-
|
|
158
|
+
The five that matter most. The full list is in
|
|
159
|
+
[docs/verifying.md](docs/verifying.md#what-is-not-claimed).
|
|
160
|
+
|
|
161
|
+
- **It is not production-ready.** The counts above describe the linked campaigns, not a fresh
|
|
162
|
+
measurement of every gate on this checkout. Each row and what would settle it:
|
|
163
|
+
[docs/beta-gates.md](docs/beta-gates.md).
|
|
164
|
+
- **Not "fully secure".** The secret detector does known-pattern scrubbing, not secret removal.
|
|
165
|
+
Zero crashes at a fuzz budget is evidence, not proof.
|
|
166
|
+
- **The default execution mode is `restricted`, not `isolated`.** A lexical path and program
|
|
167
|
+
policy in front of interpreters unless you pass `--isolation`. Reported before the run starts
|
|
168
|
+
and recorded on the chain rather than quietly assumed, but it is not containment.
|
|
169
|
+
- **0 in 15 says "under 20%", not "zero".** That upper bound is the honest half of the rate,
|
|
170
|
+
and it is a rate for that corpus and that build, not for this one.
|
|
171
|
+
- **Shown its oracle, a model still gets past this.** A patch written to satisfy a visible test
|
|
172
|
+
has its added lines tested by that test, so the oracle refuses every mutant of them and is
|
|
173
|
+
right to. Bonding asks whether the oracle judged what the patch added. It cannot ask what the
|
|
174
|
+
patch left out, and that is what an adversarial patch does.
|
|
175
|
+
|
|
176
|
+
Gates prove mechanical quality, not design quality. What a bundle buys you is that reviewing the
|
|
177
|
+
change is fast and its claims are checkable, not that review is unnecessary.
|
|
178
|
+
|
|
179
|
+
<p align="right">(<a href="#readme-top">back to top</a>)</p>
|
|
180
|
+
|
|
181
|
+
## Roadmap
|
|
182
|
+
|
|
183
|
+
The implementation is ahead of the evidence needed to call this production-ready. The audit
|
|
184
|
+
repairs are recorded in [the implementation record](docs/audit-implementation-2026-09-11.md);
|
|
185
|
+
the local campaign and every excluded case are in
|
|
186
|
+
[the September 11 report](docs/evidence/2026-09-11/local-campaign/report.md).
|
|
187
|
+
|
|
188
|
+
- [x] Connect verification, displayed acceptance, cancellation, budgets and recovery to the
|
|
189
|
+
records that establish them. Use standard DSSE signing bytes and literal replacement text.
|
|
190
|
+
- [x] Build the campaign machinery: separate case author, checker and solver models; admission
|
|
191
|
+
controls before grading; frozen schedules; actual baseline dispatch; every failed launch
|
|
192
|
+
retained; raw evidence that can be checked from the checkout.
|
|
193
|
+
- [x] Run the available Docker security and cleanup matrix. Fourteen declared observations
|
|
194
|
+
passed, with working attack controls and a separate check that ordinary work still runs.
|
|
195
|
+
Repair after abrupt harness death was exercised too.
|
|
196
|
+
- [ ] A false-green interval that supports a population claim. The historical 0 in 15 has a
|
|
197
|
+
20.4% upper bound. The new synthetic pilot admits one evaluation case and cannot narrow
|
|
198
|
+
that bound for real work. Freeze an independent population and a sufficient sample first.
|
|
199
|
+
- [ ] A denominator the tool did not choose. The new admission pass checks references and
|
|
200
|
+
predetermined counterexamples, but model authorship alone does not establish independence
|
|
201
|
+
or complete requirements. Independent admission and review are still needed.
|
|
202
|
+
- [ ] An adversarial verification corpus that covers omitted requirements. Separate local
|
|
203
|
+
models supplied fresh checks and attacks. Mutation of added lines still cannot establish
|
|
204
|
+
that a patch implemented something it left out; the report keeps those outcomes visible.
|
|
205
|
+
- [ ] Task success non-inferior to the strongest alternative. The two local baseline arms now
|
|
206
|
+
execute, with matched tasks and budgets. This pilot is too small to establish which tool
|
|
207
|
+
is strongest or to support a non-inferiority claim.
|
|
208
|
+
- [ ] Security evidence for every supported backend. Docker was measured here; Podman and
|
|
209
|
+
nerdctl were unavailable. Independent attacks and those runtime matrices remain open.
|
|
210
|
+
- [ ] No surviving daemons across the supported runtime boundaries. Docker cleanup passed the
|
|
211
|
+
declared lifecycle cases. Restricted host execution still cannot own a descendant that
|
|
212
|
+
leaves its process group; abrupt harness death requires supervision or later repair.
|
|
213
|
+
- [ ] A new user productive in under ten minutes. The fixture and observer procedure are ready.
|
|
214
|
+
No new users were observed, so setup checks cannot close this item.
|
|
215
|
+
|
|
216
|
+
Each broader claim stays open until its own evidence meets the bar in
|
|
217
|
+
[docs/beta-gates.md](docs/beta-gates.md).
|
|
218
|
+
|
|
219
|
+
<p align="right">(<a href="#readme-top">back to top</a>)</p>
|
|
220
|
+
|
|
221
|
+
## Contributing
|
|
222
|
+
|
|
223
|
+
The bar is the one the tool applies to itself: `npm run gates` green with the output shown, new
|
|
224
|
+
behaviour covered by a test that failed first, and no claim in a document that its linked artifact
|
|
225
|
+
does not establish.
|
|
226
|
+
|
|
227
|
+
1. Fork the project
|
|
228
|
+
2. Create a branch (`git checkout -b feature/amazing-feature`)
|
|
229
|
+
3. Run `npm run gates` and paste the real output in the pull request
|
|
230
|
+
4. Commit (`git commit -m 'Add an amazing feature'`)
|
|
231
|
+
5. Push (`git push origin feature/amazing-feature`)
|
|
232
|
+
6. Open a pull request
|
|
233
|
+
|
|
234
|
+
New dependencies need a one-line justification; the standard library is preferred.
|
|
235
|
+
[docs/build-guide.md](docs/build-guide.md) is worth reading before structural work.
|
|
326
236
|
|
|
327
|
-
|
|
328
|
-
⠙ thinking, step 2 5s I don't see calculator.js in the root directory
|
|
329
|
-
⠹ shell npm test 12s
|
|
330
|
-
```
|
|
237
|
+
## License
|
|
331
238
|
|
|
332
|
-
|
|
333
|
-
ledger for ever, and repeating it as it streams would be the same text three times. A tool that
|
|
334
|
-
finishes inside a frame never draws one.
|
|
335
|
-
|
|
336
|
-
`?` lists every key. `enter` expands a row to its whole payload and the ledger record it came
|
|
337
|
-
from. `q` leaves the view: the screen comes down and the run keeps going, reporting the plain
|
|
338
|
-
lines it writes off a terminal. `ctrl+c` cancels the run. There is no progress bar, because an
|
|
339
|
-
agent run has no denominator.
|
|
340
|
-
|
|
341
|
-
When the run ends, the screen lists what it produced, says how many claims the harness
|
|
342
|
-
verified and how many it refused, and offers to open the review page. It says the bundle
|
|
343
|
-
verified only if the bundle's own verifier ran here and exited 0. `swarm review <bundle>`
|
|
344
|
-
shows the same panel for any bundle already on disk.
|
|
345
|
-
|
|
346
|
-
The keymap, the `swarm.toml` surface, the degradation matrix, and a recording of a session
|
|
347
|
-
are in [`interface.md`](docs/evidence/2026-08-23/interface.md), with the frames in
|
|
348
|
-
[`interface-frames.txt`](docs/evidence/2026-08-23/interface-frames.txt) and a playable
|
|
349
|
-
asciinema capture in [`interface.cast`](docs/evidence/2026-08-23/interface.cast).
|
|
350
|
-
|
|
351
|
-
## What is claimed
|
|
352
|
-
|
|
353
|
-
Every line here links to a committed artifact of the thing happening. The full table,
|
|
354
|
-
including what backs each one, is [`docs/claims.md`](docs/claims.md).
|
|
355
|
-
|
|
356
|
-
**A green verdict is computed by the harness, and the model cannot produce one.** In a real
|
|
357
|
-
run, the model asserted a predicate the language does not parse. The harness rendered it
|
|
358
|
-
`UNVERIFIED (predicate-unparseable)` and carried on, twice, until the model wrote one that
|
|
359
|
-
could be evaluated:
|
|
360
|
-
[shakedown results](docs/evidence/2026-08-18/shakedown/results.md).
|
|
361
|
-
|
|
362
|
-
**One changed byte breaks verification.** The same bundle, verified and then tampered with
|
|
363
|
-
in a single byte of one record, exit 0 and exit 1 side by side, with a script to reproduce
|
|
364
|
-
it: [tamper demo](docs/evidence/2026-08-18/tamper-demo).
|
|
365
|
-
|
|
366
|
-
**The bundle carries its own verifier, and it works on a machine that has never seen this
|
|
367
|
-
repo.** `node verify.mjs <bundle>` checks the manifest, the chain, the signature, every blob
|
|
368
|
-
against its content address, and recomputes every claim verdict. Run in a `node:24` container
|
|
369
|
-
with no network and no mount of this repository: exit 0 on the committed bundle, exit 1 on the
|
|
370
|
-
same bundle one byte later, with the image digest and both transcripts in
|
|
371
|
-
[`clean-container-verification.md`](docs/evidence/2026-08-23/clean-container-verification.md).
|
|
372
|
-
Transcripts from two earlier runs outside the repository:
|
|
373
|
-
[`live-tasks.md`](docs/evidence/2026-08-18/live-tasks.md). Beside the verifier, every bundle
|
|
374
|
-
now carries `rederive.mjs`, which recomputes every gate status from the recorded exit code and
|
|
375
|
-
output under the rule the record names, every ratchet decision from its recorded measures,
|
|
376
|
-
every bond verdict and every claim, and names what it cannot re-derive rather than agreeing
|
|
377
|
-
with it: [`gates-bonded/`](docs/evidence/2026-09-02/gates-bonded) is a run with nine gates
|
|
378
|
-
sealed, four bonds held, and all seventeen verdicts re-derived.
|
|
379
|
-
|
|
380
|
-
**A signature is checked against an identity from outside the bundle.** A bundle carries the
|
|
381
|
-
public key its own signature verifies against, so checking it against itself can only say
|
|
382
|
-
"unchanged since written". Anyone can edit a bundle, rehash it, sign it with a key of their own
|
|
383
|
-
and ship that key in the manifest. `swarm verify <bundle> --signer <fingerprint>` is the check
|
|
384
|
-
that catches it: named and matching is trusted, named and not matching is untrusted with both
|
|
385
|
-
fingerprints in the message, no signer named is untrusted rather than trusted, and an ephemeral
|
|
386
|
-
key is never trusted whatever the policy says because the run generated it for itself. Beside
|
|
387
|
-
the bundle signature every run now writes a DSSE envelope binding the patch, the spec digest,
|
|
388
|
-
the source commit, the chain head and the verdict under one signature, so a diff and a bundle
|
|
389
|
-
can be shown to be about each other.
|
|
390
|
-
|
|
391
|
-
**Bundles are signed from the OS keychain**, not from a key in the workspace. Both manifests
|
|
392
|
-
in [`live-tasks.md`](docs/evidence/2026-08-18/live-tasks.md) say `"keySource": "keychain"` and
|
|
393
|
-
both verifiers confirm it. Where the keychain holds no usable key the run signs with a per-run
|
|
394
|
-
key and says which of the three keychain failures happened, rather than signing quietly with
|
|
395
|
-
something else; the manifest then records `keySource: ephemeral`, which is what the bundles in
|
|
396
|
-
[`installed-package-run.md`](docs/evidence/2026-08-23/installed-package-run.md) carry.
|
|
397
|
-
|
|
398
|
-
**Local model choice is measured on your machine.** The probe output and recommendation from
|
|
399
|
-
real hardware: [`hardware-select.md`](docs/evidence/2026-08-18/hardware-select.md). A hundred
|
|
400
|
-
and eighty calibration runs across three models, distributions rather than averages, with the
|
|
401
|
-
pick ranked against the other two:
|
|
402
|
-
[`calibration-report.md`](docs/evidence/2026-08-23/calibration-report.md).
|
|
403
|
-
|
|
404
|
-
**Eight untrusted boundaries are fuzzed**, and the harnesses are checked against a defect
|
|
405
|
-
injected on purpose so a clean run cannot be a blind one: [`fuzz/`](fuzz/README.md) and
|
|
406
|
-
[`security-coverage.md`](docs/security-coverage.md).
|
|
407
|
-
|
|
408
|
-
**The screen renders from ledger projections, and a keystroke has no route to a verdict.**
|
|
409
|
-
Interactive state is a separate type with a separate reducer, and a test asserts across every
|
|
410
|
-
action that none of its fields can be mistaken for a gate result:
|
|
411
|
-
[`interface.md`](docs/evidence/2026-08-23/interface.md).
|
|
412
|
-
|
|
413
|
-
**A choice between competing attempts is made from measured numbers.** One task tried three
|
|
414
|
-
ways: three green attempts, coverage measured rather than abstained on, the third ranked last
|
|
415
|
-
on the dimension that saw it wrote one test fewer, and the top two identical on everything so
|
|
416
|
-
the tie broke on the earliest, which the report says in those words rather than inventing a
|
|
417
|
-
reason it did not have: [`swarm.md`](docs/evidence/2026-08-24/swarm.md).
|
|
418
|
-
|
|
419
|
-
**Adversarial passes, with each closure locked as a regression test.** Six pass directories
|
|
420
|
-
under [`redteam/`](redteam), 49 cases in `src/evidence/redteam-adversarial.test.ts`, and an
|
|
421
|
-
accounting record mapping each pass to what it actually was, because the driver ledger
|
|
422
|
-
records one completed lap and a directory is not a lap.
|
|
239
|
+
Distributed under the ISC License. See [LICENSE](LICENSE).
|
|
423
240
|
|
|
424
|
-
##
|
|
241
|
+
## Contact
|
|
425
242
|
|
|
426
|
-
|
|
427
|
-
something. The full list, with what would settle each, is
|
|
428
|
-
[`docs/beta-gates.md`](docs/beta-gates.md): of the twelve gates this project agreed not to call
|
|
429
|
-
itself production-ready without, six pass on measured evidence, three are partial with the gap
|
|
430
|
-
named, two are unproven, and one fails on scale. **It is not production-ready**, and that last
|
|
431
|
-
one is the largest gap.
|
|
432
|
-
|
|
433
|
-
- **Not "fully secure".** The secret detector does known-pattern scrubbing, not secret
|
|
434
|
-
removal, with a four-character floor. Zero crashes at a fuzz budget is evidence, not proof.
|
|
435
|
-
- **The default execution mode is `restricted`, not `isolated`.** A run gets a lexical path and
|
|
436
|
-
program policy in front of interpreters unless you pass `--isolation`. That is reported before
|
|
437
|
-
the run starts and recorded on the chain rather than quietly assumed, but it is not
|
|
438
|
-
containment. The container backend has not been audited against a determined escape, and a
|
|
439
|
-
container is not a virtual machine.
|
|
440
|
-
- **The false-green rate is measured, on eleven opportunities.** Each task carries two oracles:
|
|
441
|
-
one sealed before the runs and handed to the tool, one written from the task text and held back
|
|
442
|
-
from it. A false green is only possible where the tool said `verified`, which happened eleven
|
|
443
|
-
times out of eighteen; the held-back oracle refuses none of them. **0 of 11, 95% CI
|
|
444
|
-
[0.0, 25.9]**: [`second-oracle/README.md`](docs/evidence/2026-09-06/second-oracle/README.md).
|
|
445
|
-
Eleven opportunities is eleven opportunities, and that interval is what a zero buys: what is
|
|
446
|
-
shown is that none occurred here, not that the rate is low. Three tasks, and six of the
|
|
447
|
-
eighteen runs could not contribute because neither arm ever passed that task's sealed oracle.
|
|
448
|
-
An earlier single-oracle version of this number, 0 of 18, was withdrawn as arithmetic rather
|
|
449
|
-
than corrected quietly: the same test was handed to the tool and then used as the ground truth
|
|
450
|
-
it was scored against, so it agreed with itself. That, and the real 22.2% it replaced, are in
|
|
451
|
-
[`false-green-measurement.md`](docs/evidence/2026-09-05/false-green-measurement.md).
|
|
452
|
-
- **No comparison against another tool.** Nothing here is measured against a competitor. The
|
|
453
|
-
evaluation harness runs matched arms on a local model and has not been run at the scale that
|
|
454
|
-
would make an arm comparison worth reading. The calibration results that do exist are
|
|
455
|
-
self-run, on one machine, and labelled directional in the file itself.
|
|
456
|
-
- **A full clone is still heavy.** Blob payloads, 409 MB of the tracked tree, now live outside
|
|
457
|
-
the repository with their digests committed beside them, and a shallow clone packs to about
|
|
458
|
-
19 MB. A full clone still carries the history those blobs were committed into, and shrinking
|
|
459
|
-
that means rewriting history, which is a worse trade than the download it saves.
|
|
460
|
-
- **Learned routing is not on by default**, and there is a bar under turning it on: held-out
|
|
461
|
-
success non-inferior within five points judged by the whole interval, at least thirty tasks
|
|
462
|
-
per arm, and cheaper or faster. Nothing has cleared it yet, so routing follows the
|
|
463
|
-
calibration and the competency table.
|
|
464
|
-
- **Six known gaps ship open**, and none of them is claimed closed. They are in
|
|
465
|
-
[build guide 7.1](docs/build-guide.md), which says for each what now catches it and what
|
|
466
|
-
still gets past. Four of them have detections built against them and have not yet been
|
|
467
|
-
attacked, so what is claimed is a detection and not a closure: a check nobody has tried to
|
|
468
|
-
get past is a check nobody has measured. The other two came with the scale-out work and are
|
|
469
|
-
unchanged, since a decomposition that is well formed can still be unrunnable and a
|
|
470
|
-
comparator built from gate measures reads discipline rather than completeness.
|
|
471
|
-
- **A signature does not make the machine honest.** It proves the bundle was not altered
|
|
472
|
-
after it left the machine that produced it. The review page says that on its face.
|
|
473
|
-
|
|
474
|
-
## How it works
|
|
475
|
-
|
|
476
|
-
- **Claims are predicates, not prose.** A claim names a record, a record kind, and a
|
|
477
|
-
machine-checkable predicate. The harness recomputes the record's kind, evaluates the
|
|
478
|
-
predicate, and decides. Model narrative always renders as unverified prose.
|
|
479
|
-
- **The ledger is append-only and hash-chained.** Each record carries the previous record's
|
|
480
|
-
hash. A failed write aborts the run. Nothing is updated or deleted, ever.
|
|
481
|
-
- **Every tool call goes through one chokepoint** that records it, tags its provenance, and
|
|
482
|
-
applies the policy guard. Credential paths are denied by default and each denial is itself
|
|
483
|
-
recorded. The guard is a lexical path and program policy, not a sandbox: it reads a command
|
|
484
|
-
into the programs it would run and the words that could name a file, and rules on those. That
|
|
485
|
-
bounds which programs start and never what they do once started, because an allowlisted
|
|
486
|
-
interpreter runs whatever a workspace script says.
|
|
487
|
-
- **What a run executed under is measured, not asserted.** Before the first tool call a
|
|
488
|
-
containment self-test runs the escapes rather than reasoning about them: read a host file
|
|
489
|
-
outside the workspace, write outside it, open a network connection. Whatever gets through is
|
|
490
|
-
named in an `execution-envelope` ledger record and printed before the run starts. With no
|
|
491
|
-
kernel-enforced backend in front of it, the honest answer is `restricted`, and that is what
|
|
492
|
-
it says. `isolated` is reserved for a backend that refused every probe.
|
|
493
|
-
- **Child processes get a built environment, never an inherited one.** A path check cannot see
|
|
494
|
-
`process.env.ANTHROPIC_API_KEY`, so the model's shell commands and the repository's own gate
|
|
495
|
-
commands run under an allowlist: PATH, the locale names, TERM, a harness-owned HOME, and
|
|
496
|
-
whatever the run authorized by name. Provider keys have no `swarm.toml` setting, and a file
|
|
497
|
-
that names one is refused with rotation guidance.
|
|
498
|
-
- **Gates are data, and each declares what a pass establishes.** A gate declares a command, a
|
|
499
|
-
parser, whether it blocks, and its capability: `static` reads the source, `dynamic` executes
|
|
500
|
-
the code under change, `policy` rules on the change without doing either. "Did anything run
|
|
501
|
-
over this change" is answered by a passing `dynamic` gate, which is why a lint-only pass no
|
|
502
|
-
longer reads as one. The engine never special-cases a gate; the capability is read off its id.
|
|
503
|
-
- **A run's state outlives its process.** Which activities were dispatched and never came back,
|
|
504
|
-
which files are held, what budget is spent, what a person approved: SQLite in WAL mode beside
|
|
505
|
-
the ledger, with intent written before every effect. A hundred injected kills, three committed
|
|
506
|
-
effects each, three hundred effects and no duplicates.
|
|
507
|
-
- **Killing a run kills what it started.** Every child leads a process group and the signal goes
|
|
508
|
-
to the group. A wall budget, a Ctrl-C and a supervisor's SIGTERM all reach the same signal,
|
|
509
|
-
and in a parallel run a worker starting late is handed what is left of the budget rather than
|
|
510
|
-
a fresh one.
|
|
511
|
-
- **Evidence has a lifetime.** `swarm gc` says what it would remove and removes nothing until
|
|
512
|
-
told. The store is created 0700 and 0600, and a directory made before that rule is narrowed
|
|
513
|
-
rather than assumed.
|
|
514
|
-
- **A pass is bonded, and the criteria are sealed first.** Before the model is asked for
|
|
515
|
-
anything, the gates it will be measured by, with their severities, the rule that reads each,
|
|
516
|
-
the budgets and the attempt cap, are one record on the chain, and the verifier holds every
|
|
517
|
-
gate run to it. After the fixed point, every gate that passed is handed one file it has to
|
|
518
|
-
refuse: a test that throws, a TODO, a credential-shaped token, a file outside the declared
|
|
519
|
-
set, a change over the budget. A check that refuses it held. A check that passes over a
|
|
520
|
-
bond it demonstrably saw is vacuous, and a vacuous blocking gate makes the run not green.
|
|
521
|
-
A pass nothing shows can fail is not a pass.
|
|
522
|
-
- **The ratchet is numeric.** Tests collected, assertions in touched test files, coverage of
|
|
523
|
-
changed lines, skip markers. The two the runner reports, tests collected and coverage of
|
|
524
|
-
changed lines, come from reports the runner wrote where the harness told it to, never from
|
|
525
|
-
what a gate printed: a test file that prints its own counter line is the code under
|
|
526
|
-
measurement authoring the measurement. Where the harness cannot vouch for the run that would
|
|
527
|
-
write those reports it asks for none, and an unobtainable measure is reported as "not
|
|
528
|
-
measured" rather than as a pass. Assertions and skip markers need no runner: the harness
|
|
529
|
-
counts them out of the text of every test file the run touched.
|
|
530
|
-
|
|
531
|
-
The full design, including what it refuses to build and why, is in
|
|
532
|
-
[`docs/build-guide.md`](docs/build-guide.md).
|
|
533
|
-
|
|
534
|
-
## Limits
|
|
535
|
-
|
|
536
|
-
Gates prove mechanical quality. They do not prove design quality, and nothing here pretends
|
|
537
|
-
a passing run means the change is good. What the bundle buys you is that reviewing the
|
|
538
|
-
change is fast and that its claims are checkable, not that review is unnecessary.
|
|
539
|
-
|
|
540
|
-
The verdict says so in its own vocabulary: `semantic` is `unmeasured` on every run and always
|
|
541
|
-
will be, because whether a change means what was asked is a judgement about meaning, and this
|
|
542
|
-
tool makes none. `acceptable` means no blocking gate failed, no policy gate failed, and
|
|
543
|
-
something executed the change. It does not mean the change is right, and no number here could
|
|
544
|
-
tell doing the whole task from doing the minimum that passes its own tests.
|
|
545
|
-
|
|
546
|
-
## Upgrading from v12
|
|
547
|
-
|
|
548
|
-
v12 was a PR auditor that ran as a GitHub Action. v13 is a coding agent. Same package name,
|
|
549
|
-
different product, no migration path. If you are using v12, stay on it: it is tagged
|
|
550
|
-
`v12-final`. Details in [`CHANGELOG.md`](CHANGELOG.md).
|
|
243
|
+
Brad Kinnard, [@KChackerman](https://x.com/KChackerman), bradkinnard@proton.me
|
|
551
244
|
|
|
552
|
-
|
|
245
|
+
Project link: [github.com/moonrunnerkc/swarm-orchestrator](https://github.com/moonrunnerkc/swarm-orchestrator)
|
|
553
246
|
|
|
554
|
-
|
|
247
|
+
<p align="right">(<a href="#readme-top">back to top</a>)</p>
|