swarm-orchestrator 14.1.0 → 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 +182 -0
- package/README.md +120 -262
- package/dist/agent-escalation.js +74 -0
- package/dist/agent-escalation.js.map +1 -0
- package/dist/agent-prompt.js +3 -1
- package/dist/agent-prompt.js.map +1 -1
- package/dist/agent-run.js +68 -10
- package/dist/agent-run.js.map +1 -1
- package/dist/cli-bundle.js +0 -23
- package/dist/cli-bundle.js.map +1 -1
- package/dist/cli-calibrate.js +2 -1
- package/dist/cli-calibrate.js.map +1 -1
- package/dist/cli-ci.js +56 -32
- package/dist/cli-ci.js.map +1 -1
- package/dist/cli-command-definitions.js +6 -3
- package/dist/cli-command-definitions.js.map +1 -1
- 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 +114 -1
- package/dist/cli-init.js.map +1 -1
- package/dist/cli-model-default.js +107 -0
- package/dist/cli-model-default.js.map +1 -0
- package/dist/cli-options.js +63 -126
- package/dist/cli-options.js.map +1 -1
- package/dist/cli-parallel.js +9 -3
- package/dist/cli-parallel.js.map +1 -1
- 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-settings.js +0 -15
- package/dist/cli-run-settings.js.map +1 -1
- package/dist/cli-select.js +10 -4
- package/dist/cli-select.js.map +1 -1
- package/dist/cli-session.js +48 -8
- package/dist/cli-session.js.map +1 -1
- package/dist/cli-task-contract.js +24 -0
- package/dist/cli-task-contract.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 +5 -0
- package/dist/cli-terminal.js.map +1 -1
- 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 +170 -157
- 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/degenerate-output.js +44 -0
- package/dist/core/degenerate-output.js.map +1 -0
- package/dist/core/loop.js +88 -8
- package/dist/core/loop.js.map +1 -1
- package/dist/core/termination.js.map +1 -1
- package/dist/durable/recovery-context.js +76 -1
- package/dist/durable/recovery-context.js.map +1 -1
- package/dist/eval/agent-session.js +146 -0
- package/dist/eval/agent-session.js.map +1 -0
- package/dist/eval/arms.js +13 -5
- package/dist/eval/arms.js.map +1 -1
- package/dist/eval/campaign-run.js +2 -1
- package/dist/eval/campaign-run.js.map +1 -1
- package/dist/eval/empty-patch-attribution.js +9 -5
- package/dist/eval/empty-patch-attribution.js.map +1 -1
- package/dist/eval/endpoint-health.js +126 -0
- package/dist/eval/endpoint-health.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/frozen-campaign.js.map +1 -1
- package/dist/eval/known-total.js +7 -0
- package/dist/eval/known-total.js.map +1 -0
- 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/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/statistics.js +168 -0
- package/dist/eval/statistics.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.js +21 -4
- package/dist/evidence/bundle.js.map +1 -1
- package/dist/evidence/ci-summary.js +58 -0
- package/dist/evidence/ci-summary.js.map +1 -0
- package/dist/evidence/goal-contract.js +8 -0
- package/dist/evidence/goal-contract.js.map +1 -1
- package/dist/evidence/ledger-record.js +2 -0
- package/dist/evidence/ledger-record.js.map +1 -1
- package/dist/evidence/model-call-recording.js +3 -0
- package/dist/evidence/model-call-recording.js.map +1 -1
- package/dist/evidence/predicate-catalogue.js +22 -0
- package/dist/evidence/predicate-catalogue.js.map +1 -1
- package/dist/evidence/run-assessment.js +65 -1
- package/dist/evidence/run-assessment.js.map +1 -1
- package/dist/evidence/run-spec.js +6 -3
- package/dist/evidence/run-spec.js.map +1 -1
- package/dist/evidence/signing.js +10 -0
- package/dist/evidence/signing.js.map +1 -1
- package/dist/evidence/task-preset.js +52 -0
- package/dist/evidence/task-preset.js.map +1 -0
- package/dist/evidence/verdict.js +36 -1
- 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/rederive.d.mts +7 -1
- package/dist/evidence/verifier/rederive.mjs +12 -59
- 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.mjs +140 -5
- package/dist/exec/child-environment.js +4 -0
- package/dist/exec/child-environment.js.map +1 -1
- package/dist/exec/container-backend.js +42 -4
- 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/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/run-process.js +5 -1
- package/dist/exec/run-process.js.map +1 -1
- 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/change-source.js +150 -0
- package/dist/gates/change-source.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 +14 -2
- package/dist/gates/dependency-install.js.map +1 -1
- package/dist/gates/engine.js +12 -1
- 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 +78 -11
- 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 +41 -46
- 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 +79 -11
- package/dist/gates/goal-acceptance.js.map +1 -1
- package/dist/gates/goal-checkout.js +40 -4
- package/dist/gates/goal-checkout.js.map +1 -1
- 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 +227 -48
- 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/node-command-runner.js +16 -2
- 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/oracle-instrumentation.js +8 -2
- package/dist/gates/oracle-instrumentation.js.map +1 -1
- package/dist/gates/oracle-mutants.js +2 -2
- package/dist/gates/oracle-mutants.js.map +1 -1
- package/dist/gates/oracle-reach.js +58 -5
- package/dist/gates/oracle-reach.js.map +1 -1
- 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 +39 -0
- 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/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/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/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/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/served-pick.js +36 -0
- package/dist/select/served-pick.js.map +1 -0
- package/dist/swarm-verify.js +51 -0
- package/dist/swarm-verify.js.map +1 -0
- package/dist/tools/chokepoint-record.js +14 -1
- package/dist/tools/chokepoint-record.js.map +1 -1
- package/dist/tools/chokepoint.js +41 -2
- package/dist/tools/chokepoint.js.map +1 -1
- package/dist/tools/policy-guard.js +7 -0
- package/dist/tools/policy-guard.js.map +1 -1
- package/dist/tui/confirmation-queue.js +6 -6
- package/dist/tui/confirmation-queue.js.map +1 -1
- 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/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 +20 -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 +10 -0
- package/dist/tui/session-view.js.map +1 -1
- package/dist/workers/controller-configuration.js +3 -1
- package/dist/workers/controller-configuration.js.map +1 -1
- package/dist/workers/controller-jobs.js +1 -1
- package/dist/workers/controller-jobs.js.map +1 -1
- package/dist/workers/controller-state.js +2 -0
- package/dist/workers/controller-state.js.map +1 -1
- package/dist/workers/merge-queue.js +1 -0
- package/dist/workers/merge-queue.js.map +1 -1
- package/dist/workers/planner-run.js +1 -1
- package/dist/workers/planner-run.js.map +1 -1
- package/docs/README.md +4 -1
- package/docs/build-guide.md +10 -2
- package/docs/security-coverage.md +21 -0
- package/package.json +8 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,187 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 14.2.0 - 2026-09-27
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- Rejected acceptance authority for candidate-controlled Playwright JSON. Sealed browser
|
|
8
|
+
instruments use harness configuration, immutable image dependencies and exact test identities.
|
|
9
|
+
- Retained unavailable package checks through sealing, final assessment and reviewer reports,
|
|
10
|
+
separating absent optional tools from unavailable required checks.
|
|
11
|
+
- Provisioned Chromium and the isolated browser runtime in clean Linux gate workflows;
|
|
12
|
+
nightly failure notifications no longer require an optional repository label.
|
|
13
|
+
- Reopened the prior completion claim after the independent audit. Corrective delivery and
|
|
14
|
+
release status are tracked in [audit corrections](docs/upgrade-audit-corrections.md).
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- Shared model-free branch/PR snapshot verification, reviewer Markdown and versioned JSON source
|
|
19
|
+
identities alongside patch mode. Standalone source tarballs build and install without providers.
|
|
20
|
+
- Declared npm/pnpm and uv/existing-venv initialization, explicit package scopes, structured
|
|
21
|
+
Vitest/pytest outcomes, and sealed CLI, local HTTP and optional Playwright behavior checks.
|
|
22
|
+
- Bugfix, refactor and dependency-upgrade presets on the existing engine, with base controls,
|
|
23
|
+
narrow manifest authorization, locked preparation and recorded installed versions.
|
|
24
|
+
- One explicitly authorized capability escalation with deterministic failure classification,
|
|
25
|
+
original budget limits and recovery reconciliation. A configured cloud key grants no consent.
|
|
26
|
+
- Trusted-source Action infrastructure and separate good/bad behavioral workflow controls.
|
|
27
|
+
Source delivery and package publication remain separate; exact validation is tracked in
|
|
28
|
+
[the upgrade ledger](docs/upgrade-completion.md).
|
|
29
|
+
|
|
30
|
+
- **An approval mode, asked once per workspace.** The first terminal run asks whether commands
|
|
31
|
+
off the shell allowlist may be approved automatically and writes the answer to `swarm.toml`
|
|
32
|
+
as `[tools] approval`; `--approve ask|auto` and `SWARM_APPROVAL` override it. Under `auto` the
|
|
33
|
+
run answers an allowlist prompt itself and records it as pre-approved; a derivation-heuristic
|
|
34
|
+
prompt, the injection defence, asks under either mode. Every prompt gains `a`, always: the
|
|
35
|
+
call runs and its off-list programs are allowed for the rest of that run, recorded as a
|
|
36
|
+
`run-allowance` ledger record. The screen's header shows the mode.
|
|
37
|
+
- **The default model is the best served local model for this hardware.** With nothing pinned
|
|
38
|
+
and no calibration, a run discovers the local backends, ranks what they serve by the
|
|
39
|
+
shortlist's tier for the probed hardware, prints the choice and its reason before the session
|
|
40
|
+
opens, and records it as a `model-default` ledger record. A frontier key is used only where
|
|
41
|
+
nothing local is served; with neither, the run stops and names the remedies instead of
|
|
42
|
+
defaulting to a provider it has no key for.
|
|
43
|
+
- **A preflight card, and a screen that says what became of each step.** Before the screen goes
|
|
44
|
+
up, `swarm run` and `swarm session` print four lines to stderr naming the repository and base
|
|
45
|
+
commit, the manifest, the model with the reason it was chosen, and the approval mode. On the
|
|
46
|
+
screen, the header's second line reads elapsed, step, tokens, attempt, ratchet, model,
|
|
47
|
+
approval and workspace, and stays at every width; each timeline row starts with a status
|
|
48
|
+
mark and the clock time it landed; the gate strip counts passed, failed and not-applicable.
|
|
49
|
+
A finished run ends on a finish card: the verdict, duration, steps, tokens and cost, then the
|
|
50
|
+
review page and the bundle as rows a terminal that understands OSC 8 shows as clickable
|
|
51
|
+
links. Marks fall back to ASCII where the locale is not UTF-8. The plain-line stream that CI
|
|
52
|
+
and pipes read is byte-identical to before.
|
|
53
|
+
- **`swarm-verify`, the verification path as its own package.** `packages/swarm-verify` builds a
|
|
54
|
+
binary carrying `verify`, `ci` and `gates` from the same modules `swarm` runs under those names,
|
|
55
|
+
parsed by the same parser, so an invocation reads the same through either. It carries no
|
|
56
|
+
provider, worker or screen module and none of the agent's run assembly: a test walks its import
|
|
57
|
+
closure and the build refuses to emit a crossing. A test verifies a committed bundle through
|
|
58
|
+
both binaries and compares the bytes. Version 0.2.0 has a separate release workflow; the packaged check
|
|
59
|
+
packs it, installs it beside the full CLI, and runs the tamper demo through it.
|
|
60
|
+
- **An agent can record a file as temporary, and is held to removing it.** `declare_file_set`
|
|
61
|
+
and `amend_file_set` take `temporary`: paths created only to investigate, such as a probe
|
|
62
|
+
script. The blocking `file-set` gate fails while one is still in the change and names it. An
|
|
63
|
+
amendment can keep one on purpose with `retain`, and its reason then shows on the ledger, in the
|
|
64
|
+
reviewer's claim and in the gate's output on every pass. Nothing is deleted behind the model's
|
|
65
|
+
back and nothing reads a filename. Two repairs in the reach-pressure run left a scratch script
|
|
66
|
+
in their final patch, and membership alone had passed both.
|
|
67
|
+
- **Derived evidence packs losslessly inside the tree.** `scripts/evidence-pack.mjs` packs tracked
|
|
68
|
+
review pages and run transcripts under a root into one `utf8-file-map-brotli` archive with a
|
|
69
|
+
digest for every original, removes originals only after the written archive has been unpacked
|
|
70
|
+
and compared, and `npm run checks` verifies every committed pack. Ledgers, DAGs, manifests and
|
|
71
|
+
verifiers can never be packed. The tracked tree went from 99.8 MB to about 90.5 MB with every
|
|
72
|
+
cited bundle still verifying, and the weight check now also requires 6 MB of headroom so the next
|
|
73
|
+
experiment's evidence has somewhere to go.
|
|
74
|
+
- **A repair is read as what it did to the verifier's findings.** Experiment rows record, per
|
|
75
|
+
invocation, one of `patch-unchanged`, `findings-identical`, `findings-moved`, `findings-shrank`,
|
|
76
|
+
`findings-grew` or `satisfied`, with both finding sets, both patch digests and the files that
|
|
77
|
+
entered or left the patch, plus the same from the fork to the final patch. No score is computed.
|
|
78
|
+
Generation 3's nine "repairs exhausted" split into six unchanged patches, two that grew the
|
|
79
|
+
findings by leaving a scratch file, and one that changed bytes and no finding.
|
|
80
|
+
|
|
81
|
+
### Fixed
|
|
82
|
+
|
|
83
|
+
- **Reach reports `unmeasured`, not `reached`, for a change it could not measure at all.** A
|
|
84
|
+
change made only of documentation, types and its own tests skipped every file, left nothing
|
|
85
|
+
unreached and read as a measurement. Certification treats the two alike; a reader does not.
|
|
86
|
+
The verdict now carries every file reach set aside with its reason (`setAsideByReach`) and
|
|
87
|
+
`swarm ci` prints them. One path rule serves reach, the mutant planner, the patch metrics and
|
|
88
|
+
the PR miner, which had each spelled it separately: the miner still read a tsd type test as
|
|
89
|
+
source. tsd's `test-d/` directory and the `_test` suffix are recognized, and scratch scripts and
|
|
90
|
+
JavaScript tool configuration stay judged.
|
|
91
|
+
- **Three campaign runners asked whether the model lists, not whether it generates.** A wedged
|
|
92
|
+
local server answers `/models` and completes nothing. `pr-task-pass` probed `/models`, and only
|
|
93
|
+
when a patch was empty, so a partial patch left by a server that died was judged as the model's;
|
|
94
|
+
the pilot campaign's health effect returned the literal `healthy: true`; `run-campaign` had no
|
|
95
|
+
probe. All three ask the configured model for a bounded completion after every invocation. The
|
|
96
|
+
probes are `endpointListsModels` and `endpointGenerates` in a module of their own, the second
|
|
97
|
+
names why it failed, and `pr-task-pass` keeps an infrastructure attempt apart from `runs`, where
|
|
98
|
+
it used to mark its task done and get re-judged.
|
|
99
|
+
- **A failed model call records whether the harness cancelled it.** A call cut off at the wall
|
|
100
|
+
budget and a provider that raised were both `call-failed`. Every unknown-usage invocation of the
|
|
101
|
+
reach-pressure run was the first kind, and nothing on the ledger said so.
|
|
102
|
+
- **Unknown usage is no longer added in as zero.** The experiment analysis summed a null model-call
|
|
103
|
+
count as 0; arm scoring priced a crashed run at $0 and printed dollars per accepted patch off the
|
|
104
|
+
sum; calibration divided all tokens by all time, so a model with one call cut off measured
|
|
105
|
+
slower than it is. A total is a number only where every part was measured, and the known part
|
|
106
|
+
is kept under its own name. The core loop's token total is unchanged and now travels with
|
|
107
|
+
`callsWithUnknownUsage`.
|
|
108
|
+
- **The experiment analyzer cannot overwrite what a run published.** `analyze` wrote its summary
|
|
109
|
+
and page in place. It now refuses where the bytes differ and writes to `--out` with a
|
|
110
|
+
`derivation.json` naming the acquisition identity, the identities it was derived with, and every
|
|
111
|
+
value changed, added or removed. `run` and `score` refuse to write beside rows of another
|
|
112
|
+
protocol identity, which only `analyze` had checked, and identity is read before a row is
|
|
113
|
+
parsed. Generation 3's published summary re-derives with no value changed.
|
|
114
|
+
- **The router considers every model the table has measured, not only the last sweep's pair.**
|
|
115
|
+
The calibration pick's candidates were the models the last sweep ran together, so a model with
|
|
116
|
+
the best evidence of all on a class was never in the running when a later sweep happened not
|
|
117
|
+
to include it: on one machine qwen3.6 held the best edit share across two sweeps and the router
|
|
118
|
+
chose between gemma4 and mistral. The candidates are now the pick's own plus every model the
|
|
119
|
+
competency table has measured on the task's class, on the same golden set, at or above the
|
|
120
|
+
floor, restricted as before to what the backend serves.
|
|
121
|
+
- **A turn cut off at the output cap is not a completion.** A live run's only turn was the
|
|
122
|
+
marker `<channel|>` repeated to the 8192-token cap around a fragment of a plan, with no tool
|
|
123
|
+
called; the loop read the cut-off text as the model's account of finishing, the gates ran
|
|
124
|
+
green over an unchanged workspace, and the run ended "work accepted" with nothing written.
|
|
125
|
+
Two of five samples of the same request against gemma4:31b behind Ollama spiral the same way.
|
|
126
|
+
A turn cut off at the cap before it called a tool is now sampled again, its text never becomes
|
|
127
|
+
the plan or the claim, and a run whose every sample is cut off stops as `output-cap`. A stream
|
|
128
|
+
that repeats one short unit 96 times in a row is cut off there and sampled again, rather than
|
|
129
|
+
running minutes to the cap. The finish card over an unchanged workspace says nothing was done
|
|
130
|
+
instead of repeating the assessment, and the header's elapsed counter stops when the card
|
|
131
|
+
goes up.
|
|
132
|
+
- **A run stops before the session where it could never go green.** A directory that is not a
|
|
133
|
+
repository, a `--base` that does not resolve, and a repository with no manifest each used to be
|
|
134
|
+
found out after the model had worked: eight steps in one case, three attempts and 112,000
|
|
135
|
+
tokens in another, then a first gate saying "add the manifest". `run` and `session` now check
|
|
136
|
+
the base commit and the manifest first. With no manifest, `swarm` on a terminal offers to add
|
|
137
|
+
a Node harness (`package.json` running `node --test`, and `.gitignore`) and commit it; off a
|
|
138
|
+
terminal, or declined, it stops with the remedy named.
|
|
139
|
+
- **An interpreter cache is not a change.** Running a Python test writes `__pycache__`, and the
|
|
140
|
+
file-set gate charged that as an edit outside the declared set, after which the ratchet
|
|
141
|
+
rejected the attempt for a gate that had passed before and discarded the work. `__pycache__`,
|
|
142
|
+
`.pytest_cache`, `.mypy_cache` and `.ruff_cache` are excluded from the change set by name.
|
|
143
|
+
- **A stopped run says what stopped it.** A cancellation during a model call reported "model
|
|
144
|
+
error: This operation was aborted", the transport's words. The signal now carries the reason
|
|
145
|
+
(cancelled from the keyboard, or the run's wall budget spent) and the loop reports it.
|
|
146
|
+
- **A refused assessment names only what refused.** The status line read "work refused: work
|
|
147
|
+
refused: required checks passed, lifecycle interrupted, ..." beside four failed gates. It now
|
|
148
|
+
reads, for example, "work refused: the gates settled escalated; the run was cancelled".
|
|
149
|
+
- **The macOS keychain is asked whether a default keychain exists before a signing key is
|
|
150
|
+
added.** `security add-generic-password` with no default keychain raises a dialog and blocks
|
|
151
|
+
until the store kills it; the probe fails cleanly instead and the run signs with a per-run key.
|
|
152
|
+
|
|
153
|
+
### Measured
|
|
154
|
+
|
|
155
|
+
- **Enforcing changed-line reach after visible acceptance changed no held-back verdict in 79
|
|
156
|
+
mined tasks.** A pre-registered shared-prefix experiment ran each task until the visible half of
|
|
157
|
+
its oracle first accepted, took that patch as the control, and forked a reach condition from the
|
|
158
|
+
same workspace that was told which added lines the oracle never executed. Thirteen tasks reached
|
|
159
|
+
visible acceptance, reach triggered on nine, no repair satisfied it, and the held-back half
|
|
160
|
+
agreed on every pair: 12 pass both, 67 fail both, zero discordant, exact McNemar p = 1, paired
|
|
161
|
+
difference 0.0 points, 95% CI [-4.0, +4.0]. Three repairs changed bytes, none narrowed the
|
|
162
|
+
implementation, two left scratch files behind. Six of the nine refusals named a tsd type-test
|
|
163
|
+
file no runner executes. The protocol, rows, patches and a report that re-derives from the rows
|
|
164
|
+
are in [`docs/evidence/2026-09-17/reach-pressure-experiment/`](docs/evidence/2026-09-17/reach-pressure-experiment/report.md).
|
|
165
|
+
Two earlier generations were stopped on instrument defects and are kept beside it. The instrument
|
|
166
|
+
defects it exposed, and what closed each without touching a row, are in
|
|
167
|
+
[`docs/evidence/2026-09-18/reach-pressure-hardening/`](docs/evidence/2026-09-18/reach-pressure-hardening/README.md).
|
|
168
|
+
|
|
169
|
+
### Changed
|
|
170
|
+
|
|
171
|
+
- **The verify-only commands are command definition data.** `verify`, `ci` and `gates` are marked
|
|
172
|
+
as needing no model, and a test runs each through the real CLI with no provider key and the
|
|
173
|
+
local endpoint pinned to a closed port. `docs/verify-only.md` walks all three through on
|
|
174
|
+
committed artifacts, with every transcript captured from the command it sits under.
|
|
175
|
+
|
|
176
|
+
- **Node 22 runs the tool; Node 24 is needed only for the coverage measurement.** The whole CLI
|
|
177
|
+
refused to start below Node 24 because the changed-line coverage arm spawns node's test runner
|
|
178
|
+
with `--test-isolation=process`, which Node 22 rejects. Now `engines.node` is `>=22`, every
|
|
179
|
+
command runs there, and on a Node below 24 the tests gate runs the project's own test command
|
|
180
|
+
while the coverage arm reports `unmeasured` with the reason named in the gate-run record and in
|
|
181
|
+
the ratchet's abstention. Unmeasured never renders as a pass, so a change touching covered
|
|
182
|
+
lines fails the ratchet on that runtime rather than passing quietly. `swarm doctor` reports
|
|
183
|
+
which Node it found and what that disables.
|
|
184
|
+
|
|
3
185
|
## 14.1.0 - 2026-09-14
|
|
4
186
|
|
|
5
187
|
### Added
|