swarm-orchestrator 12.0.0 → 13.1.3
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 +160 -0
- package/README.md +188 -226
- package/dist/agent-run.js +143 -0
- package/dist/agent-run.js.map +1 -0
- package/dist/cli-options.js +244 -0
- package/dist/cli-options.js.map +1 -0
- package/dist/cli.js +859 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/settings.js +82 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/config/swarm-toml.js +187 -0
- package/dist/config/swarm-toml.js.map +1 -0
- package/dist/core/clock.js +2 -0
- package/dist/core/clock.js.map +1 -0
- package/dist/core/loop-events.js +2 -0
- package/dist/core/loop-events.js.map +1 -0
- package/dist/core/loop.js +118 -0
- package/dist/core/loop.js.map +1 -0
- package/dist/core/model-client.js +23 -0
- package/dist/core/model-client.js.map +1 -0
- package/dist/core/random-source.js +2 -0
- package/dist/core/random-source.js.map +1 -0
- package/dist/core/termination.js +20 -0
- package/dist/core/termination.js.map +1 -0
- package/dist/core/tool-invoker.js +2 -0
- package/dist/core/tool-invoker.js.map +1 -0
- package/dist/evidence/blob-store.js +52 -0
- package/dist/evidence/blob-store.js.map +1 -0
- package/dist/evidence/bundle-manifest.js +45 -0
- package/dist/evidence/bundle-manifest.js.map +1 -0
- package/dist/evidence/bundle.js +127 -0
- package/dist/evidence/bundle.js.map +1 -0
- package/dist/evidence/canonical-json.js +97 -0
- package/dist/evidence/canonical-json.js.map +1 -0
- package/dist/evidence/claim.js +123 -0
- package/dist/evidence/claim.js.map +1 -0
- package/dist/evidence/combined-bundle.js +40 -0
- package/dist/evidence/combined-bundle.js.map +1 -0
- package/dist/evidence/dag.js +118 -0
- package/dist/evidence/dag.js.map +1 -0
- package/dist/evidence/latin-lookalikes.js +74 -0
- package/dist/evidence/latin-lookalikes.js.map +1 -0
- package/dist/evidence/ledger-record.js +80 -0
- package/dist/evidence/ledger-record.js.map +1 -0
- package/dist/evidence/ledger.js +138 -0
- package/dist/evidence/ledger.js.map +1 -0
- package/dist/evidence/model-call-recording.js +80 -0
- package/dist/evidence/model-call-recording.js.map +1 -0
- package/dist/evidence/predicate.js +244 -0
- package/dist/evidence/predicate.js.map +1 -0
- package/dist/evidence/record-index.js +21 -0
- package/dist/evidence/record-index.js.map +1 -0
- package/dist/evidence/record-kind.js +31 -0
- package/dist/evidence/record-kind.js.map +1 -0
- package/dist/evidence/replay.js +100 -0
- package/dist/evidence/replay.js.map +1 -0
- package/dist/evidence/review-page.js +192 -0
- package/dist/evidence/review-page.js.map +1 -0
- package/dist/evidence/scrub.js +533 -0
- package/dist/evidence/scrub.js.map +1 -0
- package/dist/evidence/session.js +100 -0
- package/dist/evidence/session.js.map +1 -0
- package/dist/evidence/signing.js +176 -0
- package/dist/evidence/signing.js.map +1 -0
- package/dist/evidence/verifier/verify.d.mts +22 -0
- package/dist/evidence/verifier/verify.mjs +583 -0
- package/dist/gates/auto-resolve.js +276 -0
- package/dist/gates/auto-resolve.js.map +1 -0
- package/dist/gates/base-control.js +149 -0
- package/dist/gates/base-control.js.map +1 -0
- package/dist/gates/comment-spans.js +107 -0
- package/dist/gates/comment-spans.js.map +1 -0
- package/dist/gates/coverage-artifact.js +55 -0
- package/dist/gates/coverage-artifact.js.map +1 -0
- package/dist/gates/default-gates.js +241 -0
- package/dist/gates/default-gates.js.map +1 -0
- package/dist/gates/engine.js +64 -0
- package/dist/gates/engine.js.map +1 -0
- package/dist/gates/escalation.js +44 -0
- package/dist/gates/escalation.js.map +1 -0
- package/dist/gates/file-set-tool.js +63 -0
- package/dist/gates/file-set-tool.js.map +1 -0
- package/dist/gates/file-set.js +183 -0
- package/dist/gates/file-set.js.map +1 -0
- package/dist/gates/gate-definition.js +15 -0
- package/dist/gates/gate-definition.js.map +1 -0
- package/dist/gates/gate-runner.js +180 -0
- package/dist/gates/gate-runner.js.map +1 -0
- package/dist/gates/git-workspace.js +173 -0
- package/dist/gates/git-workspace.js.map +1 -0
- package/dist/gates/inspection-gates.js +270 -0
- package/dist/gates/inspection-gates.js.map +1 -0
- package/dist/gates/measure-snapshot.js +204 -0
- package/dist/gates/measure-snapshot.js.map +1 -0
- package/dist/gates/measures.js +224 -0
- package/dist/gates/measures.js.map +1 -0
- package/dist/gates/node-command-runner.js +60 -0
- package/dist/gates/node-command-runner.js.map +1 -0
- package/dist/gates/node-test-command.js +222 -0
- package/dist/gates/node-test-command.js.map +1 -0
- package/dist/gates/parsers.js +409 -0
- package/dist/gates/parsers.js.map +1 -0
- package/dist/gates/project-type.js +63 -0
- package/dist/gates/project-type.js.map +1 -0
- package/dist/gates/ratchet-summary.js +18 -0
- package/dist/gates/ratchet-summary.js.map +1 -0
- package/dist/gates/ratchet.js +202 -0
- package/dist/gates/ratchet.js.map +1 -0
- package/dist/gates/respecification.js +153 -0
- package/dist/gates/respecification.js.map +1 -0
- package/dist/gates/unified-diff.js +209 -0
- package/dist/gates/unified-diff.js.map +1 -0
- package/dist/gates/workspace-changes.js +5 -0
- package/dist/gates/workspace-changes.js.map +1 -0
- package/dist/providers/ai-sdk-model-client.js +86 -0
- package/dist/providers/ai-sdk-model-client.js.map +1 -0
- package/dist/providers/endpoint-resolution.js +81 -0
- package/dist/providers/endpoint-resolution.js.map +1 -0
- package/dist/providers/fixture-provider.js +70 -0
- package/dist/providers/fixture-provider.js.map +1 -0
- package/dist/providers/local-discovery.js +38 -0
- package/dist/providers/local-discovery.js.map +1 -0
- package/dist/providers/message-conversion.js +40 -0
- package/dist/providers/message-conversion.js.map +1 -0
- package/dist/providers/model-spec.js +33 -0
- package/dist/providers/model-spec.js.map +1 -0
- package/dist/providers/registry.js +75 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/served-models.js +59 -0
- package/dist/providers/served-models.js.map +1 -0
- package/dist/select/backend-canary.js +119 -0
- package/dist/select/backend-canary.js.map +1 -0
- package/dist/select/backend-command.js +15 -0
- package/dist/select/backend-command.js.map +1 -0
- package/dist/select/bundled-pricing.js +12 -0
- package/dist/select/bundled-pricing.js.map +1 -0
- package/dist/select/bundled-shortlist.js +13 -0
- package/dist/select/bundled-shortlist.js.map +1 -0
- package/dist/select/calibrate.js +128 -0
- package/dist/select/calibrate.js.map +1 -0
- package/dist/select/calibration-case.js +66 -0
- package/dist/select/calibration-case.js.map +1 -0
- package/dist/select/calibration-cases.v1.json +257 -0
- package/dist/select/calibration-measures.js +89 -0
- package/dist/select/calibration-measures.js.map +1 -0
- package/dist/select/calibration-report.js +278 -0
- package/dist/select/calibration-report.js.map +1 -0
- package/dist/select/calibration-run.js +168 -0
- package/dist/select/calibration-run.js.map +1 -0
- package/dist/select/calibration-summary.js +64 -0
- package/dist/select/calibration-summary.js.map +1 -0
- package/dist/select/coding-models.v1.json +478 -0
- package/dist/select/dimensions.js +111 -0
- package/dist/select/dimensions.js.map +1 -0
- package/dist/select/golden-set.js +89 -0
- package/dist/select/golden-set.js.map +1 -0
- package/dist/select/hardware-probe.js +107 -0
- package/dist/select/hardware-probe.js.map +1 -0
- package/dist/select/memory-probe.js +33 -0
- package/dist/select/memory-probe.js.map +1 -0
- package/dist/select/model-preflight.js +85 -0
- package/dist/select/model-preflight.js.map +1 -0
- package/dist/select/model-pricing.v1.json +17 -0
- package/dist/select/pick-store.js +39 -0
- package/dist/select/pick-store.js.map +1 -0
- package/dist/select/pricing-source.js +38 -0
- package/dist/select/pricing-source.js.map +1 -0
- package/dist/select/pricing.js +66 -0
- package/dist/select/pricing.js.map +1 -0
- package/dist/select/published-source.js +11 -0
- package/dist/select/published-source.js.map +1 -0
- package/dist/select/recommendation.js +270 -0
- package/dist/select/recommendation.js.map +1 -0
- package/dist/select/reward.js +73 -0
- package/dist/select/reward.js.map +1 -0
- package/dist/select/routing-log.js +94 -0
- package/dist/select/routing-log.js.map +1 -0
- package/dist/select/routing-record.js +23 -0
- package/dist/select/routing-record.js.map +1 -0
- package/dist/select/routing-report.js +95 -0
- package/dist/select/routing-report.js.map +1 -0
- package/dist/select/select-report.js +81 -0
- package/dist/select/select-report.js.map +1 -0
- package/dist/select/shortlist-source.js +102 -0
- package/dist/select/shortlist-source.js.map +1 -0
- package/dist/select/shortlist.js +132 -0
- package/dist/select/shortlist.js.map +1 -0
- package/dist/select/system-probe.js +32 -0
- package/dist/select/system-probe.js.map +1 -0
- package/dist/select/task-class.js +40 -0
- package/dist/select/task-class.js.map +1 -0
- package/dist/select/task-cost.js +55 -0
- package/dist/select/task-cost.js.map +1 -0
- package/dist/select/ucb.js +87 -0
- package/dist/select/ucb.js.map +1 -0
- package/dist/tools/chokepoint-record.js +56 -0
- package/dist/tools/chokepoint-record.js.map +1 -0
- package/dist/tools/chokepoint.js +183 -0
- package/dist/tools/chokepoint.js.map +1 -0
- package/dist/tools/claim-tool.js +59 -0
- package/dist/tools/claim-tool.js.map +1 -0
- package/dist/tools/derivation.js +87 -0
- package/dist/tools/derivation.js.map +1 -0
- package/dist/tools/file-tools.js +112 -0
- package/dist/tools/file-tools.js.map +1 -0
- package/dist/tools/regex-safety.js +663 -0
- package/dist/tools/regex-safety.js.map +1 -0
- package/dist/tools/sandbox.js +108 -0
- package/dist/tools/sandbox.js.map +1 -0
- package/dist/tools/search-tool.js +121 -0
- package/dist/tools/search-tool.js.map +1 -0
- package/dist/tools/shell-tool.js +66 -0
- package/dist/tools/shell-tool.js.map +1 -0
- package/dist/tools/tool-argument-decoding.js +118 -0
- package/dist/tools/tool-argument-decoding.js.map +1 -0
- package/dist/tools/tool-definition.js +15 -0
- package/dist/tools/tool-definition.js.map +1 -0
- package/dist/tools/workspace-path.js +18 -0
- package/dist/tools/workspace-path.js.map +1 -0
- package/dist/tools/workspace-tools.js +15 -0
- package/dist/tools/workspace-tools.js.map +1 -0
- package/dist/tui/confirmation-queue.js +49 -0
- package/dist/tui/confirmation-queue.js.map +1 -0
- package/dist/tui/elapsed.js +18 -0
- package/dist/tui/elapsed.js.map +1 -0
- package/dist/tui/evidence-panel.js +53 -0
- package/dist/tui/evidence-panel.js.map +1 -0
- package/dist/tui/key-bindings.js +111 -0
- package/dist/tui/key-bindings.js.map +1 -0
- package/dist/tui/key-dispatcher.js +115 -0
- package/dist/tui/key-dispatcher.js.map +1 -0
- package/dist/tui/layout.js +100 -0
- package/dist/tui/layout.js.map +1 -0
- package/dist/tui/open-path.js +76 -0
- package/dist/tui/open-path.js.map +1 -0
- package/dist/tui/plain-lines.js +32 -0
- package/dist/tui/plain-lines.js.map +1 -0
- package/dist/tui/screen-model.js +271 -0
- package/dist/tui/screen-model.js.map +1 -0
- package/dist/tui/screen.js +113 -0
- package/dist/tui/screen.js.map +1 -0
- package/dist/tui/session-interface.js +193 -0
- package/dist/tui/session-interface.js.map +1 -0
- package/dist/tui/session-store.js +22 -0
- package/dist/tui/session-store.js.map +1 -0
- package/dist/tui/session-view.js +157 -0
- package/dist/tui/session-view.js.map +1 -0
- package/dist/tui/terminal-text.js +97 -0
- package/dist/tui/terminal-text.js.map +1 -0
- package/dist/tui/theme.js +94 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/verify-bundle.js +47 -0
- package/dist/tui/verify-bundle.js.map +1 -0
- package/dist/tui/view-state.js +89 -0
- package/dist/tui/view-state.js.map +1 -0
- package/dist/workers/merge-queue.js +249 -0
- package/dist/workers/merge-queue.js.map +1 -0
- package/dist/workers/parallel-report.js +49 -0
- package/dist/workers/parallel-report.js.map +1 -0
- package/dist/workers/parallel-run.js +178 -0
- package/dist/workers/parallel-run.js.map +1 -0
- package/dist/workers/worktree.js +112 -0
- package/dist/workers/worktree.js.map +1 -0
- package/docs/build-guide.md +175 -0
- package/docs/claims.md +50 -0
- package/docs/security-coverage.md +552 -0
- package/package.json +67 -144
- package/config/personas/architect.yaml +0 -26
- package/config/personas/dependency-auditor.yaml +0 -57
- package/config/personas/documentation-writer.yaml +0 -57
- package/config/personas/implementer.yaml +0 -55
- package/config/personas/migration-specialist.yaml +0 -59
- package/config/personas/security-reviewer.yaml +0 -57
- package/config/personas/test-author.yaml +0 -56
- package/config/personas/verifier.yaml +0 -62
- package/dist/src/audit/aibom/cyclonedx-ml.js +0 -174
- package/dist/src/audit/aibom/index.js +0 -11
- package/dist/src/audit/aibom/ledger-reader.js +0 -40
- package/dist/src/audit/aibom/spdx-ai-profile.js +0 -166
- package/dist/src/audit/cheat-detector/assertion-strip.js +0 -60
- package/dist/src/audit/cheat-detector/audit-config.js +0 -342
- package/dist/src/audit/cheat-detector/comment-only-fix.js +0 -54
- package/dist/src/audit/cheat-detector/confirm-findings.js +0 -96
- package/dist/src/audit/cheat-detector/coverage-erosion.js +0 -67
- package/dist/src/audit/cheat-detector/dead-branch-insertion.js +0 -45
- package/dist/src/audit/cheat-detector/detector-sets.js +0 -86
- package/dist/src/audit/cheat-detector/detector-types.js +0 -2
- package/dist/src/audit/cheat-detector/diff-chunker.js +0 -181
- package/dist/src/audit/cheat-detector/diff-walker.js +0 -241
- package/dist/src/audit/cheat-detector/error-swallow.js +0 -263
- package/dist/src/audit/cheat-detector/exception-rethrow-lost-context.js +0 -38
- package/dist/src/audit/cheat-detector/fake-refactor.js +0 -218
- package/dist/src/audit/cheat-detector/import-resolver.js +0 -313
- package/dist/src/audit/cheat-detector/index.js +0 -174
- package/dist/src/audit/cheat-detector/internal-roots.js +0 -192
- package/dist/src/audit/cheat-detector/judge-primary.js +0 -75
- package/dist/src/audit/cheat-detector/judge-prompts/index.js +0 -25
- package/dist/src/audit/cheat-detector/judge-prompts/types.js +0 -10
- package/dist/src/audit/cheat-detector/judge-prompts/v1-conservative.js +0 -66
- package/dist/src/audit/cheat-detector/judge-prompts/v2-balanced.js +0 -79
- package/dist/src/audit/cheat-detector/llm-judge/anthropic-judge.js +0 -245
- package/dist/src/audit/cheat-detector/llm-judge/cache.js +0 -92
- package/dist/src/audit/cheat-detector/llm-judge/index.js +0 -207
- package/dist/src/audit/cheat-detector/llm-judge/local-judge.js +0 -75
- package/dist/src/audit/cheat-detector/llm-judge/ollama-judge.js +0 -150
- package/dist/src/audit/cheat-detector/llm-judge/types.js +0 -12
- package/dist/src/audit/cheat-detector/manifests/cargo-toml.js +0 -63
- package/dist/src/audit/cheat-detector/manifests/composer-json.js +0 -82
- package/dist/src/audit/cheat-detector/manifests/csproj.js +0 -93
- package/dist/src/audit/cheat-detector/manifests/find-manifests.js +0 -128
- package/dist/src/audit/cheat-detector/manifests/gemfile.js +0 -79
- package/dist/src/audit/cheat-detector/manifests/go-mod.js +0 -73
- package/dist/src/audit/cheat-detector/manifests/gradle.js +0 -97
- package/dist/src/audit/cheat-detector/manifests/index.js +0 -43
- package/dist/src/audit/cheat-detector/manifests/package-json.js +0 -83
- package/dist/src/audit/cheat-detector/manifests/pom-xml.js +0 -78
- package/dist/src/audit/cheat-detector/manifests/pyproject-toml.js +0 -78
- package/dist/src/audit/cheat-detector/manifests/requirements-txt.js +0 -56
- package/dist/src/audit/cheat-detector/manifests/types.js +0 -15
- package/dist/src/audit/cheat-detector/matcher-grader.js +0 -267
- package/dist/src/audit/cheat-detector/mock-delta.js +0 -101
- package/dist/src/audit/cheat-detector/mock-of-hallucination.js +0 -284
- package/dist/src/audit/cheat-detector/no-op-fix-helpers.js +0 -157
- package/dist/src/audit/cheat-detector/no-op-fix.js +0 -268
- package/dist/src/audit/cheat-detector/pr-intent.js +0 -85
- package/dist/src/audit/cheat-detector/registries/cache.js +0 -41
- package/dist/src/audit/cheat-detector/registries/github-actions-scan.js +0 -52
- package/dist/src/audit/cheat-detector/registries/index.js +0 -32
- package/dist/src/audit/cheat-detector/registries/offline-allowlist.js +0 -174
- package/dist/src/audit/cheat-detector/registries/types.js +0 -13
- package/dist/src/audit/cheat-detector/subject-paths.js +0 -92
- package/dist/src/audit/cheat-detector/test-import-closure.js +0 -141
- package/dist/src/audit/cheat-detector/test-relaxation.js +0 -194
- package/dist/src/audit/cheat-detector/type-suppression.js +0 -100
- package/dist/src/audit/cheat-detector/verify-findings.js +0 -328
- package/dist/src/audit/execution-grounded/corroborate.js +0 -149
- package/dist/src/audit/execution-grounded/coverage-delta.js +0 -288
- package/dist/src/audit/execution-grounded/dead-branch-restoration.js +0 -457
- package/dist/src/audit/execution-grounded/docker-runner.js +0 -104
- package/dist/src/audit/execution-grounded/eg-cache.js +0 -106
- package/dist/src/audit/execution-grounded/exec-env.js +0 -282
- package/dist/src/audit/execution-grounded/fake-refactor-restoration.js +0 -399
- package/dist/src/audit/execution-grounded/index.js +0 -1151
- package/dist/src/audit/execution-grounded/issue-repro.js +0 -340
- package/dist/src/audit/execution-grounded/mock-restoration.js +0 -396
- package/dist/src/audit/execution-grounded/monorepo.js +0 -83
- package/dist/src/audit/execution-grounded/mutation-check.js +0 -332
- package/dist/src/audit/execution-grounded/no-op-fix-restoration.js +0 -376
- package/dist/src/audit/execution-grounded/sandbox.js +0 -459
- package/dist/src/audit/execution-grounded/test-restoration.js +0 -906
- package/dist/src/audit/execution-grounded/type-suppression-restoration.js +0 -496
- package/dist/src/audit/gate/block-eligibility.js +0 -87
- package/dist/src/audit/gate/block-trigger-ledger.js +0 -39
- package/dist/src/audit/gate/block-trigger-types.js +0 -22
- package/dist/src/audit/gate/block-triggers.js +0 -539
- package/dist/src/audit/gate/calibrate-triggers.js +0 -41
- package/dist/src/audit/gate/gate-decision.js +0 -61
- package/dist/src/audit/gate/revert-proof.js +0 -70
- package/dist/src/audit/gate/self-certifying.js +0 -74
- package/dist/src/audit/gate/wilson.js +0 -56
- package/dist/src/audit/oracle/category-map.js +0 -24
- package/dist/src/audit/oracle/evade/evaders.js +0 -166
- package/dist/src/audit/oracle/inject/assertion-strip.js +0 -32
- package/dist/src/audit/oracle/inject/cheat-mock-mutation.js +0 -37
- package/dist/src/audit/oracle/inject/comment-only-fix.js +0 -33
- package/dist/src/audit/oracle/inject/coverage-erosion.js +0 -35
- package/dist/src/audit/oracle/inject/dead-branch-insertion.js +0 -31
- package/dist/src/audit/oracle/inject/diff-carrier.js +0 -165
- package/dist/src/audit/oracle/inject/error-swallow.js +0 -32
- package/dist/src/audit/oracle/inject/exception-rethrow-lost-context.js +0 -35
- package/dist/src/audit/oracle/inject/fake-refactor.js +0 -32
- package/dist/src/audit/oracle/inject/goal-not-fixed.js +0 -37
- package/dist/src/audit/oracle/inject/index.js +0 -42
- package/dist/src/audit/oracle/inject/injection-runner.js +0 -118
- package/dist/src/audit/oracle/inject/injector-types.js +0 -24
- package/dist/src/audit/oracle/inject/mock-of-hallucination.js +0 -43
- package/dist/src/audit/oracle/inject/no-op-fix.js +0 -47
- package/dist/src/audit/oracle/inject/site.js +0 -10
- package/dist/src/audit/oracle/inject/test-relaxation.js +0 -29
- package/dist/src/audit/oracle/inject/type-suppression.js +0 -33
- package/dist/src/audit/pr-source/index.js +0 -132
- package/dist/src/audit/report-comment/block-trigger-section.js +0 -223
- package/dist/src/audit/report-comment/detector-precision.js +0 -154
- package/dist/src/audit/report-comment/index.js +0 -217
- package/dist/src/audit/shadow-output.js +0 -105
- package/dist/src/audit/shadow.js +0 -103
- package/dist/src/audit/types.js +0 -23
- package/dist/src/cli/flags.js +0 -156
- package/dist/src/cli/v8/argv-schema.js +0 -127
- package/dist/src/cli/v8/audit-handler.js +0 -913
- package/dist/src/cli/v8/compile-handler.js +0 -272
- package/dist/src/cli/v8/doctor-handler.js +0 -849
- package/dist/src/cli/v8/grammar-resolve.js +0 -88
- package/dist/src/cli/v8/index.js +0 -70
- package/dist/src/cli/v8/init-handler.js +0 -177
- package/dist/src/cli/v8/ledger-verify-handler.js +0 -142
- package/dist/src/cli/v8/local-provider-flags.js +0 -275
- package/dist/src/cli/v8/local-provider-types.js +0 -10
- package/dist/src/cli/v8/pr-fetch.js +0 -192
- package/dist/src/cli/v8/pr-manifest-fetch.js +0 -231
- package/dist/src/cli/v8/resume-handler.js +0 -487
- package/dist/src/cli/v8/run-handler.js +0 -564
- package/dist/src/cli/v8/run-wrapper.js +0 -253
- package/dist/src/cli/v8/session-utils.js +0 -121
- package/dist/src/cli/v8/stats-handler.js +0 -270
- package/dist/src/cli.js +0 -102
- package/dist/src/config/provider-config.js +0 -202
- package/dist/src/contract/approval.js +0 -193
- package/dist/src/contract/auto-discover.js +0 -77
- package/dist/src/contract/canonicalize.js +0 -187
- package/dist/src/contract/compiler.js +0 -304
- package/dist/src/contract/extractor/anthropic-extractor.js +0 -266
- package/dist/src/contract/extractor/contract-schema.js +0 -126
- package/dist/src/contract/extractor/deterministic-extractor.js +0 -57
- package/dist/src/contract/extractor/factory.js +0 -105
- package/dist/src/contract/extractor/local-extractor.js +0 -133
- package/dist/src/contract/extractor/scan-pipeline.js +0 -190
- package/dist/src/contract/extractor/stub-extractor.js +0 -89
- package/dist/src/contract/extractor/types.js +0 -2
- package/dist/src/contract/index.js +0 -51
- package/dist/src/contract/schema/loader.js +0 -87
- package/dist/src/contract/schema/v1.json +0 -198
- package/dist/src/contract/serializer.js +0 -139
- package/dist/src/contract/tagger.js +0 -122
- package/dist/src/contract/types.js +0 -22
- package/dist/src/contract/validator.js +0 -235
- package/dist/src/env-loader.js +0 -104
- package/dist/src/errors.js +0 -27
- package/dist/src/falsification/adapters/adapter-profile.js +0 -5
- package/dist/src/falsification/adapters/candidate-runners.js +0 -143
- package/dist/src/falsification/adapters/cli-falsifier.js +0 -171
- package/dist/src/falsification/adapters/fenced-json.js +0 -107
- package/dist/src/falsification/adapters/index.js +0 -30
- package/dist/src/falsification/adapters/profiles/claude-code.js +0 -202
- package/dist/src/falsification/adapters/profiles/codex/prompts/property-must-hold.md +0 -44
- package/dist/src/falsification/adapters/profiles/codex.js +0 -206
- package/dist/src/falsification/adapters/profiles/copilot/prompts/function-must-have-signature.md +0 -58
- package/dist/src/falsification/adapters/profiles/copilot/prompts/import-graph-must-satisfy.md +0 -49
- package/dist/src/falsification/adapters/profiles/copilot/prompts/no-cycles.md +0 -6
- package/dist/src/falsification/adapters/profiles/copilot/prompts/no-upward-imports.md +0 -4
- package/dist/src/falsification/adapters/profiles/copilot.js +0 -184
- package/dist/src/falsification/adapters/registry.js +0 -90
- package/dist/src/falsification/adapters/spawn-cli.js +0 -88
- package/dist/src/falsification/adapters/transient-retry.js +0 -93
- package/dist/src/falsification/adapters/types.js +0 -5
- package/dist/src/falsification/dispatcher.js +0 -70
- package/dist/src/falsification/inspection/heuristic-classifier.js +0 -361
- package/dist/src/falsification/scheduler.js +0 -217
- package/dist/src/index.js +0 -22
- package/dist/src/inference/local/backend.js +0 -30
- package/dist/src/inference/local/backends/llama-cpp.js +0 -181
- package/dist/src/inference/local/backends/ollama.js +0 -186
- package/dist/src/inference/local/backends/openai-compatible.js +0 -187
- package/dist/src/inference/local/backends/vllm.js +0 -175
- package/dist/src/inference/local/concurrency-gate.js +0 -68
- package/dist/src/inference/local/factory.js +0 -89
- package/dist/src/inference/local/grammars/unified-diff.gbnf +0 -26
- package/dist/src/ledger/index.js +0 -26
- package/dist/src/ledger/jsonl-ledger.js +0 -23
- package/dist/src/ledger/ledger.js +0 -212
- package/dist/src/ledger/memoization.js +0 -180
- package/dist/src/ledger/resume.js +0 -139
- package/dist/src/ledger/types.js +0 -6
- package/dist/src/logger.js +0 -96
- package/dist/src/persona/index.js +0 -31
- package/dist/src/persona/persona-registry.js +0 -187
- package/dist/src/persona/predicates.js +0 -54
- package/dist/src/persona/types.js +0 -6
- package/dist/src/persona/verifier-persona.js +0 -138
- package/dist/src/population/apply-verify.js +0 -142
- package/dist/src/population/deterministic-dispatch.js +0 -87
- package/dist/src/population/diff-applier.js +0 -90
- package/dist/src/population/diff-snapshot.js +0 -164
- package/dist/src/population/falsifier-dispatch.js +0 -115
- package/dist/src/population/file-context.js +0 -87
- package/dist/src/population/index.js +0 -27
- package/dist/src/population/manager.js +0 -364
- package/dist/src/population/persona-message.js +0 -186
- package/dist/src/population/pipeline-config.js +0 -73
- package/dist/src/population/post-merge-handler.js +0 -112
- package/dist/src/population/provider-attribution.js +0 -16
- package/dist/src/population/rollback.js +0 -177
- package/dist/src/population/single-mode-executor.js +0 -224
- package/dist/src/population/snapshot-cleanup.js +0 -299
- package/dist/src/population/state.js +0 -48
- package/dist/src/population/test-framework-misuse.js +0 -104
- package/dist/src/population/tournament-driver.js +0 -104
- package/dist/src/population/tournament.js +0 -427
- package/dist/src/population/unified-diff.js +0 -298
- package/dist/src/population/whole-file-apply.js +0 -181
- package/dist/src/session/anthropic-session.js +0 -198
- package/dist/src/session/auto-discover.js +0 -88
- package/dist/src/session/bounded-session.js +0 -94
- package/dist/src/session/deterministic-session.js +0 -331
- package/dist/src/session/factory.js +0 -123
- package/dist/src/session/index.js +0 -28
- package/dist/src/session/local-session.js +0 -221
- package/dist/src/session/stub-session.js +0 -160
- package/dist/src/session/token-estimator.js +0 -23
- package/dist/src/session/types.js +0 -44
- package/dist/src/shared/child-env.js +0 -94
- package/dist/src/shared/obligation-rendering.js +0 -80
- package/dist/src/shared-predicates/index.js +0 -17
- package/dist/src/shared-predicates/predicate-runner.js +0 -62
- package/dist/src/shared-types/index.js +0 -17
- package/dist/src/shared-types/obligation-types.js +0 -25
- package/dist/src/shared-wasm/index.js +0 -17
- package/dist/src/shared-wasm/strategy-constants.js +0 -156
- package/dist/src/types.js +0 -5
- package/dist/src/verification/ast-imports.js +0 -199
- package/dist/src/verification/ast-signature.js +0 -406
- package/dist/src/verification/index.js +0 -14
- package/dist/src/verification/live-cost-tracker.js +0 -78
- package/dist/src/verification/post-merge.js +0 -53
- package/dist/src/verification/pre-generation.js +0 -71
- package/dist/src/verification/predicate-runner.js +0 -22
- package/dist/src/verification/run-verifier.js +0 -613
- package/dist/src/verification/streaming-verifier.js +0 -162
- package/dist/src/wasm/index.js +0 -29
- package/dist/src/wasm/registry.js +0 -30
- package/dist/src/wasm/strategies/format-prettier.js +0 -119
- package/dist/src/wasm/strategies/import-sort.js +0 -185
- package/dist/src/wasm/strategies/scaffold-template.js +0 -98
- package/dist/src/wasm/types.js +0 -11
- package/dist/src/wasm/wasm-runtime.js +0 -260
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 13.1.3
|
|
4
|
+
|
|
5
|
+
The first 13.x on the npm registry. No behaviour changed: this is 13.1.1 with a manifest the
|
|
6
|
+
registry accepts and install instructions that are true.
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
|
|
10
|
+
- **The manifest named no repository, so a signed publish was refused.** `npm publish
|
|
11
|
+
--provenance` signs a statement naming the repository the tarball was built from, and the
|
|
12
|
+
registry checks it against `repository.url` before it accepts the write. That field was
|
|
13
|
+
absent, so the statement said one thing and the manifest said `""`, and the registry answered
|
|
14
|
+
`E422` after the provenance had already been written to the transparency log. Nothing in the
|
|
15
|
+
source tree can show this, so a test now asserts the field.
|
|
16
|
+
- **The package told its own readers it was not published.** The install section named a git ref
|
|
17
|
+
and said the registry served 12.0.0, because that is what was true while the credential was
|
|
18
|
+
missing. Those words ship inside the tarball, so publishing 13.1.1 as it stood would have put
|
|
19
|
+
a package on the registry whose first section denies being there. `npm install -g
|
|
20
|
+
swarm-orchestrator` is the first line again.
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- A description, keywords, a homepage and a bug-tracker link, which is what the registry page
|
|
25
|
+
renders around the readme and what a search on the registry matches against.
|
|
26
|
+
- Three flags the readme never listed, `--base`, `--max-steps` and `--local-endpoint`, and a
|
|
27
|
+
pointer to `swarm --help` for the calibration flags it still does not list.
|
|
28
|
+
|
|
29
|
+
`13.1.2` was tagged and refused by the registry for the manifest reason above. The tag is left
|
|
30
|
+
where it is rather than moved, because it names a real tree and the refusal is part of the
|
|
31
|
+
record.
|
|
32
|
+
|
|
33
|
+
## 13.1.1
|
|
34
|
+
|
|
35
|
+
A packaging fix. Nothing about how the tool runs changed.
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
|
|
39
|
+
- **Installing from a git ref produced a package with no binary.** `dist/` is not committed and
|
|
40
|
+
is built by a script, and npm runs `prepare` for a git install but never `prepublishOnly`.
|
|
41
|
+
Only the latter was declared, so `npm install github:moonrunnerkc/swarm-orchestrator#v13.1.0`
|
|
42
|
+
resolved, reported no error, and left a directory with no `dist/` and no `swarm`. This is the
|
|
43
|
+
install path that matters while the registry publish is blocked, and it was the one that did
|
|
44
|
+
not work.
|
|
45
|
+
|
|
46
|
+
## 13.1.0
|
|
47
|
+
|
|
48
|
+
A run you can watch and drive, and an end-of-run panel that shows you what it produced.
|
|
49
|
+
Everything below is additive: no flag, command or output changed meaning, and the plain-line
|
|
50
|
+
stream a pipe or a CI job reads is byte-for-byte what it was.
|
|
51
|
+
|
|
52
|
+
### Added
|
|
53
|
+
|
|
54
|
+
- **An interactive terminal interface.** On a TTY, a run draws a single screen: the task and
|
|
55
|
+
the model in a header, the plan, the action stream, the gate strip, and a status line.
|
|
56
|
+
Scroll it, expand a row to the whole tool input and output and the ledger record it came
|
|
57
|
+
from, filter it, freeze the render without touching the run, and press `?` for the keymap.
|
|
58
|
+
Two exits that are not the same thing: `q` leaves the view and lets the run finish, `ctrl+c`
|
|
59
|
+
cancels the run.
|
|
60
|
+
- **An end-of-run evidence panel.** What the run produced, named by what each artifact is for,
|
|
61
|
+
with the record count and how many claims the harness verified against how many it refused.
|
|
62
|
+
One keystroke opens the review page, another the bundle directory. It says the bundle
|
|
63
|
+
verified only if the bundle's own verifier ran in that session and exited 0, and it names the
|
|
64
|
+
exit code; otherwise it says "not verified in this run" and prints the command.
|
|
65
|
+
- **`swarm review <bundle directory>`**, which shows that same panel for any bundle already on
|
|
66
|
+
disk, running the same verifier. Nothing is re-run.
|
|
67
|
+
- **`swarm --help`**, which used to report that `--help` needs a value.
|
|
68
|
+
- **Screen flags**: `--no-tui` for plain lines even on a terminal, `--color` and `--no-color`,
|
|
69
|
+
`--open-evidence` and `--no-open-evidence`. Opening is opt-in and never happens off a
|
|
70
|
+
terminal.
|
|
71
|
+
- **Three `swarm.toml` tables**: `[interface]` (`tui`, `color`, `open_evidence`), `[theme]`
|
|
72
|
+
(a colour per slot), and `[keys]` (a key per action). Flags win over the file, as everything
|
|
73
|
+
else does. An unknown key, colour or action is a typed error naming what was wrong and what
|
|
74
|
+
would have been accepted.
|
|
75
|
+
- **Sampling settings on the wire for a calibration run**: temperature and top-p pinned and
|
|
76
|
+
recorded in every model-call record, with a seed per repeat. An ordinary task run sends
|
|
77
|
+
nothing and is unchanged.
|
|
78
|
+
|
|
79
|
+
### Fixed
|
|
80
|
+
|
|
81
|
+
- **Two consumers of one stdin.** The CLI built a readline interface on `process.stdin` while
|
|
82
|
+
Ink held the same stdin in raw mode. A confirmation firing mid-run raced them, which is the
|
|
83
|
+
least acceptable place to drop a keystroke. Confirmation is now a component inside the
|
|
84
|
+
running screen, answered by the same key dispatcher.
|
|
85
|
+
- **The curated model shortlist and pricing table answered 404.** Both URLs named the branch
|
|
86
|
+
`main`, which is the v12 lineage and carries neither file, so `swarm select` fell back to the
|
|
87
|
+
bundled snapshot on every machine.
|
|
88
|
+
- **A missing verifier read as a refused bundle.** Node exits 1 on a module it cannot find,
|
|
89
|
+
which at the exit code is the same as a verifier that ran and said no. One is the absence of
|
|
90
|
+
a verdict.
|
|
91
|
+
- **Local models reported no tokens, and so cost nothing.** An OpenAI-compatible server streams
|
|
92
|
+
a usage chunk only when the request carries `stream_options.include_usage`, and the local
|
|
93
|
+
provider was not built to send it. Every local run recorded `outputTokens: 0`, so throughput
|
|
94
|
+
was unmeasurable and every run priced at `$0.0000`, which the routing reward is built from.
|
|
95
|
+
The router had been learning that local models are free.
|
|
96
|
+
- **One keychain message for three different failures.** A key that could not be read, an entry
|
|
97
|
+
holding something that is not a key, and a keychain that would not accept a new one now say
|
|
98
|
+
which happened and what to do about it. The middle one names the service and the account, and
|
|
99
|
+
says the entry can be deleted.
|
|
100
|
+
|
|
101
|
+
## 13.0.0
|
|
102
|
+
|
|
103
|
+
Same package name, different product. If you installed `swarm-orchestrator` before this
|
|
104
|
+
release, read this before upgrading: v13 is not a newer v12, and nothing in v12's interface
|
|
105
|
+
survives.
|
|
106
|
+
|
|
107
|
+
### What v12 was, and what v13 is
|
|
108
|
+
|
|
109
|
+
v12 was a PR auditor. It ran as a GitHub Action, read pull requests opened by AI coding
|
|
110
|
+
agents, looked for cheat patterns (test relaxation, mock-of-hallucination, assertion strip,
|
|
111
|
+
no-op fix), posted findings as a comment, and gated merges.
|
|
112
|
+
|
|
113
|
+
v13 is a coding agent. It does the work rather than auditing somebody else's, and every
|
|
114
|
+
claim it makes about that work resolves to machine-captured evidence in a tamper-evident
|
|
115
|
+
ledger. The two share a name and nothing else: no shared history, no shared interface, no
|
|
116
|
+
migration path from one to the other, because there is nothing to migrate.
|
|
117
|
+
|
|
118
|
+
### Breaking
|
|
119
|
+
|
|
120
|
+
- **The `swarm-audit` and `swarm-orchestrator` binaries are gone.** One binary now, `swarm`.
|
|
121
|
+
- **The GitHub Action is retired.** v13 ships no `action.yml`. There is no v13 equivalent of
|
|
122
|
+
the merge gate, and none is planned.
|
|
123
|
+
- **Node 24 or newer.** v12 asked for 20. The floor is not stylistic: the coverage cycle
|
|
124
|
+
spawns the test runner with `--test-isolation=process`, which Node 22 rejects as a bad
|
|
125
|
+
option, so on anything older that arm measures nothing.
|
|
126
|
+
- **The histories share no merge base.** v13 is a separate lineage. `git log` will not show
|
|
127
|
+
you v12's commits from here.
|
|
128
|
+
|
|
129
|
+
### If you are using v12
|
|
130
|
+
|
|
131
|
+
Stay on it. It is tagged `v12-final` and that tag is not going away.
|
|
132
|
+
|
|
133
|
+
npm install swarm-orchestrator@12.0.0
|
|
134
|
+
|
|
135
|
+
That is the newest v12 the registry carries. The `v12-final` tag is at 12.1.1, which was
|
|
136
|
+
tagged but never published, so `@12.1.1` does not resolve; install from the tag if you need
|
|
137
|
+
exactly that tree.
|
|
138
|
+
|
|
139
|
+
For the Action, pin the tag rather than a branch, since the default branch is moving to the
|
|
140
|
+
v13 lineage:
|
|
141
|
+
|
|
142
|
+
uses: moonrunnerkc/swarm-orchestrator@v12-final
|
|
143
|
+
|
|
144
|
+
### What v13 does
|
|
145
|
+
|
|
146
|
+
One task, start to finish, in a git workspace: plan, edit through a chokepoint that records
|
|
147
|
+
every tool call, run the gates, auto-resolve failures under a numeric ratchet, and export a
|
|
148
|
+
signed evidence bundle a stranger can verify without installing anything.
|
|
149
|
+
|
|
150
|
+
The parts worth knowing before you try it:
|
|
151
|
+
|
|
152
|
+
- Gate results, claim verdicts and bundle status are computed by the harness. Model prose
|
|
153
|
+
renders as unverified narrative and cannot render green.
|
|
154
|
+
- The ledger is append-only and hash-chained, signed with a key from the OS keychain.
|
|
155
|
+
- The bundle carries its own verifier. `node verify.mjs <bundle>` needs Node and nothing
|
|
156
|
+
else.
|
|
157
|
+
- Local model selection is measured on your hardware rather than guessed from model cards.
|
|
158
|
+
|
|
159
|
+
`README.md` links each of those to a committed artifact of it happening. `docs/claims.md`
|
|
160
|
+
maps every claim to its evidence, and lists what this tree cannot back.
|
package/README.md
CHANGED
|
@@ -1,255 +1,217 @@
|
|
|
1
|
-
|
|
2
|
-
<img src="./assets/cover.svg" alt="Swarm Orchestrator cover" width="100%">
|
|
3
|
-
</p>
|
|
4
|
-
|
|
5
|
-
# Swarm Orchestrator
|
|
6
|
-
|
|
7
|
-
Reads a pull request (PR) diff and flags the shortcuts artificial intelligence (AI) coding agents use to look done without being done. Relaxed tests, swallowed errors, fake renames, eleven categories in all. Grading patches against typed obligation contracts via a multi-persona pipeline is the second surface.
|
|
8
|
-
|
|
9
|
-
For engineers reviewing AI-written PRs at volume. Compliance teams generate CycloneDX-ML (machine learning) and SPDX (Software Package Data Exchange) 3.0 AI-BOM (bill of materials) artifacts. The artifacts map to EU AI Act (European Union Artificial Intelligence Act) Annex IV and CISA (Cybersecurity and Infrastructure Security Agency) reporting. Maintainers keep a hash-chained evidence record for every graded patch.
|
|
10
|
-
|
|
11
|
-
**Flags are tips, blocks are proof.** A flag is a structural detector seeing a cheat-shaped pattern; it is advisory and never blocks a merge (`--mode advise` is the default). A block is a self-certifying runtime result whose per-instance controls are all green, and every block ships the exact command that reproduces it in a fresh checkout. Eight proof protocols back the gate today: six execution-grounded restoration proofs (`test-tamper`, `mock-mutation`, `no-op-fix`, `type-suppression`, `fake-refactor`, `dead-branch`) plus `claim-falsified` and `obligation-failure`. The measured proven-finding precision on the execution-grounded-viable corpus slice, with its plain n, is in [`benchmarks/real-corpus/GATE-PRECISION-REPORT.md`](benchmarks/real-corpus/GATE-PRECISION-REPORT.md).
|
|
12
|
-
|
|
13
|
-
<!-- BADGES:START -->
|
|
14
|
-
[](https://github.com/moonrunnerkc/swarm-orchestrator/actions/workflows/ci.yml)
|
|
15
|
-
[](LICENSE)
|
|
16
|
-
[](package.json)
|
|
17
|
-
[](package.json)
|
|
18
|
-
[&color=brightgreen)](benchmarks/results/AB-REPORT.md)
|
|
19
|
-
[](benchmarks/real-prs/REAL-WORLD-REPORT.md)
|
|
20
|
-
[&color=brightgreen)](benchmarks/real-prs/v11-BENEFIT-REPORT.md)
|
|
21
|
-
<!-- BADGES:END -->
|
|
22
|
-
|
|
23
|
-
<p align="center">
|
|
24
|
-
<a href="#install">Install</a> ·
|
|
25
|
-
<a href="#quick-start">Quick start</a> ·
|
|
26
|
-
<a href="#results">Results</a> ·
|
|
27
|
-
<a href="#cheat-detectors">Detectors</a> ·
|
|
28
|
-
<a href="#use-as-a-github-action">GitHub Action</a> ·
|
|
29
|
-
<a href="#ai-bom">AI-BOM</a> ·
|
|
30
|
-
<a href="#orchestrator-mode">Orchestrator</a> ·
|
|
31
|
-
<a href="#architecture">Architecture</a> ·
|
|
32
|
-
<a href="#commands">Commands</a> ·
|
|
33
|
-
<a href="#limitations">Limitations</a>
|
|
34
|
-
</p>
|
|
1
|
+
# swarm-orchestrator
|
|
35
2
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
git clone https://github.com/moonrunnerkc/swarm-orchestrator.git
|
|
42
|
-
cd swarm-orchestrator
|
|
43
|
-
npm install
|
|
44
|
-
npm run build
|
|
45
|
-
npm link
|
|
46
|
-
swarm --help
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## Quick start
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
# Audit a PR by reference (advisory by default; never blocks the merge)
|
|
53
|
-
GITHUB_TOKEN=... swarm audit moonrunnerkc/swarm-orchestrator#42
|
|
54
|
-
|
|
55
|
-
# Opt in to merge-blocking gate mode (blocks only on a self-certifying
|
|
56
|
-
# runtime proof; enable the execution-grounded layer in
|
|
57
|
-
# .swarm/audit-config.yaml first; see docs/audit-config.md)
|
|
58
|
-
GITHUB_TOKEN=... swarm audit moonrunnerkc/swarm-orchestrator#42 --mode gate
|
|
59
|
-
|
|
60
|
-
# Audit a local diff with all 11 detectors
|
|
61
|
-
git diff main...HEAD | swarm audit --diff-stdin --detectors experimental
|
|
62
|
-
|
|
63
|
-
# Audit and emit a CycloneDX 1.6 ML-BOM
|
|
64
|
-
swarm audit --diff-file my.patch --emit-aibom cyclonedx-ml
|
|
65
|
-
|
|
66
|
-
# Shadow mode: record verdicts to disk without commenting or gating
|
|
67
|
-
swarm audit --pr <ref> --shadow my-org/my-repo
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
Exit codes: `0` advisory or any advise-mode run, `1` block (gate mode only), `2` usage error.
|
|
71
|
-
|
|
72
|
-
## Results
|
|
73
|
-
|
|
74
|
-
Every number here is reproducible from this repo and runs offline.
|
|
75
|
-
|
|
76
|
-
### Catches cheats that linters miss
|
|
77
|
-
|
|
78
|
-
| PR | Cheat caught | Semgrep / ESLint |
|
|
79
|
-
|---|---|---|
|
|
80
|
-
| [cloudflare/workers-sdk#14063](https://github.com/cloudflare/workers-sdk/pull/14063) | fake refactor: function renamed but two callers still use the old name | not flagged |
|
|
81
|
-
| [cloudflare/workers-sdk#14132](https://github.com/cloudflare/workers-sdk/pull/14132) | error swallow: bare empty `catch` silently hides every error in the block | not flagged |
|
|
82
|
-
|
|
83
|
-
Both reproduce deterministically from the committed diffs. Semgrep (210 rules) and the ESLint security ruleset flag neither. Reproduce either with `swarm audit --diff-file benchmarks/real-prs/diffs/cloudflare-workers-sdk/<pr>.diff`. Full study across twelve repos in [`benchmarks/real-prs/v11-BENEFIT-REPORT.md`](benchmarks/real-prs/v11-BENEFIT-REPORT.md).
|
|
84
|
-
|
|
85
|
-
### Detection numbers
|
|
86
|
-
|
|
87
|
-
**301 of 325** planted cheats recovered (92.6%) across thirteen categories scored against a defect-injection oracle: 258/275 structural plus 43/50 on the two semantic categories the judge-primary path covers. The behavioral `cheat-mock-mutation` category drove the latest gain: focusing the judge on the hunks that add a value-injecting mock lifted its recall from 0.16 (the prior rapid-mlx glm47 run) to 0.96 (24/25) on the local qwen3.6 judge, while the clean-PR judge false-positive rate fell from 10% to 0%. Reproduce with `SWARM_JUDGE_PROVIDER=ollama SWARM_JUDGE_MODEL=qwen3.6:35b-a3b npm run benchmarks:full`; A/B with the same-model decomposition in [`benchmarks/results/AB-REPORT.md`](benchmarks/results/AB-REPORT.md) and per-detector recall in [`benchmarks/oracle-corpus/per-detector-recall.md`](benchmarks/oracle-corpus/per-detector-recall.md).
|
|
88
|
-
|
|
89
|
-
**0.11 findings per PR** on an 18-PR pilot across five public repos. At or below the pre-upgrade auditor's false-alarm burden, with the oracle recall gain intact. Full numbers in [`benchmarks/real-prs/REAL-WORLD-REPORT.md`](benchmarks/real-prs/REAL-WORLD-REPORT.md).
|
|
90
|
-
|
|
91
|
-
### Execution-grounded layer
|
|
92
|
-
|
|
93
|
-
Reproduce with `npm run execution-grounded:full`. This optional layer sets up a sandboxed checkout and runs mutation testing, repro execution, and a coverage delta scoped to the lines the PR changed. It surfaced one proof-correlated catch: proof anchor [`trpc/trpc#6098`](https://github.com/trpc/trpc/pull/6098), where 8 lines with surviving mutations were later changed by a hotfix. Evaluation in [`benchmarks/real-prs/v11-EXECUTION-GROUNDED-REPORT.md`](benchmarks/real-prs/v11-EXECUTION-GROUNDED-REPORT.md).
|
|
94
|
-
|
|
95
|
-
## Cheat detectors
|
|
3
|
+
[](https://github.com/moonrunnerkc/swarm-orchestrator/actions/workflows/gates.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/swarm-orchestrator)
|
|
5
|
+
[](package.json)
|
|
6
|
+
[](LICENSE)
|
|
96
7
|
|
|
97
|
-
|
|
8
|
+
A coding agent whose claims about its own work resolve to machine-captured evidence.
|
|
98
9
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
| `no-op-fix` | default | Test modified with no source change, or vice versa; import-graph reachability fallback when only one side moved. |
|
|
104
|
-
| `fake-refactor` | default | Exported symbol renamed in source, no caller in the diff updates the old name. |
|
|
105
|
-
| `coverage-erosion` | default | Source branch added with no compensating test addition. |
|
|
106
|
-
| `test-relaxation` | default | Strict matcher swapped for a loose one, or a test block removed without same-chunk replacement. |
|
|
107
|
-
| `assertion-strip` | default | Net assertion count in a test file drops after the PR. |
|
|
108
|
-
| `type-suppression` | default | A type-checker or linter suppression (for example `@ts-ignore` or `eslint-disable`) added over a changed line. |
|
|
109
|
-
| `comment-only-fix` | experimental | Source modifications are all comment additions. |
|
|
110
|
-
| `exception-rethrow-lost-context` | experimental | `throw err` replaced with `throw new Error(...)` and `{ cause }` not forwarded. |
|
|
111
|
-
| `dead-branch-insertion` | experimental | Branch guarded by a literal-false condition added. |
|
|
10
|
+
The model can say whatever it likes. It cannot make a gate pass, it cannot mark a claim
|
|
11
|
+
verified, and it cannot change a record after the fact. Those are the harness's to decide,
|
|
12
|
+
and the run exports a signed, hash-chained bundle that anybody can check without installing
|
|
13
|
+
this tool.
|
|
112
14
|
|
|
113
|
-
|
|
15
|
+
[What it does](#what-it-does) | [Install](#install) | [Use](#use) | [Watching it work](#watching-it-work) | [What is claimed](#what-is-claimed) | [What is not claimed](#what-is-not-claimed) | [How it works](#how-it-works) | [Limits](#limits) | [Upgrading from v12](#upgrading-from-v12)
|
|
114
16
|
|
|
115
|
-
|
|
17
|
+
## What it does
|
|
116
18
|
|
|
117
|
-
|
|
19
|
+
Give it a task and a git workspace. It plans, declares the files it intends to touch, edits
|
|
20
|
+
through a chokepoint that records every tool call, runs your gates, and retries failures
|
|
21
|
+
under a numeric ratchet that refuses a fix which trades away tests, assertions, or coverage.
|
|
22
|
+
Then it exports the evidence.
|
|
118
23
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
permissions:
|
|
125
|
-
pull-requests: write
|
|
126
|
-
contents: read
|
|
127
|
-
jobs:
|
|
128
|
-
audit:
|
|
129
|
-
runs-on: ubuntu-latest
|
|
130
|
-
steps:
|
|
131
|
-
- uses: actions/checkout@v4
|
|
132
|
-
with:
|
|
133
|
-
fetch-depth: 0
|
|
134
|
-
- uses: moonrunnerkc/swarm-orchestrator@main
|
|
135
|
-
with:
|
|
136
|
-
audit-mode: true
|
|
137
|
-
mode: advise # advise | gate
|
|
138
|
-
detectors: default # default | experimental
|
|
139
|
-
emit-aibom: cyclonedx-ml
|
|
140
|
-
env:
|
|
141
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
Outputs: `audit-pass`, `audit-findings`, `audit-ledger`. Full input list in [`action.yml`](action.yml).
|
|
145
|
-
|
|
146
|
-
### Enabling the execution-grounded layer
|
|
147
|
-
|
|
148
|
-
Structural detectors run with no setup and only ever flag (advisory). The six runtime proofs that can gate a merge (`test-tamper`, `mock-mutation`, `no-op-fix`, `type-suppression`, `fake-refactor`, `dead-branch`) need the execution-grounded layer, which is off until you set `executionGrounded.enabled: true` in [`.swarm/audit-config.yaml`](docs/audit-config.md). Turning it on is what lets `--mode gate` block, and every block it produces ships the exact command that reproduces it in a fresh checkout.
|
|
149
|
-
|
|
150
|
-
What it costs: for each audited PR the layer provisions the repository in a sandbox (clone the head, install dependencies, run the affected tests), so it adds clone, install, and test wall-clock to the job, and only PRs in a Node project with a lockfile and a recognized test runner (jest, vitest, mocha) provision at all. Everything else fails closed to advisory. The static viability screen on the project corpus measured 12 of 197 PRs as provisionable ([`benchmarks/real-corpus/eg-viability.json`](benchmarks/real-corpus/eg-viability.json)); your own repository, where the suite is known to run in CI, provisions far more reliably than an arbitrary sample. Nothing the layer cannot prove ever blocks: with the layer off, or on a non-provisionable PR, gate mode passes on advisory findings alone.
|
|
151
|
-
|
|
152
|
-
## AI-BOM
|
|
24
|
+
Here is a real run, committed: [`live-tasks.md`](docs/evidence/2026-08-18/live-tasks.md),
|
|
25
|
+
with its bundle in [`live-frontier/`](docs/evidence/2026-08-18/live-frontier). And here is the
|
|
26
|
+
packaged tool doing it, installed from a tarball into a directory holding nothing else, against
|
|
27
|
+
a workspace it had never seen, recorded in a real terminal:
|
|
28
|
+
[`installed-package-run.md`](docs/evidence/2026-08-23/installed-package-run.md).
|
|
153
29
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
Procurement mappings:
|
|
157
|
-
|
|
158
|
-
- [`docs/eu-ai-act-mapping.md`](docs/eu-ai-act-mapping.md): EU AI Act (European Union Artificial Intelligence Act) Article 11 + Annex IV fields.
|
|
159
|
-
- [`docs/cisa-sbom-ai-mapping.md`](docs/cisa-sbom-ai-mapping.md): CISA (Cybersecurity and Infrastructure Security Agency) SBOM-for-AI minimum elements.
|
|
160
|
-
|
|
161
|
-
## Orchestrator mode
|
|
162
|
-
|
|
163
|
-
Grades patches against a typed contract instead of auditing a PR diff.
|
|
164
|
-
|
|
165
|
-
```bash
|
|
166
|
-
swarm init # Scaffold contract.yaml + patches.jsonl
|
|
167
|
-
swarm run --goal "check this project builds" # Deterministic provider, no API key
|
|
168
|
-
```
|
|
30
|
+
## Install
|
|
169
31
|
|
|
170
|
-
|
|
32
|
+
npm install -g swarm-orchestrator
|
|
171
33
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
- type: build-must-pass
|
|
175
|
-
command: npm run build
|
|
176
|
-
- type: test-must-pass
|
|
177
|
-
command: npm test
|
|
178
|
-
```
|
|
34
|
+
That is **13.1.3**, and it leaves `swarm` on your path. Installing from the tag works too, and
|
|
35
|
+
builds itself on install:
|
|
179
36
|
|
|
180
|
-
|
|
37
|
+
npm install -g github:moonrunnerkc/swarm-orchestrator#v13.1.3
|
|
181
38
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
```
|
|
39
|
+
Anything below 13 is a different program. This package name carried a pull-request auditor
|
|
40
|
+
through 12.x, and `npm install -g swarm-orchestrator@12` still installs it, so pin the major if
|
|
41
|
+
you depend on one or the other: [Upgrading from v12](#upgrading-from-v12).
|
|
186
42
|
|
|
187
|
-
|
|
43
|
+
Node 24 or newer. That is a runtime floor rather than a preference: the coverage cycle
|
|
44
|
+
spawns the test runner with `--test-isolation=process`, which Node 22 rejects as a bad
|
|
45
|
+
option, so on anything older that measurement does not happen.
|
|
188
46
|
|
|
189
|
-
|
|
190
|
-
swarm run --goal "add a named export sum(a, b)" \
|
|
191
|
-
--session local --local-backend ollama \
|
|
192
|
-
--local-base-url http://localhost:11434 \
|
|
193
|
-
--local-model-session gemma4:31b \
|
|
194
|
-
--local-grammar none --local-max-concurrency 1 --preset fast
|
|
195
|
-
```
|
|
47
|
+
## Use
|
|
196
48
|
|
|
197
|
-
|
|
49
|
+
swarm "make slugify collapse whitespace and strip punctuation"
|
|
198
50
|
|
|
199
|
-
|
|
51
|
+
swarm gates # run the gates over a workspace, no model
|
|
52
|
+
swarm select # probe this machine, recommend a local model
|
|
53
|
+
swarm calibrate # measure candidate models on the golden set
|
|
54
|
+
swarm routing # what the reward log adds up to
|
|
55
|
+
swarm parallel --tasks <file> # one worktree per task, then a merge queue
|
|
56
|
+
swarm review <bundle> # what a past run produced, and open it
|
|
57
|
+
swarm replay <bundle> # read a bundle back
|
|
200
58
|
|
|
201
|
-
|
|
59
|
+
swarm --no-tui "..." # plain lines even on a terminal
|
|
60
|
+
swarm --no-color "..." # no colour, whatever the terminal says
|
|
61
|
+
swarm --open-evidence "..." # open the review page when it finishes
|
|
62
|
+
swarm --model local:<id> "..." # a specific model
|
|
63
|
+
swarm --workspace <dir> "..." # a repository other than the current directory
|
|
64
|
+
swarm --base <ref> "..." # what the diff and the ratchet measure against
|
|
65
|
+
swarm --attempts <n> "..." # how many times the ratchet may retry a gate
|
|
66
|
+
swarm --max-steps <n> "..." # how long the loop may run before it stops
|
|
67
|
+
swarm --local-endpoint <url> # an OpenAI-compatible server other than the default
|
|
202
68
|
|
|
203
|
-
`swarm
|
|
69
|
+
`swarm --help` prints all of it, including the calibration flags.
|
|
204
70
|
|
|
205
|
-
|
|
71
|
+
Set `ANTHROPIC_API_KEY`, `OPENAI_API_KEY` or `GOOGLE_GENERATIVE_AI_API_KEY` for a frontier
|
|
72
|
+
model, or start Ollama or rapid-mlx and pass `--model local:<id>`. With no model named, the
|
|
73
|
+
router picks one from what the calibration measured on this machine, and `swarm routing` shows
|
|
74
|
+
what it has learned.
|
|
206
75
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
| `swarm audit <ref \| --diff-*>` | Audit a PR or local diff. Advisory by default. |
|
|
210
|
-
| `swarm run --goal "<text>"` | Compile and grade in one step. |
|
|
211
|
-
| `swarm compile <goal>` | Write a reusable compiled contract directory. |
|
|
212
|
-
| `swarm run <contract-dir>` | Grade against a pre-compiled contract directory. |
|
|
213
|
-
| `swarm resume <run-id>` | Resume a killed run from its ledger. |
|
|
214
|
-
| `swarm stats <run-id>` | Aggregate diagnostic counts from a run ledger. |
|
|
215
|
-
| `swarm ledger verify <run-id>` | Verify a hash-chained ledger at rest. |
|
|
216
|
-
| `swarm init` | Scaffold `contract.yaml` and `patches.jsonl`. |
|
|
217
|
-
| `swarm doctor [--fix] [--connectors]` | Probe local prerequisites. |
|
|
76
|
+
Settings live in one optional `swarm.toml`: providers and endpoints, gate definitions, budgets,
|
|
77
|
+
model pins, and the `[interface]`, `[theme]` and `[keys]` tables. Flags win over the file.
|
|
218
78
|
|
|
219
|
-
|
|
79
|
+
## Watching it work
|
|
220
80
|
|
|
221
|
-
|
|
81
|
+
On a terminal, a run draws a single screen you can drive. Off one, it writes the same plain
|
|
82
|
+
lines it always did, so pipes and CI are unchanged.
|
|
222
83
|
|
|
223
|
-
```text
|
|
224
|
-
.swarm/contracts/<id>/contract.jsonl compiled contract (orchestrator mode)
|
|
225
|
-
.swarm/ledger/<run-id>.jsonl orchestrator ledger
|
|
226
|
-
.swarm/ledger/audit-<run-id>.jsonl audit ledger
|
|
227
|
-
.swarm/aibom/<run-id>.cdx.json CycloneDX-ML (when --emit-aibom)
|
|
228
|
-
.swarm/aibom/<run-id>.spdx.json SPDX 3.0 AI-Profile (when --emit-aibom)
|
|
229
|
-
.swarm/shadow/<repo>/<run-id>.json shadow-mode verdict (when --shadow)
|
|
230
84
|
```
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
npm install && npm run build && npm test
|
|
248
|
-
npm run typecheck && npm run lint
|
|
85
|
+
swarm make the parser trim before it splits
|
|
86
|
+
local:qwen3-coder:30b-a3b /Users/brad/projects/scratch-repo 20s step 4 5812 tokens attempt 1/3
|
|
87
|
+
plan
|
|
88
|
+
read the failing test, fix the parser, run the gates
|
|
89
|
+
actions
|
|
90
|
+
edit path=src/parse.ts find=text.split replace=text.trim().split
|
|
91
|
+
shell command=npm test
|
|
92
|
+
shell failed: 1 failing
|
|
93
|
+
ratchet accepted: tests collected 12 to 12, assertions 34 to 35, skips 0 to 0
|
|
94
|
+
gates attempt 1/3
|
|
95
|
+
PASS tests: 12 collected, 0 failed
|
|
96
|
+
PASS lint: no findings in 208 files
|
|
97
|
+
N/A coverage: no lcov artifact was written to the path the harness named
|
|
98
|
+
WARN diff-budget (advisory): 1 file changed, 1 line added, budget 12 files and 400 lines
|
|
99
|
+
DONE stopped: completed (4 steps, 5812 tokens)
|
|
100
|
+
j scroll enter expand tab pane / filter e evidence ? help q detach ctrl+c cancel run
|
|
249
101
|
```
|
|
250
102
|
|
|
251
|
-
|
|
103
|
+
`?` lists every key. `enter` expands a row to its whole payload and the ledger record it came
|
|
104
|
+
from. `q` leaves the view and lets the run finish; `ctrl+c` cancels the run. There is no
|
|
105
|
+
progress bar, because an agent run has no denominator.
|
|
106
|
+
|
|
107
|
+
When the run ends, the screen lists what it produced, says how many claims the harness
|
|
108
|
+
verified and how many it refused, and offers to open the review page. It says the bundle
|
|
109
|
+
verified only if the bundle's own verifier ran here and exited 0. `swarm review <bundle>`
|
|
110
|
+
shows the same panel for any bundle already on disk.
|
|
111
|
+
|
|
112
|
+
The keymap, the `swarm.toml` surface, the degradation matrix, and a recording of a session
|
|
113
|
+
are in [`interface.md`](docs/evidence/2026-08-23/interface.md), with the frames in
|
|
114
|
+
[`interface-frames.txt`](docs/evidence/2026-08-23/interface-frames.txt) and a playable
|
|
115
|
+
asciinema capture in [`interface.cast`](docs/evidence/2026-08-23/interface.cast).
|
|
116
|
+
|
|
117
|
+
## What is claimed
|
|
118
|
+
|
|
119
|
+
Every line here links to a committed artifact of the thing happening. The full table,
|
|
120
|
+
including what backs each one, is [`docs/claims.md`](docs/claims.md).
|
|
121
|
+
|
|
122
|
+
**A green verdict is computed by the harness, and the model cannot produce one.** In a real
|
|
123
|
+
run, the model asserted a predicate the language does not parse. The harness rendered it
|
|
124
|
+
`UNVERIFIED (predicate-unparseable)` and carried on, twice, until the model wrote one that
|
|
125
|
+
could be evaluated:
|
|
126
|
+
[shakedown results](docs/evidence/2026-08-18/shakedown/results.md).
|
|
127
|
+
|
|
128
|
+
**One changed byte breaks verification.** The same bundle, verified and then tampered with
|
|
129
|
+
in a single byte of one record, exit 0 and exit 1 side by side, with a script to reproduce
|
|
130
|
+
it: [tamper demo](docs/evidence/2026-08-18/tamper-demo).
|
|
131
|
+
|
|
132
|
+
**The bundle carries its own verifier, and it works on a machine that has never seen this
|
|
133
|
+
repo.** `node verify.mjs <bundle>` checks the manifest, the chain, the signature, every blob
|
|
134
|
+
against its content address, and recomputes every claim verdict. Run in a `node:24` container
|
|
135
|
+
with no network and no mount of this repository: exit 0 on the committed bundle, exit 1 on the
|
|
136
|
+
same bundle one byte later, with the image digest and both transcripts in
|
|
137
|
+
[`clean-container-verification.md`](docs/evidence/2026-08-23/clean-container-verification.md).
|
|
138
|
+
Transcripts from two earlier runs outside the repository:
|
|
139
|
+
[`live-tasks.md`](docs/evidence/2026-08-18/live-tasks.md).
|
|
140
|
+
|
|
141
|
+
**Bundles are signed from the OS keychain**, not from a key in the workspace. Both manifests
|
|
142
|
+
in [`live-tasks.md`](docs/evidence/2026-08-18/live-tasks.md) say `"keySource": "keychain"` and
|
|
143
|
+
both verifiers confirm it. Where the keychain holds no usable key the run signs with a per-run
|
|
144
|
+
key and says which of the three keychain failures happened, rather than signing quietly with
|
|
145
|
+
something else; the manifest then records `keySource: ephemeral`, which is what the bundles in
|
|
146
|
+
[`installed-package-run.md`](docs/evidence/2026-08-23/installed-package-run.md) carry.
|
|
147
|
+
|
|
148
|
+
**Local model choice is measured on your machine.** The probe output and recommendation from
|
|
149
|
+
real hardware: [`hardware-select.md`](docs/evidence/2026-08-18/hardware-select.md). A hundred
|
|
150
|
+
and eighty calibration runs across three models, distributions rather than averages, with the
|
|
151
|
+
pick ranked against the other two:
|
|
152
|
+
[`calibration-report.md`](docs/evidence/2026-08-23/calibration-report.md).
|
|
153
|
+
|
|
154
|
+
**Eight untrusted boundaries are fuzzed**, and the harnesses are checked against a defect
|
|
155
|
+
injected on purpose so a clean run cannot be a blind one: [`fuzz/`](fuzz/README.md) and
|
|
156
|
+
[`security-coverage.md`](docs/security-coverage.md).
|
|
157
|
+
|
|
158
|
+
**The screen renders from ledger projections, and a keystroke has no route to a verdict.**
|
|
159
|
+
Interactive state is a separate type with a separate reducer, and a test asserts across every
|
|
160
|
+
action that none of its fields can be mistaken for a gate result:
|
|
161
|
+
[`interface.md`](docs/evidence/2026-08-23/interface.md).
|
|
162
|
+
|
|
163
|
+
**Adversarial passes, with each closure locked as a regression test.** Six pass directories
|
|
164
|
+
under [`redteam/`](redteam), 49 cases in `src/evidence/redteam-adversarial.test.ts`, and an
|
|
165
|
+
accounting record mapping each pass to what it actually was, because the driver ledger
|
|
166
|
+
records one completed lap and a directory is not a lap.
|
|
167
|
+
|
|
168
|
+
## What is not claimed
|
|
169
|
+
|
|
170
|
+
Kept short and kept honest, because the point of the rest of this file is that claims cost
|
|
171
|
+
something.
|
|
172
|
+
|
|
173
|
+
- **Not "fully secure".** The secret detector does known-pattern scrubbing, not secret
|
|
174
|
+
removal, with a four-character floor. Zero crashes at a fuzz budget is evidence, not proof.
|
|
175
|
+
- **No benchmark numbers.** Nothing here is measured against another tool. The calibration
|
|
176
|
+
results are self-run, on one machine, and labelled directional in the file itself.
|
|
177
|
+
- **Four known gaps are open**, not closed, and they ship that way. They are in
|
|
178
|
+
[build guide 7.1](docs/build-guide.md), and each is a permanent test case asserting the
|
|
179
|
+
gap as it stands.
|
|
180
|
+
- **A signature does not make the machine honest.** It proves the bundle was not altered
|
|
181
|
+
after it left the machine that produced it. The review page says that on its face.
|
|
182
|
+
|
|
183
|
+
## How it works
|
|
184
|
+
|
|
185
|
+
- **Claims are predicates, not prose.** A claim names a record, a record kind, and a
|
|
186
|
+
machine-checkable predicate. The harness recomputes the record's kind, evaluates the
|
|
187
|
+
predicate, and decides. Model narrative always renders as unverified prose.
|
|
188
|
+
- **The ledger is append-only and hash-chained.** Each record carries the previous record's
|
|
189
|
+
hash. A failed write aborts the run. Nothing is updated or deleted, ever.
|
|
190
|
+
- **Every tool call goes through one chokepoint** that records it, tags its provenance, and
|
|
191
|
+
enforces the sandbox. Credential paths are denied by default and each denial is itself
|
|
192
|
+
recorded.
|
|
193
|
+
- **Gates are data.** A gate declares a command, a parser, and whether it blocks. The engine
|
|
194
|
+
never special-cases one.
|
|
195
|
+
- **The ratchet is numeric.** Tests collected, assertions in touched test files, coverage of
|
|
196
|
+
changed lines, skip markers. Coverage comes from a report the runner wrote where the
|
|
197
|
+
harness told it to, never from what a gate printed, and an unobtainable measure is
|
|
198
|
+
reported as "not measured" rather than as a pass.
|
|
199
|
+
|
|
200
|
+
The full design, including what it refuses to build and why, is in
|
|
201
|
+
[`docs/build-guide.md`](docs/build-guide.md).
|
|
202
|
+
|
|
203
|
+
## Limits
|
|
204
|
+
|
|
205
|
+
Gates prove mechanical quality. They do not prove design quality, and nothing here pretends
|
|
206
|
+
a passing run means the change is good. What the bundle buys you is that reviewing the
|
|
207
|
+
change is fast and that its claims are checkable, not that review is unnecessary.
|
|
208
|
+
|
|
209
|
+
## Upgrading from v12
|
|
210
|
+
|
|
211
|
+
v12 was a PR auditor that ran as a GitHub Action. v13 is a coding agent. Same package name,
|
|
212
|
+
different product, no migration path. If you are using v12, stay on it: it is tagged
|
|
213
|
+
`v12-final`. Details in [`CHANGELOG.md`](CHANGELOG.md).
|
|
252
214
|
|
|
253
215
|
## License
|
|
254
216
|
|
|
255
|
-
[
|
|
217
|
+
ISC. See [`LICENSE`](LICENSE).
|