swarm-orchestrator 14.3.0 → 14.4.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 CHANGED
@@ -1,528 +1,52 @@
1
- # Changelog
1
+ # Changelog: swarm-orchestrator
2
2
 
3
- ## 1.3.0 - 2026-09-29
3
+ The coding agent. The standalone verifier it is built on, `swarm-verify`, has its own changelog at
4
+ [packages/swarm-verify/CHANGELOG.md](packages/swarm-verify/CHANGELOG.md); an agent release names
5
+ the verifier version it carries rather than repeating those entries.
4
6
 
5
- Defects found by the sixteen-repository rollout of 1.2.0, each reproduced from a recorded run
6
- and fixed at the root. The verdicts that change are named below. The minor version is for the
7
- new attribution rule, `failure-identity-v3`, which new records carry; a record written under
8
- `failure-identity-v2` or v1 re-derives under the rule that wrote it.
7
+ ## 14.4.0 - 2026-10-08
9
8
 
10
- ### Fixed
11
-
12
- - **Build runs before every check that can read its output.** 1.2.0 moved the build ahead of
13
- tests only. A pnpm workspace whose per-package `tsc --noEmit` resolves its siblings through the
14
- `dist/index.d.ts` that `tsc --build` writes, as its own CI builds first, read a failed typecheck
15
- on a clean tree. The build now runs first, then typecheck, lint, format and tests. **Verdict
16
- change:** such a project reads its real typecheck and lint results instead of a failure caused
17
- by the order.
18
- - **A failed check records what its runner printed.** Node checks ran as `npm run --silent`,
19
- and npm hands that log level to the script as `npm_config_loglevel=silent`. pnpm reads it, so a
20
- failed `pnpm -r run typecheck` recorded an exit code with empty output. Checks now run as
21
- `npm run --loglevel=error`, which keeps npm's notices out of the record and every tool's errors
22
- in it; `swarm init` writes the same form. No verdict changes: the failure is still a failure,
23
- now with its reason.
24
- - **The base control sees nothing the patched tree's run produced.** The base was measured in
25
- the same checkout after a forced checkout and a clean that keeps ignored files, so the base's
26
- checks ran beside the patched tree's build output. depose's base typecheck passed on the `dist/`
27
- the patched build wrote, and a workflow-only patch read **Regression: fail**; a module only the
28
- patched build emitted stayed in `dist/` and failed the base's suite the same way, so a real
29
- regression read as inherited. The ignored tree is now recorded once dependencies are prepared,
30
- and every switch between the two sides removes what was added since; a prepared entry a run
31
- changed refuses the comparison. Where the patch changes a lockfile, nothing installed is shared:
32
- the base installs its own dependencies from its own lockfile. **Verdict changes:** such a
33
- workflow-only patch reads its real regression result, and a patch whose build output or
34
- dependency change broke the suite reads **Regression: fail** instead of an inherited failure.
35
- - **A failure that differs only in a temporary directory's random name is inherited.** The base
36
- and the patch failed the same three tests, and two causes differed only in pre-commit's random
37
- repository directory (`...eponyx5xidu` against `...epoc90ac5y6`), so the failures could not be
38
- matched and the regression read unmeasured. Causes and outputs are now compared with generated
39
- names set aside: platform temporary roots, digit-bearing directory names under them, and a
40
- generated name's tail where a reporter elided the rest. A file's own name, a path outside a
41
- temporary root and every other word still count, so a changed message still reads as changed.
42
- New records carry `failure-identity-v3`; a record written under v2 re-derives under v2. The
43
- advice for an unmatched failure now says why it could not be matched, instead of saying the
44
- output names no tests when it names them. **Verdict change:** such inherited failures read
45
- inherited, so the regression dimension is measured instead of unmeasured.
46
- - **A base control whose worker crashed on exit still shows a regression.** quantproof's base
47
- ran its whole suite, failed no test, and exited 1 when a Vitest worker aborted on exit (a
48
- better-sqlite3 assertion under Node 24), leaving one file's tests pending. Its report no longer
49
- reconciled, so the two tests the patch broke, which that report names as passing, read
50
- unmeasured. Where the base names no failure and was not killed by the harness, a test it names
51
- passing once and the patch fails is now newly failing. A test the base never finished, a killed
52
- or cut run, or a base that names a failure of its own stays unmeasured, and nothing is ever
53
- inherited this way. **Verdict change:** such a run reads **Regression: fail** instead of
54
- unmeasured.
55
- - **The advice for a run that measured nothing says the right thing.** Where the install already
56
- ran (the Action's `install: true` is passed as `--install`), a runner still missing was followed
57
- by "pass --install"; it now says the environment does not carry that toolchain and names the
58
- image setting for each route. Where it did not run, it names both routes' setting. A run that
59
- planned no check printed "every check stood down ()"; it now says no check was planned and why,
60
- and no longer suggests a `--command` flag the verifier does not have. No verdict changes.
61
-
62
- ## 1.2.0 - 2026-09-29
63
-
64
- Fixes found by running the published 1.1.0 where a stranger would: fresh virtual machines, the
65
- real pre-commit framework, hooks installed through `npx`, and a sixteen-repository rollout.
66
- The verdicts that change are named below. The minor version is for two additive outputs: an `excludedEnvironments` field in the
67
- `check` JSON report and an `excluded-environments-v1` record; no existing record field, exit code
68
- or rule name changes meaning.
69
-
70
- ### Fixed
71
-
72
- - **Build runs before tests.** Checks ran a Node project's `test` script before its `build`
73
- script. A suite that reads build output (a Vite and Workers project whose test script reads the
74
- built asset directory, found in a fresh-VM onboarding run) failed on a clean tree, where its own
75
- CI, which builds first, passes. The build check now runs first. **Verdict change:** such a
76
- project reads its real test result instead of a failure caused by the order.
77
- - **The pre-commit framework hook works.** The distribution declared a `node` language hook. The
78
- framework installs that from git, which npm 11 refuses (`EALLOWGIT`), blocking every commit,
79
- good or bad; under npm 10 the install linked no `swarm-verify` binary, so whichever binary was
80
- on `PATH` answered. The hook now runs `npx --yes swarm-verify@<version> pre-commit`. Exercised
81
- against the framework on npm 11.12.1 and 10.9.8: a bad staged change is refused and a good one
82
- committed. Use `rev: v1.2.0` or later.
83
- - **Installed hooks survive npm clearing its npx cache.** Run as `npx swarm-verify hook install`
84
- or `npx swarm-verify pre-commit install`, the installers wrote an absolute path inside the npx
85
- cache. From there they now write the pinned `npx` invocation; a project or global install is
86
- still called directly.
87
- - **The Claude Code hook routes a piped test command.** `npm test 2>&1 | tail -5` and the same
88
- through `head` or `grep` with plain arguments are routed through `check` with the filters kept;
89
- any other pipeline stage or shell syntax is still left alone.
90
- - **A bundle whose required challenge refused verifies.** The bundle's own verifier failed the
91
- "independent goal bound" check of a `--challenges required` run that refused for
92
- `challenges-unmet`, although the refusal was correct.
93
- - **A formatter check runs only where the project declares that formatter.** Any `[tool.ruff]`
94
- table used to add `ruff format --check .`, so projects that lint with ruff and format with black
95
- or not at all read `fail` on a clean checkout (four real repositories, 4 to 151 files each). The
96
- format check now runs `ruff format --check .` only for a `[tool.ruff.format]` table or a
97
- `ruff-format` pre-commit hook, and `black --check .` for a `[tool.black]` table or a `black`
98
- hook, unavailable with the tool named when the project's environment does not hold it. Verdict
99
- change: a project with ruff lint configuration and no declared formatter no longer fails `check`
100
- on formatting; its format check reads not run, with the reason.
101
- - **mypy keeps the scope the project's mypy configuration names.** Only `pyproject.toml` and
102
- `setup.cfg` `files` were read, so a project scoping mypy in `mypy.ini` (`files = src`) was
103
- checked with `mypy .` and failed on 180 errors in tests it never type-checks. Targets are now
104
- read from `files`, `packages` or `modules` in the one file mypy itself reads, in its documented
105
- order (`mypy.ini`, `.mypy.ini`, `pyproject.toml` with `[tool.mypy]`, `setup.cfg` with
106
- `[mypy]`). Verdict change: such a project's typecheck runs plain `mypy` and can pass; a project
107
- whose `pyproject.toml` names targets while a `mypy.ini` without them takes precedence now runs
108
- `mypy .` instead of a bare `mypy` that exited asking for a target.
109
- - **An untracked virtual environment is not the change `check` measures.** A `.venv` made by
110
- `python3 -m venv` before Python 3.13 carries no `.gitignore`, and in a project that does not
111
- ignore `.venv/` its every file counted as changed: a clean tavern checkout read 81 changed files
112
- and failed the placeholder, secret and diff-budget checks on the environment's own files. An
113
- untracked directory whose root holds a `pyvenv.cfg` with a `home` key is now left out of the
114
- change and named (`excluded` in the output, `excludedEnvironments` in the JSON report, an
115
- `excluded-environments-v1` record in the evidence). A tracked or staged `pyvenv.cfg`, a
116
- directory holding anything tracked, and every file a `ci` patch adds are still checked. Verdict
117
- change: such a tree no longer fails `check` on its environment's files.
118
- - **A dependency whose install script builds its native binding is measurable under
119
- `--install`.** With scripts off, `better-sqlite3` never had its binding, so every test that
120
- opened a database failed at base and head alike and the verdict read incomplete. The install
121
- scripts `npm ci --ignore-scripts` skipped now run as a deferred phase with `npm rebuild`, where
122
- the checks run, only after a probe shows a check-time command cannot connect, and with
123
- node-gyp pointed at the running node's own headers so the build needs no download. Registry
124
- code still never runs with network access: on the host, or wherever the probe cannot show the
125
- network is off, the deferred scripts do not run and the install detail says why. A script
126
- that tries the network there is refused and its output is reported.
127
- - **A uv project in src layout is installed before its tests run.** `uv sync
128
- --no-install-project` left the project itself out, so tests could not import the package or
129
- call its console scripts. The project is now installed editable in the deferred offline phase:
130
- the build backend's requirements are fetched as wheels without being run, the backend builds
131
- the editable wheel offline, and uv installs it offline.
132
- - **A script that calls pnpm finds the pnpm that installed.** Where the image has no pnpm and
133
- the install fetched the declared version for its own command, a script such as
134
- `pnpm -r run typecheck` read `pnpm: not found` and the check was unmeasured. The same version
135
- is kept in the checkout's `node_modules` and put first on the checks' PATH through the built
136
- environment.
137
- - **The uv install no longer builds anything while the registry is reachable.** `uv sync
138
- --no-install-project` still built every dependency that ships only a source archive (the
139
- real `docopt==0.6.2` is one) and every workspace member, which runs that package's setup.py
140
- or build backend with the network on: a fixture archive whose setup.py tries a connection got
141
- through and wrote into the checkout. The install now runs with `--no-build` and leaves those
142
- packages out by name; in the deferred offline phase a source archive's bytes are fetched and
143
- checked against the lockfile's sha256 (`stage: source-archive`, nothing executed), unpacked
144
- and built offline, and a workspace member or local directory is built offline from the
145
- checkout, each step recorded. A setup.py that tries the network there is refused and its
146
- output reported. A git source or an archive whose hash cannot be checked is left out of the
147
- install with its reason named, so a check that needs it reads what it is rather than a pass.
148
-
149
- Each deferred step is its own intent and completion on the `dependency-install` record, naming
150
- its stage and its network (`none` with the probe's result for offline work), so a reader sees
151
- which scripts ran offline and which fetch reached the registry. A deferred step that fails is
152
- reported and the checks still run; one that changes source files fails setup.
153
-
154
- ### Documentation
155
-
156
- - Every documented Action workflow shows `install: true`, without which a repository with
157
- dependencies reads incomplete.
158
-
159
- ## 1.1.0 - 2026-09-29
160
-
161
- Two false passes reported against the published 1.0.7, reproduced on it and fixed at the root,
162
- and four more found while building real controls for every attack family. Some verdicts change
163
- because of these repairs: each change is named below, a pass that was not shown now reads
164
- incomplete or unmeasured rather than passed, and none of them turns an old refusal into a pass.
165
- Additive record fields and one additive flag take the minor version; no field, exit code or rule
166
- name changes meaning, and records written before a rule keep re-deriving under the rule that
167
- wrote them.
168
-
169
- ### Fixed
170
-
171
- - **A pass the candidate's own instrument reported is not a pass.** On 1.0.7 a
172
- `vitest.config.mjs` that wrote a passing report to Vitest's `--outputFile` and exited before
173
- any test ran read `result: pass` from `check`, and a `test` script replaced by an `echo` of a
174
- passing summary read as a pass from `check` and as a regression pass from `ci`. The 1.0.6 fix
175
- read a list of configuration file names; it could not see a configuration importing a changed
176
- helper, a setup file named another way, the package scripts npm reads from the working tree,
177
- or a runner substituted through the manifest, the lockfile or `node_modules/.bin`. Each
178
- command check now observes its instrument (`instrument-identity-v1`): the scripts its command
179
- reaches, each tool's configuration by the names the tool discovers, every file those import or
180
- name, where the tool's packages come from, and the runner as installed, compared with the
181
- reference commit before and after the run. A pass reported under an instrument the change
182
- altered is withheld: `check` reads incomplete (exit 4) naming the altered files, and `ci`
183
- reruns the check with the base's instrument restored, where only that reading can let the pass
184
- stand. The observation is on the `gate-run` record and the offline verifier applies the same
185
- rule. A registry release of a tool at another version is recorded and trusted; a tool from a
186
- path, URL, git source or another package's name is not.
187
- - **Two failing tests with the same title are two failures.** On 1.0.7 two node tests both named
188
- `works`, the first already failing at the base, collapsed to one TAP identity, so a patch that
189
- broke the second read as the first's inherited failure: `inheritedFromBase: true`,
190
- `regression: pass`, and the Action's `regression-only`. Under `failure-identity-v2` a node
191
- failure is named by its TAP location, depth and title, a Vitest test by file and full name, a
192
- pytest test by node id; failures are counted, compared with their cause, and never inherited
193
- from a run that was cancelled, truncated, cut short of its plan, contradicts its own counters,
194
- or repeats an identity. Checks carry `attributionRule`; a record without it re-derives under
195
- the title-only rule that wrote it.
196
- - **A patch cannot pass `ci` by editing the test that would catch it.** A patch that broke the
197
- code and marked the catching test `skip`, deleted its file or rewrote its assertion read as a
198
- regression pass. Where a patch changes or deletes test files, the checks run again with the
199
- base's versions of those files over the patch's source; a test the base passed that fails
200
- there is named (`weakenedTests`) and the pass is withheld. A correct change that edits, renames
201
- or adds tests still passes.
202
- - **A node suite whose every test was skipped measured nothing.** It read as passed.
203
- - **The pre-commit hook measured the staged commit against itself**, so the change read as empty
204
- and a staged configuration was its own reference. It is now measured against `HEAD`.
205
- - **A workspace pattern from a checked repository's package.json is no longer compiled into a
206
- regular expression**; a crafted pattern made discovery take exponential time. Patterns keep
207
- `*` and `**`; any other shape is refused with the fix named.
208
-
209
- ### Added
210
-
211
- - `verdict --head <sha>` refuses a verdict made for another head than the one being decided.
212
- - Quoted and space-bearing Git patch paths (`my file.js`, `café "x".js`, renames and copies
213
- between them) are read instead of refused, with every unsafe path still refused after decoding.
214
- - The ci report and the Markdown summary name the failing tests beside every attribution, so a
215
- failure excused as inherited stays in view.
216
-
217
- ### Changed
218
-
219
- - The front door, package README and claims index say what the command runs and records and
220
- what it does not judge, and correct three statements: `check` briefly writes its own
221
- falsification-bond fixtures into the repository and removes them; `regression: pass` can include
222
- a proven inherited failure; locally commands run on the host under a built environment, and
223
- containers are the Action's default. The 1.0.0 release note's statement that the basic command
224
- runs in a container when one is available was wrong and is corrected on that release.
225
-
226
- ## 1.0.7 - 2026-09-28
227
-
228
- ### Fixed
229
-
230
- - **An inherited failure in Vitest's text reporters can be proven.** A project whose test
231
- script adds flags the structured runner does not take (`vitest run --coverage
232
- --reporter=verbose`) prints a coverage table that differs between the base and the patch
233
- whenever the patch changes code, so 1.0.6 could never show its failures were inherited and left
234
- the dimension unmeasured: cronproof#2, which 1.0.4 and 1.0.5 passed on an unproven inheritance.
235
- Vitest names every failed test and every file that failed to load on a `FAIL` line beside its
236
- `Test Files` summary; those lines are now the failure identities, in the verifier and in the
237
- offline re-deriver alike. They name failures only, so they can prove an inheritance or a new
238
- failure and never a pass. cronproof#2 now reads a proven inheritance and a regression pass.
239
-
240
- ## 1.0.6 - 2026-09-28
241
-
242
- Two false passes reported against 1.0.5 and reproduced on it, and a third defect found while
243
- fixing them. Each is fixed at the root.
244
-
245
- ### Fixed
246
-
247
- - **A patch cannot pass its own suite by changing the runner's configuration.** A patch that
248
- broke `sum.js` and added a `vitest.config.js` read the report path from `process.argv`, wrote a
249
- passing report there and exited before any test ran, and 1.0.5 read a regression pass. The
250
- commands already came from the base commit; the rest of the instrument now does too. Where a
251
- patch changes runner configuration (Vitest, Jest, Mocha, Babel, ESLint, Prettier, Biome,
252
- TypeScript, pytest and their setup files), every check runs a second time with the base's
253
- configuration restored. A check that passes only under the patch's configuration fails where
254
- the base's configuration fails a test the base itself passed, and measures nothing otherwise.
255
- Both readings are kept on the check (`configurationObservation`, `configurationStatus`,
256
- `configurationFiles`, `regressedUnderBaseConfiguration`). A configuration that imports a
257
- helper module the patch changed, or a setup file named outside the listed patterns, is not
258
- caught by this and is named as a residual.
259
- - **A newly broken test behind an old failure is a regression.** A check that failed both with
260
- and without the patch was read as inherited whatever else failed inside it: a base with one
261
- failing test and a patch that broke a second read as a regression pass wherever another check
262
- passed. A failure is now inherited only where every test the patched run failed also failed at
263
- the base (read from a structured report or TAP), or where both runs printed the same output
264
- once times and durations are set aside. A patched run that fails a test the base did not is a
265
- regression, and the new failures are named (`newFailures`). A failure that can be shown neither
266
- way (`attribution: "unattributed"`) leaves the regression dimension unmeasured, never passed.
267
- - **The offline verifier re-derives these rules with its own implementation.** Since 1.0.3 the
268
- live verdict read an inherited failure beside a passing check as a regression pass, while the
269
- offline re-deriver still read it as unmeasured, so every such bundle failed its own
270
- "independent regression re-derived" check. The re-deriver now recomputes each failed check's
271
- attribution and each base-configuration reading from the recorded observations, requires them
272
- to match, and applies the new rule to records that carry them. Records from 1.0.3 to 1.0.5 that
273
- read an unproven inheritance as a pass still do not re-derive; that pass was not shown.
274
- - **Vitest test names are relative to the checkout**, so a test is named the same wherever the
275
- checkout sits and a verdict posted publicly does not carry the machine's session path.
276
-
277
- ## 1.0.5 - 2026-09-28
278
-
279
- What Comparison B and the study's replay on 1.0.4 found, fixed at the root: an oracle that ran
280
- outside the project environment and left no record of why it refused, a container removal
281
- judged on one sample, and two test-check details that named nothing to fix.
9
+ Swarm Orchestrator is the product of this repository again. 14.3.0's README and repository
10
+ description presented Swarm Verify as the product and the coding agent as an optional beta mode
11
+ of it; this release reverses that ([ADR 0013](docs/adr/0013-two-products-one-verifier.md)) and
12
+ gives the verifier its own product home. No runtime behaviour of the agent changed; the verifier
13
+ carried is `swarm-verify` 1.3.1, whose engine is 1.3.0's.
282
14
 
283
15
  ### Changed
284
16
 
285
- - **The oracle runs in the project environment the verifier prepared.** `.venv/bin` and
286
- `node_modules/.bin` come first on PATH for the oracle, as `uv run` and `npm exec` would. The
287
- repository's own checks already call those interpreters by path. An oracle written
288
- `python -m pytest ...` otherwise reached the container image's interpreter, which has none of
289
- the project's packages, and a patch read as rejected. A directory that does not exist changes
290
- nothing.
291
- - **Every oracle run is kept in the verdict** (`oracleRuns`: the tree it ran on, the command,
292
- its exit code, duration and the last 4000 characters of its output). The task dimension was
293
- decided from runs whose output was not recorded anywhere.
294
-
295
- ### Fixed
296
-
297
- - **A late container removal no longer refuses the run.** Removal is asked for and observed up
298
- to three times with a growing pause before cleanup is called unconfirmed. Under load the
299
- runtime finished removals after its 15-second client deadline, and a container gone moments
300
- later refused twelve study rows in a row. A container still present after the last round, or
301
- one whose creation was uncertain, still refuses.
302
-
303
- - **A failed TAP run names the tests that failed**, up to five, quoted as the runner printed
304
- them, after the counts. "2 failed" alone named nothing a repair could act on: in Comparison B
305
- the model changed nothing in six invocations fed that line for three koa patches.
306
- - **A failed test check says why when no counted test failed.** jest and vitest summaries count
307
- tests, so a file that fails to load or exits the process, or a command the test script runs
308
- after the runner, left a failed check reading "978 passed, 978 total". The detail now quotes
309
- the runner's test-file line and names the files it marked FAIL, or says the exit came from
310
- outside the counted tests. Found on commander.js#1671 in Comparison B.
311
-
312
- ## 1.0.4 - 2026-09-28
313
-
314
- Two findings from the 1.0.3 rollout and the study's replay on 1.0.3, fixed at the root: an
315
- Action headline that contradicted its own regression dimension, and one more install gap.
316
-
317
- ### Changed
318
-
319
- - **The Action's result follows the regression dimension when every failed check is
320
- inherited.** Three of sixteen dogfood repositories read "Not verified" while their verdict
321
- said "Regression: pass": their only failures were ones the base commit already had. Such a
322
- run is now a regression-only pass with exit status 0; the reason line still says the failure
323
- is inherited. A failure the base did not have still refuses. The verdict document's format is
324
- unchanged.
325
-
326
- ### Fixed
327
-
328
- - **A uv project's extras are installed too** by the authorized lockfile install
329
- (`uv sync --locked --all-groups --all-extras --no-install-project`). 1.0.3 left extras out on
330
- the reasoning that they are runtime features. The study's replay on 1.0.3 showed that reasoning
331
- wrong for the older layout that keeps pytest, ruff and mypy in a `dev` extra: every row from
332
- those projects read "no test ran", and the held-back check was reported as failing on heads
333
- where it passes once pytest is present. A lockfile declaring conflicting extras makes uv refuse,
334
- and that is reported as a failed install.
335
-
336
- ## 1.0.3 - 2026-09-28
337
-
338
- What the AI-authored pull request study's first complete run through 1.0.2 established, fixed
339
- at the root: one change of verdict semantics, named as such, and one install gap.
340
-
341
- ### Changed
342
-
343
- - **A failure the base already had no longer leaves the regression dimension unmeasured.**
344
- The base control ran the same check at the base commit and found it failing there, which
345
- is a measurement about the base, not about the patch; with the patch's other checks
346
- passing, the regression dimension now passes and the inherited failure is named beside it.
347
- In the AI-authored pull request study, ten of twenty-two adjudicated-correct pull requests
348
- had read as refused for a lint or format failure their base carried. A failure the base did
349
- not have is still a regression, and a required check that measured nothing still leaves the
350
- dimension unmeasured.
351
-
352
- ### Fixed
353
-
354
- - **A uv project's every dependency group is installed** by the authorized lockfile install
355
- (`uv sync --locked --all-groups --no-install-project`). Groups are development-only by
356
- definition, and a project that keeps pytest in a `test` group rather than `dev` had no
357
- runner after a default sync, so its suite read as not run. Extras stay uninstalled.
358
-
359
- ## 1.0.2 - 2026-09-28
360
-
361
- Two more findings from the study's run through 1.0.1, fixed at the root.
362
-
363
- ### Fixed
364
-
365
- - **The container's scratch space is a directory on the host, not a tmpfs.** A tmpfs is
366
- charged to the container's memory limit, so with the cap at 2 GB every large lockfile
367
- install was killed (exit 137) once its cache passed the cap; sizing the tmpfs in 1.0.1 could
368
- not help. Each run now mounts its own directory under the person's `~/.swarm/scratch` at
369
- `/tmp`, executable, removed when the run ends, and removed by runtime repair for a run that
370
- died between creating and removing it.
371
- - **A base commit that exists but cannot be checked out is reported with git's own line.**
372
- Two paths differing only in case, on a case-insensitive filesystem, leave the fresh checkout
373
- dirty and git refuses to switch; the refusal read as "the base commit is not in the checkout",
374
- which was false. The last line git printed is now the reason.
375
-
376
- ## 1.0.1 - 2026-09-28
377
-
378
- Four gaps the AI-authored pull request study exposed on its first run through the stable
379
- release, each on real repositories, each fixed at the root.
380
-
381
- ### Fixed
382
-
383
- - **The container's scratch space holds a real install.** HOME and TMPDIR inside the container
384
- are the `/tmp` tmpfs, so npm's and uv's caches live there, and its 256 MB left a lockfile
385
- with a native wheel or a large dependency tree failing with "no space left on device". It
386
- is now 4 GB, of which only what is written is used.
387
- - **A pnpm lockfile with no `packageManager` pin installs.** The image carries no pnpm; the
388
- lockfile's own format now names the major that reads it (9.0: pnpm 10, 6.0: pnpm 8, 5.x:
389
- pnpm 7), that major's latest is fetched through npm for the install command, and the
390
- command records which.
391
- - **A configured Python tool the environment does not hold reads as a check that measured
392
- nothing.** `ci` assembles its checks before the install, so the environment could not be
393
- read then; when the interpreter itself refuses to start a module, exits 1, and prints only
394
- its one-line "No module named", the gate is not applicable with the module named. A test's
395
- own output beside those words is a test's words, and the exit code decides as before.
396
- - **pytest absent from the environment is said as such.** The runner script says so and exits
397
- 127, and the reading is "measured nothing" with the reason, not "malformed runner output".
398
-
399
- ## 1.0.0 - 2026-09-28
400
-
401
- The first stable release of `swarm-verify`. Everything below shipped through nine prerelease
402
- candidates, each rolled out across sixteen owned repositories and three README-only onboarding
403
- simulations, with every defect they found fixed at its root and named here.
17
+ - **The README, package description and repository description describe the coding agent**:
18
+ what it does, why it is not an ordinary coding agent, install, one task, what verification
19
+ happens, what evidence is produced, what it does not prove, and how Swarm Verify relates to
20
+ it. `docs/agent.md` is the long form of that page rather than a beta notice.
21
+ - **The changelog is split.** This file holds the agent's releases; the verifier's 1.x entries
22
+ moved whole to `packages/swarm-verify/CHANGELOG.md`, which ships in that package.
23
+ - **The Action manifest lives beside the package it ships**, at `packages/swarm-verify/action.yml`,
24
+ so this repository no longer presents itself as a GitHub Action; the control workflow runs it
25
+ from there. The Action is branded Swarm Verify.
26
+ - **The verifier's product repository is generated whole**: README, changelog, an Action
27
+ reference rendered from the manifest, the example workflows, the hook manifest, the license
28
+ and the source record, by `scripts/build-action-distribution.mjs`, which refuses a README that
29
+ links to a file it does not write.
30
+ - Issue forms: an agent bug form beside the verifier's; the setup form takes either version.
31
+ `SUPPORT.md` and `SECURITY.md` name both products.
404
32
 
405
33
  ### Added
406
34
 
407
- - **`swarm-verify` with no subcommand is `check`**: discover the declared checks from the
408
- manifests, run them unattended (no terminal on stdin, `CI=true` in the child environment),
409
- and report five conclusions apart: whether the command ran, what the checks found, how
410
- commands were contained, whether any requirement was judged, whether any check was
411
- challenged. Exit codes: 0 regression-only pass, 1 a failed check, 2 an unreadable command
412
- line, 3 cancelled, 4 incomplete. `--explain` previews, `--json` emits `swarm.check.v1`.
413
- - **Requirement-level challenges** for goal contracts: `ci --challenges off|report|required`
414
- runs a base control per requirement, mechanical mutations of the changed lines witnessed by
415
- the repository suite, sealed fixtures the contract declares, and names missing obligations.
416
- Records `challenge-plan-v1`, `challenge-run-v1` and `challenge-verdict-v1`; the bundle's own
417
- verifier re-derives every verdict independently. `required` refuses with `challenges-unmet`.
418
- - **Python changes are challenged too**: the mutation set reads Python's statement forms
419
- (comparison inversion, condition negation, operand swap, `return None`, `= None`), masks
420
- literals and comments, sets test files aside, and every Python mutant is shown to parse with
421
- Python's own parser before it runs.
422
- - **The GitHub Action as a client of the installed verifier**: `swarm-verify action
423
- verify|comment|retain`. The verdict document is signed as a GitHub artifact attestation, the
424
- pull request comment is one per PR, updated in place, bound to the head, escaped and
425
- mention-free, and a delayed run for an older head posts nothing.
426
- - **Coverage on Node 22.8 and newer**: the coverage arm names process isolation in the spelling
427
- the running Node takes; the floor moves from 24 to 22.8.
428
- - A verifier platform matrix workflow installs the packed package on Linux, macOS and Windows
429
- under Node 22.0.0, 22 and 24.
430
- - **`swarm-verify verdict`** binds a signed verdict document to the report, summary and bundle
431
- beside it and hands the signer question to `gh attestation verify`.
432
- - **Three integrations, each a client of the installed verifier**: a Claude Code hook that
433
- rewrites the agent's recognised test command to `swarm-verify check` (`hook install`,
434
- `uninstall`, `run`); a local MCP server over stdio with three bounded tools (`mcp`); and a
435
- pre-commit hook that verifies the staged tree in a detached worktree without touching the
436
- working tree (`pre-commit`, `pre-commit install`, `uninstall`). Documented in
437
- `docs/integrations.md`, each with real positive and negative runs in its tests.
438
-
439
- - An authorized lockfile install inside a container reaches the registry for that one
440
- command, with lifecycle scripts off, recorded with `network: registry`; the checks that
441
- follow run with the network off. Where the image carries no pnpm and the manifest pins
442
- `packageManager: pnpm@X`, that exact pnpm is fetched through npm for the install command.
443
- The install record is written whether or not a goal contract was supplied.
444
- - The twelve attack families of the verifier-first assignment are bound to executed controls
445
- in `docs/verifier-first/attack-controls.md`, with four new ones: an outside-package change
446
- refused by name, a mismatched goal tree refused before any record, an unfinished challenge
447
- intent refusing the next challenge, and a revised contract deriving a fresh verdict.
448
- - The stable 1.x contract is written down in `docs/verifier-first/contract.md`.
449
-
450
- ### Fixed
451
-
452
- - **A container image that is not on the machine is pulled once, before the first container.**
453
- `docker create` against an absent image pulled it inside the command's own deadline, and a
454
- probe's deadline is seconds, so on a fresh machine (a GitHub runner with the Action) every
455
- container timed out while the image downloaded and the run stopped as "cleanup could not be
456
- confirmed" without saying why. The backend now inspects the image and pulls it with its own
457
- ten-minute allowance before the command's deadline starts (a pull inside the deadline left a
458
- containment probe no time at all and the run refused as "isolation unknown"), names a pull
459
- that fails, and a creation that timed out or did not start is named in the cleanup message
460
- with the runtime's last line. A probe that timed out is named as such rather than as one
461
- that "could not start (null)".
462
- - **The vitest runner reports to a file and prints only that file.** Four of sixteen rollout
463
- repositories had their whole suite read as "malformed runner output" because their tests
464
- logged, or their test script printed its own verdicts, into the stdout the JSON reporter
465
- used. Stdout is muted while the suite runs; the report's bytes are all that is printed,
466
- whole: the first cut of this wrote at exit and lost everything past the pipe's 64 KiB
467
- buffer, so every large suite read as malformed instead.
468
- - **Manifest scripts run through npm whichever manager installed the lockfile.** pnpm is
469
- fetched for the install command alone and is not in a trusted image, so every pnpm
470
- project's typecheck, lint and build read "the command is not installed" in a container. A
471
- script that itself calls pnpm still needs pnpm and says so. Both the `check` plan and the
472
- `ci` gate set compose the scripts this way.
473
- - **When every check stood down, the advice lists why each did**, and distinguishes a runner
474
- that is not installed (install the dependencies) from a toolchain the verifier does not
475
- drive (unmeasured, not a pass) and from a manifest that declares no check.
476
- - **Containment probes are shell scripts.** An image built for a Python project carries no
477
- node, so every probe "could not start" and the run refused with isolation unknown. The read
478
- and write probes use `cat` and `printf`; the network probe attempts the connection with node,
479
- else python3, else bash's `/dev/tcp`, and an image with none of them is recorded as
480
- unmeasured, never as contained.
481
- - **The verdict's advice names what happened.** A failed or unmeasured required check was
482
- advised as "the repository's own suite passed"; it now names the check that failed on the
483
- patch and passed at the base, or the required check that measured nothing.
484
- - **A configured Python tool the environment does not hold is an unavailable check, not a
485
- failed one.** tavern configures mypy, its synced environment holds none, and `python -m
486
- mypy` exited 1 with "No module named mypy", read as the typecheck failing on a clean
487
- checkout. Presence is read from `.venv`'s site-packages without running anything; the
488
- check then says which tool to add and sync. Without a `.venv` nothing is claimed.
489
- - **A failed check shows the last lines the command printed**, in `check`'s report and its
490
- JSON (`output`), so "the command exited 1" comes with what a terminal would have shown.
491
- - **Two messages a stranger met on a first run say what they mean.** The file-set check in a
492
- run with no declared file set no longer speaks of "no planner" and "no agent"; it says no
493
- file set was declared and what changed. The per-run signing key notice says what a per-run
494
- key means and that it is ordinary on a headless machine.
495
- - **A vitest file that repeats a test title no longer makes the whole suite unmeasured.**
496
- The second occurrence is named by its position; the runner accepted the title and so does
497
- the reading. Found on depose, where one repeated `it` hid 383 tests.
498
- - **The tests reading says what its counts are and are not** in words a first-time reader
499
- can follow, instead of "ratchet counts" and "base-control attribution".
500
- - **An image pull is attempted three times** before the run stops, since a hosted runner saw
501
- Docker Hub reset the connection once; the last failure's own line is what the error names.
502
- - **A Python checkout whose ignored caches exist no longer fails to stage.** The scratch
503
- index named `__pycache__`, `.pytest_cache`, `.mypy_cache` and `.ruff_cache` as exclude
504
- pathspecs on `git add -A`, which git refuses with "paths are ignored" (exit 1) as soon as one
505
- of them exists and is gitignored, the ordinary state after one test run; the verifier then
506
- told the reader the repository "is not a git working tree". Everything is staged and the
507
- caches are removed from the index afterwards. Found by the README-only python simulation.
508
- - **A git failure inside a repository quotes git's own last line** rather than the command
509
- line, and no longer sends the reader to `git init` unless git said the directory is not a
510
- repository.
511
- - **A uv project without a synced environment is a missing prerequisite, not four failed
512
- checks.** `uv run --no-sync` exits at once without a `.venv`; `check` now names
513
- `uv sync --locked` as the remedy and exits 4, as it does for a missing `node_modules`.
514
-
515
- ### Changed
516
-
517
- - Both binaries exit 2 for a command line they cannot read, as the exit code taxonomy said.
518
- - The container's scratch mount is executable, so a fetched package manager can run from it.
519
- - The README leads with the verifier; the coding agent's page is `docs/agent.md`.
35
+ - `src/product-boundary.test.ts` holds each product's package metadata, binary, dependencies,
36
+ changelog and README front matter to the product it names, and keeps the inverted phrasing
37
+ out of the documents a reader is pointed at.
38
+ - The standalone verifier's import-boundary test now also refuses any bare import outside Node
39
+ and the two packages `swarm-verify` declares, so a model SDK cannot enter the published
40
+ verifier through a module the build allows.
41
+ - `scripts/build-action-distribution.test.mjs` holds the generated distribution to the source
42
+ manifest, the package README and the examples.
520
43
 
521
44
  ## 14.3.0 - 2026-09-30
522
45
 
523
46
  The coding agent, `swarm-orchestrator`, released for the first time since the verifier-first
524
47
  work began. The `swarm` binary shares its verifier with `swarm-verify`, so every change published
525
- for `swarm-verify` 1.0.0 through 1.3.0 above is in this release too. What follows is what the
48
+ for `swarm-verify` 1.0.0 through 1.3.0 (now in [packages/swarm-verify/CHANGELOG.md](packages/swarm-verify/CHANGELOG.md))
49
+ is in this release too. What follows is what the
526
50
  agent itself gained; the verifier stays the primary product and the agent its advanced mode.
527
51
 
528
52
  ### Added
package/README.md CHANGED
@@ -2,118 +2,237 @@
2
2
 
3
3
  <div align="center">
4
4
 
5
- <h1>Swarm Verify</h1>
5
+ <h1>Swarm Orchestrator</h1>
6
6
 
7
- <p><strong>Swarm Verify runs a project's checks and records evidence showing what passed, what failed, and what remains unverified.</strong></p>
7
+ <p><strong>A coding agent that must prove its work.</strong></p>
8
+
9
+ <p>
10
+ It makes bounded repository changes, runs the project's real checks, challenges weak evidence,<br />
11
+ retries failures without trading away test quality, and records what actually happened,<br />
12
+ so the agent's own summary is never the source of truth.
13
+ </p>
14
+
15
+ <p>
16
+ <a href="docs/README.md"><strong>Explore the docs »</strong></a>
17
+ ·
18
+ <a href="docs/evidence/2026-08-18/live-tasks.md">See a real run</a>
19
+ ·
20
+ <a href="https://github.com/moonrunnerkc/swarm-verify">Swarm Verify, the standalone verifier</a>
21
+ ·
22
+ <a href="https://github.com/moonrunnerkc/swarm-orchestrator/issues/new/choose">Report a bug</a>
23
+ </p>
24
+
25
+ [![gates](https://img.shields.io/github/actions/workflow/status/moonrunnerkc/swarm-orchestrator/gates.yml?branch=v13-main&style=for-the-badge&label=gates)](https://github.com/moonrunnerkc/swarm-orchestrator/actions/workflows/gates.yml)
26
+ [![npm](https://img.shields.io/npm/v/swarm-orchestrator?style=for-the-badge&label=swarm-orchestrator&color=CB3837)](https://www.npmjs.com/package/swarm-orchestrator)
27
+ [![node](https://img.shields.io/badge/node-%E2%89%A522-5FA04E?style=for-the-badge)](package.json)
28
+ [![license](https://img.shields.io/badge/license-ISC-blue?style=for-the-badge)](LICENSE)
8
29
 
9
30
  </div>
10
31
 
11
- This is the main source repository for Swarm Verify, maintained under the swarm-orchestrator
12
- repository name. It also contains the optional beta coding agent. The separate
13
- [moonrunnerkc/swarm-verify](https://github.com/moonrunnerkc/swarm-verify) repository distributes
14
- the GitHub Action.
32
+ ---
33
+
34
+ ## What it does
35
+
36
+ `swarm` takes a task and a git repository. It plans, declares the files it intends to touch,
37
+ edits through one recording chokepoint, runs your project's checks as sealed gates, and retries
38
+ failures under a ratchet that refuses a fix which trades away tests, assertions or coverage.
39
+ When the gates pass it exports a signed, hash-chained evidence bundle that carries its own
40
+ dependency-free verifier, so anyone can check what ran, and what passed, with nothing but Node
41
+ and without trusting the machine that produced it.
42
+
43
+ ```text
44
+ task
45
+ -> the agent plans and declares its files
46
+ -> a bounded change, every tool call recorded
47
+ -> the project's checks run as sealed gates
48
+ -> weak evidence is challenged: a passing check must be shown able to fail
49
+ -> the ratchet: a retry may not trade away tests, assertions or coverage
50
+ -> retry, accept, or refuse with the reason on the record
51
+ -> evidence: a signed bundle anyone can verify offline
52
+ ```
53
+
54
+ Here is a real run, committed: [`live-tasks.md`](docs/evidence/2026-08-18/live-tasks.md),
55
+ with its bundle in [`live-frontier/`](docs/evidence/2026-08-18/live-frontier). And here is the
56
+ packaged tool doing it, installed from a tarball into a directory holding nothing else, against
57
+ a workspace it had never seen, recorded in a real terminal:
58
+ [`installed-package-run.md`](docs/evidence/2026-08-23/installed-package-run.md).
59
+
60
+ ## Why it is not an ordinary coding agent
61
+
62
+ The model can say whatever it likes. It cannot make a check pass, mark a claim verified, or
63
+ change a record after the fact. Those are the harness's to decide.
15
64
 
16
- ![A bundle verifies, one byte is changed, and the verifier refuses it with the broken link named](docs/evidence/2026-09-27/verifier-first/tamper-demo.gif)
65
+ - **A claim is not evidence.** A structured claim the model makes names a predicate and a
66
+ record; the harness evaluates it against its own records and renders the verdict. Narrative
67
+ never renders green, and a claim the harness cannot evaluate renders `UNVERIFIED` without
68
+ stopping the run.
69
+ - **A pass must be able to fail.** Each passing gate is handed one fixture it has to refuse,
70
+ so a check that cannot fail is caught rather than counted.
71
+ - **A retry cannot buy green by deleting tests.** Tests collected, assertions in touched tests
72
+ and covered changed lines cannot decrease across retries; skips cannot increase.
73
+ - **Regression and task acceptance are two answers.** A suite passing says nothing broke. Only
74
+ a requirement contract or an acceptance check you supply can say the work was done, and the
75
+ tool reports when neither was given.
76
+ - **Unmeasured is a verdict.** Nobody checked is not the same as checked and passed, and it is
77
+ never rendered as a pass.
17
78
 
18
- The recording is a real run of the published package over a committed evidence bundle: it
19
- verifies, one byte of one record is changed, and the altered bundle is refused with the broken
20
- link named. That is integrity. Who signed a bundle, and whether the tests it records measured
21
- the right thing, are separate questions the verifier answers separately
22
- ([transcript](docs/evidence/2026-09-27/verifier-first/tamper-demo-transcript.txt),
23
- [script](docs/evidence/2026-09-27/verifier-first/tamper-demo.sh)).
79
+ ## Install
24
80
 
25
81
  ```sh
26
- npx swarm-verify
82
+ npm install -g swarm-orchestrator
27
83
  ```
28
84
 
29
- Run it in a git repository whose dependencies are installed (`npm ci`, `pnpm install
30
- --frozen-lockfile` or `uv sync`; it names the missing step and exits 4 when they are not). It
31
- reads the checks the project declares, runs them unattended the way a CI job would, and reports
32
- apart: whether the command ran, what each check found, how the commands were contained, and
33
- what it did not judge. By default it does not challenge the checks and does not judge whether
34
- the work is correct: a pass is a regression-only pass, and the result line says so. A failed
35
- check exits 1 and names the check; a check whose result cannot be trusted, such as a pass
36
- reported by a test configuration the change itself edited, exits 4 and says why.
37
-
38
- It creates no `swarm.toml` and keeps its evidence outside the repository, under
39
- `~/.swarm/sessions` by default. While it runs it briefly adds, then removes, its own
40
- `swarm-falsification-bond.*` fixtures to show each passing check can fail, and the project's
41
- own commands may write build output, caches or other files as they always do. No model, key
42
- or configuration is needed.
43
-
44
- Needs Node 22 or newer, git, and `uv` for a Python project. Linux and macOS run every command;
45
- Windows runs bundle and verdict verification only. Locally, commands run on the host with a
46
- built environment and no credentials, which is a policy and not a sandbox; the Action runs
47
- them in a network-disabled container.
85
+ This installs the registry’s `latest` release and leaves `swarm` on your path.
86
+ The source version is **14.4.0**; publication is tracked in
87
+ [the delivery record](docs/release-delivery-2026-10-10.md). It runs on Node 22 or newer; Node 24 or
88
+ newer is recommended, because the changed-line coverage measurement spawns Node's test runner
89
+ with process isolation, which Node 22 below 22.8 rejects. Below that, the measurement reports
90
+ unmeasured and never counts as a pass. `swarm doctor` says which Node it found and what owns
91
+ the `swarm` command, and `--fix` repairs an install that an older build is shadowing.
48
92
 
49
- [![gates](https://img.shields.io/github/actions/workflow/status/moonrunnerkc/swarm-orchestrator/gates.yml?branch=v13-main&style=for-the-badge&label=gates)](https://github.com/moonrunnerkc/swarm-orchestrator/actions/workflows/gates.yml)
50
- [![verifier matrix](https://img.shields.io/github/actions/workflow/status/moonrunnerkc/swarm-orchestrator/verifier-matrix.yml?branch=v13-main&style=for-the-badge&label=node%2022%20%7C%2024)](https://github.com/moonrunnerkc/swarm-orchestrator/actions/workflows/verifier-matrix.yml)
51
- [![npm](https://img.shields.io/npm/v/swarm-verify?style=for-the-badge&label=swarm-verify&color=CB3837)](https://www.npmjs.com/package/swarm-verify)
52
- [![license](https://img.shields.io/badge/license-ISC-blue?style=for-the-badge)](LICENSE)
93
+ ## Run one task
53
94
 
54
- ## In CI
55
-
56
- One job, one Action, the permissions a signed comment needs
57
- ([the complete workflow](docs/examples/swarm-verification.yml)):
58
-
59
- ```yaml
60
- name: swarm-verify
61
- on:
62
- pull_request:
63
- permissions:
64
- contents: read
65
- pull-requests: write
66
- id-token: write
67
- attestations: write
68
- artifact-metadata: write
69
- jobs:
70
- verify:
71
- runs-on: ubuntu-latest
72
- steps:
73
- - uses: moonrunnerkc/swarm-verify@v1
74
- with:
75
- install: true # install from the lockfile, scripts off, then run skipped scripts offline; omit for a project with no dependencies
95
+ ```sh
96
+ export ANTHROPIC_API_KEY=... # or OPENAI_API_KEY, GOOGLE_GENERATIVE_AI_API_KEY,
97
+ # or start Ollama and pass --model local:<id>
98
+ cd your-repository
99
+ swarm "make slugify collapse whitespace and strip punctuation"
76
100
  ```
77
101
 
78
- The Action fetches the pull request's head and base by commit id into a checkout it owns, runs
79
- the project's checks in a network-disabled container, signs the verdict as a GitHub artifact
80
- attestation, and posts one comment bound to the head that says what was measured and what was
81
- not. A route for forks and Dependabot is [documented](docs/examples/swarm-verification-forks.yml);
82
- what has been exercised on a real fork is recorded in
83
- [the completion index](docs/verifier-first/README.md). Inputs, outputs and how to verify a
84
- signed verdict from outside the run are in [the broad-use guide](docs/broad-use.md#github-action).
102
+ Keys come from the environment or your OS keychain, never from `swarm.toml`: that file is
103
+ committed and cloned, so a key in it has already been shared with everyone holding the
104
+ repository. The run shows each step, each gate and each retry as it happens, and ends on the
105
+ evidence panel. `swarm review <bundle>` opens a run's review page later; `swarm verify <bundle>`
106
+ checks its integrity and who signed it. Every command and flag is in
107
+ [docs/cli.md](docs/cli.md); sessions, several workers at once and the screen are in
108
+ [docs/using.md](docs/using.md).
109
+
110
+ <p align="right">(<a href="#readme-top">back to top</a>)</p>
111
+
112
+ ## What verification happens
85
113
 
86
- ## What it says, and what it does not
114
+ Every tool call and every check goes through one recording chokepoint, and the record is an
115
+ append-only, hash-chained ledger that lives outside the workspace. The gates, their severities,
116
+ their parsers and the budgets are sealed before the first model call, so nothing the model
117
+ does during the run can change what it is measured against.
87
118
 
88
- `regression: pass` means no check failed because of the change. It does not mean every check
89
- passed: a failure the base commit already had, the same way and in the same tests, is shown as
90
- inherited and does not count against the change, and the report names those failing tests. It
91
- does not mean the work was done either.
119
+ Six words carry most of the weight. A **gate** is a check declared as data: a command, a
120
+ parser, and whether it blocks. The **ratchet** is the rule that a retry may not trade away
121
+ tests, assertions or coverage to turn a gate green. A **bond** is one file a passing gate is
122
+ handed that it must refuse, so a pass that cannot fail is caught. An **oracle** is the check
123
+ you supply that says the task was done, as distinct from nothing broke. **Reach** is whether
124
+ that oracle executed the lines a patch added. And **unmeasured** is a verdict of its own.
92
125
 
93
- A requirement contract (`swarm-verify ci --goal-contract`) defines what the work must do, and
94
- the contract's checks are the evidence for each requirement. Neither the contract nor a
95
- signature proves the code is semantically correct. `--challenges report` asks whether each
96
- requirement's check could have caught wrong work (does it reject the tree before the change,
97
- mechanical mutations of the change, a fixture sealed as a violation) and reports gaps;
98
- `--challenges required` refuses on a gap; `off` asks nothing.
126
+ With a goal contract (`--goal-contract`), the contract's own checks are challenged
127
+ (`--challenges report|required`): a base control per requirement, mechanical mutations of the
128
+ changed lines witnessed by the suite, and sealed fixtures, so a check that could not have
129
+ caught wrong work is named. With `--strengthen`, the model may propose one additive check per
130
+ witnessed gap; the harness admits it only where it observes the check reject the counterexample
131
+ and accept every sealed reference, then repairs the code under the revised contract. Nothing is
132
+ asked of the model before the criteria are sealed.
133
+
134
+ The mechanics, the nine-answer report and worked examples are in
135
+ [docs/verifying.md](docs/verifying.md). The goal contracts, presets and package scope are in
136
+ [docs/broad-use.md](docs/broad-use.md).
137
+
138
+ ## What evidence is produced
139
+
140
+ A run writes its ledger under `~/.swarm/sessions`, never inside the workspace, and exports a
141
+ bundle: the manifest with the chain head and the signature, the records, every blob by
142
+ SHA-256, the review page, the summary, and `verify.mjs`, a dependency-free verifier that
143
+ re-derives every verdict from the records alone.
144
+
145
+ ```sh
146
+ node <bundle>/verify.mjs <bundle> # anywhere, nothing installed
147
+ swarm verify <bundle> --signer <fp> # here, with the signer judged too
148
+ ```
99
149
 
100
- Every run exports a bundle carrying its own dependency-free verifier. Integrity, signer
101
- identity, execution trust, regression, task acceptance and challenge coverage are reported as
102
- separate answers, and `unmeasured` is one of them.
150
+ Every number here links to the committed artifact of the thing happening; the full table, and
151
+ the list of things that may not be said, is [docs/claims.md](docs/claims.md).
103
152
 
104
- ## Where to go next
153
+ - **One changed byte breaks verification.** The same bundle verified and then tampered with in
154
+ a single byte, exit 0 and exit 1 side by side, with a script to reproduce it:
155
+ [tamper demo](docs/evidence/2026-08-18/tamper-demo).
156
+ - **A bundle verifies on a machine that has never seen this repository.** Run in a `node:24`
157
+ container with no network and no mount of this repository:
158
+ [clean-container-verification.md](docs/evidence/2026-08-23/clean-container-verification.md).
159
+ - **A green verdict is computed by the harness, and the model cannot produce one.** In a real
160
+ run the model asserted a predicate the language does not parse; the harness rendered it
161
+ `UNVERIFIED` and carried on, twice: [shakedown results](docs/evidence/2026-08-18/shakedown/results.md).
162
+ - **A suite passing is not the task being done.** Four of eighteen patches this project's own
163
+ agent and a baseline arm produced over three public TypeScript repositories passed their
164
+ project's whole suite and failed a hidden acceptance test, which is why `regression` and
165
+ `task` are two answers: [docs/verifying.md](docs/verifying.md). That is a measurement of
166
+ those eighteen patches, not a rate for AI-written changes in general.
167
+ - **The oracle is judged too.** Certified tasks turned out to rest on oracles that could not
168
+ fail; the last false green standing was refused because its oracle accepted a change to a
169
+ line it had run: [docs/verifying.md](docs/verifying.md#the-oracle-is-judged-too).
170
+ - **The September 6 mined-corpus false-green rate was 0 in 15**, 95% CI [0.0, 20.4], with two
171
+ oracles per task, one handed to the tool and one held back:
172
+ [mined-corpus](docs/evidence/2026-09-06/mined-corpus/README.md).
105
173
 
106
- | You want to | Read |
174
+ <p align="right">(<a href="#readme-top">back to top</a>)</p>
175
+
176
+ ## What it does not prove
177
+
178
+ The five that matter most. The full list is in
179
+ [docs/verifying.md](docs/verifying.md#what-is-not-claimed).
180
+
181
+ - **It is not production-ready.** The counts above describe the linked campaigns, not a fresh
182
+ measurement of every gate on this checkout. Each row and what would settle it:
183
+ [docs/beta-gates.md](docs/beta-gates.md).
184
+ - **Not "fully secure".** The secret detector does known-pattern scrubbing, not secret removal.
185
+ Zero crashes at a fuzz budget is evidence, not proof.
186
+ - **The default execution mode is `restricted`, not `isolated`.** A lexical path and program
187
+ policy in front of interpreters unless you pass `--isolation`. Reported before the run starts
188
+ and recorded on the chain rather than quietly assumed, but it is not containment.
189
+ - **0 in 15 says "under 20%", not "zero".** That upper bound is the honest half of the rate,
190
+ and it is a rate for that corpus and that build, not for this one.
191
+ - **Shown its oracle, a model still gets past this.** Bonding and challenges ask whether the
192
+ checks judged what the patch added. They cannot ask what the patch left out, and that is
193
+ what an adversarial patch does.
194
+
195
+ Gates prove mechanical quality, not design quality. What a bundle buys you is that reviewing the
196
+ change is fast and its claims are checkable, not that review is unnecessary.
197
+
198
+ ## Swarm Verify, the standalone verifier
199
+
200
+ The verification the agent is held to is a product of its own. [Swarm Verify](https://github.com/moonrunnerkc/swarm-verify)
201
+ checks a change from any source, this agent, Claude Code, Codex, Copilot, another agent or a
202
+ person, with no model, no key and no configuration:
203
+
204
+ ```sh
205
+ npx swarm-verify # run a repository's declared checks and report what that establishes
206
+ npx swarm-verify ci --pr owner/repo#123 # verify a pull request in a fresh checkout of its base
207
+ npx swarm-verify verify <bundle> --signer <fp> # check a bundle this agent, or anything else, produced
208
+ ```
209
+
210
+ It also ships as the GitHub Action `moonrunnerkc/swarm-verify@v1`, a Claude Code hook, an MCP
211
+ server and a pre-commit hook. The same commands are in the `swarm` binary: `swarm check`,
212
+ `swarm ci`, `swarm verify`, `swarm verdict` and `swarm gates` need no model, and
213
+ [docs/verify-only.md](docs/verify-only.md) walks through them over committed artifacts.
214
+
215
+ There is one implementation. The `swarm-verify` package is built from this repository's
216
+ verification modules under [packages/swarm-verify](packages/swarm-verify), behind a build-time
217
+ boundary that refuses any provider, worker or screen module; the agent composes those same
218
+ modules. Swarm Orchestrator uses Swarm Verify. It is not Swarm Verify.
219
+
220
+ <p align="right">(<a href="#readme-top">back to top</a>)</p>
221
+
222
+ ## Versions
223
+
224
+ The package name has carried three different programs, and the majors are the boundary:
225
+
226
+ | Versions | What it was |
107
227
  | --- | --- |
108
- | verify a patch, branch or pull request from any author, with a contract or without | [docs/verify-only.md](docs/verify-only.md), [docs/broad-use.md](docs/broad-use.md) |
109
- | check what a bundle establishes, and who signed it | [docs/verify-only.md](docs/verify-only.md#swarm-verify-a-bundle-and-who-signed-it) |
110
- | route an agent's test command through the ledger, from Claude Code, an MCP client or a git hook | [docs/integrations.md](docs/integrations.md) |
111
- | every command, flag and exit code | [docs/cli.md](docs/cli.md) |
112
- | every public claim and the artifact behind it, and what may not be said | [docs/claims.md](docs/claims.md) |
113
- | the coding agent this verifier was built for, an advanced beta mode | [docs/agent.md](docs/agent.md) |
114
- | the verifier-first campaign, its baseline, evidence and open items | [docs/verifier-first/README.md](docs/verifier-first/README.md) |
228
+ | 8.x | a contract-first coding orchestrator: a goal compiled to typed obligations, persona candidates raced per obligation, verifier-gated commits, a hash-chained ledger |
229
+ | 10.x to 12.x | a pull-request auditor: static cheat-pattern detectors over AI-written diffs, advisory by default, with a merge gate. The last of that line is the `v12-final` tag |
230
+ | 13.x and later | this coding agent, with no migration path from 12.x and nothing of its interface |
231
+ | 14.1.0 | the verification path extracted as the `swarm-verify` package, the same code with none of the agent |
232
+ | 14.3.0 | the README and repository description presented Swarm Verify as this repository's product and the agent as a beta mode; 14.4.0 restores the agent as the product of this repository and gives the verifier its own home |
115
233
 
116
- The full documentation index is [docs/README.md](docs/README.md).
234
+ Pin a major. Each release names the verifier version it carries in [CHANGELOG.md](CHANGELOG.md);
235
+ the verifier's own changelog is [packages/swarm-verify/CHANGELOG.md](packages/swarm-verify/CHANGELOG.md).
117
236
 
118
237
  ## Contributing
119
238
 
@@ -128,4 +247,17 @@ does not establish.
128
247
  5. Push (`git push origin feature/amazing-feature`)
129
248
  6. Open a pull request
130
249
 
250
+ New dependencies need a one-line justification; the standard library is preferred.
251
+ [docs/build-guide.md](docs/build-guide.md) is worth reading before structural work.
252
+
253
+ ## License
254
+
255
+ Distributed under the ISC License. See [LICENSE](LICENSE).
256
+
257
+ ## Contact
258
+
259
+ Brad Kinnard, [@KChackerman](https://x.com/KChackerman), bradkinnard@proton.me
260
+
261
+ Project link: [github.com/moonrunnerkc/swarm-orchestrator](https://github.com/moonrunnerkc/swarm-orchestrator)
262
+
131
263
  <p align="right">(<a href="#readme-top">back to top</a>)</p>
@@ -1,4 +1,3 @@
1
- import { isolatedCoverageShortfall } from "../node-floor.js";
2
1
  import { harnessReportingCommand } from "./harness-reporting.js";
3
2
  import { commandWords, shellQuoted } from "./node-test-command.js";
4
3
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"oracle-instrumentation.js","sourceRoot":"","sources":["../../src/gates/oracle-instrumentation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oracle-instrumentation.js","sourceRoot":"","sources":["../../src/gates/oracle-instrumentation.ts"],"names":[],"mappings":"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"}
@@ -24,7 +24,8 @@ export const usage = [
24
24
  .filter((command) => verifyOnlyNames.has(command.name))
25
25
  .map((command) => ` swarm-verify ${command.syntax.padEnd(42)} ${command.description}`),
26
26
  "",
27
- "These need no model, no provider key and no local backend. The full agent is swarm-orchestrator.",
27
+ "These need no model, no provider key and no local backend. Swarm Orchestrator, the coding agent built on",
28
+ "this verifier, is the swarm-orchestrator package.",
28
29
  ].join("\n");
29
30
  async function main() {
30
31
  const context = { currentDirectory: process.cwd(), usage };
@@ -1 +1 @@
1
- {"version":3,"file":"swarm-verify.js","sourceRoot":"","sources":["../src/swarm-verify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"swarm-verify.js","sourceRoot":"","sources":["../src/swarm-verify.ts"],"names":[],"mappings":"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"}
package/docs/README.md CHANGED
@@ -1,16 +1,25 @@
1
1
  # Documentation
2
2
 
3
+ Current product boundaries are defined by ADR 0013: Orchestrator is the coding agent;
4
+ [Swarm Verify](../packages/swarm-verify/README.md) is the independent verifier built from shared
5
+ source. Installation resolves the published registry version, not necessarily the source version.
6
+ The [delivery record](release-delivery-2026-10-10.md) distinguishes these states. Dated state
7
+ reports, audit plans and `state/` entries are historical; the verifier completion index tracks
8
+ remaining research, rollout and client work. October relaunch drafts await delivery; older launch
9
+ text is retained for history and must not be reused as current guidance.
10
+
3
11
  | Document | What it holds |
4
12
  | --- | --- |
5
- | [`../README.md`](../README.md#install) | install, and a first run from `npm install -g` to an opened review page |
13
+ | [`../README.md`](../README.md) | Swarm Orchestrator, the coding agent: what it does, install, one task, what is verified, what evidence is produced, what is not proved |
6
14
  | [`cli.md`](cli.md) | every command and flag, with what each is for |
7
15
  | [`using.md`](using.md) | sessions, several workers, the screen, and `swarm.toml` |
8
16
  | [`verifying.md`](verifying.md) | bonds, `swarm ci`, the oracle and its reach, the nine answers, and what is not claimed |
9
- | [`verify-only.md`](verify-only.md) | `swarm check`, `swarm verify`, `swarm ci` and `swarm gates` with no model, walked through on committed artifacts |
17
+ | [`verify-only.md`](verify-only.md) | `swarm check`, `swarm verify`, `swarm ci` and `swarm gates` with no model, walked through on committed artifacts; the same commands are the standalone [Swarm Verify](https://github.com/moonrunnerkc/swarm-verify) |
10
18
  | [`broad-use.md`](broad-use.md) | source inputs, package scope, acceptance instruments, challenges and the GitHub Action |
11
- | [`agent.md`](agent.md) | the coding agent, an advanced beta mode: install, first run, how it verifies, what is measured and what is not |
19
+ | [`agent.md`](agent.md) | running the coding agent, the long form: install, first run, how it verifies, what is measured, what is not, and the roadmap |
12
20
  | [`integrations.md`](integrations.md) | the Claude Code hook, the MCP server and the pre-commit hook, each a client of the same verifier |
13
21
  | [`verifier-first/`](verifier-first/README.md) | the verifier-first campaign: the completion index, baseline, Node 22 record and dogfood manifest |
22
+ | [`adr/`](adr/README.md) | the architecture decisions, each with what it replaced and what it does not buy; [0013](adr/0013-two-products-one-verifier.md) is the product boundary between the agent and the verifier |
14
23
  | [`claims.md`](claims.md) | every public claim and the committed artifact behind it, and what may not be said |
15
24
  | [`build-guide.md`](build-guide.md) | the design, the non-goals, and the residuals that ship open |
16
25
  | [`ratchet-inputs.md`](ratchet-inputs.md) | every input the ratchet reads, who can author it, and what was moved |
@@ -24,7 +33,8 @@
24
33
  | [`tech-debt.md`](tech-debt.md) | what the tree carries that it would rather not, with what closing each would take |
25
34
  | [`evidence/`](evidence) | dated runs, bundles, and reports, each verified by the verifier it carries |
26
35
  | [`state/`](state) | the state file of each unattended pass, with what was done and what was not |
27
- | [`RELEASE-COMPLETION-PROMPT.md`](RELEASE-COMPLETION-PROMPT.md) | the plan an earlier release was built to |
36
+ | [`release-delivery-2026-10-10.md`](release-delivery-2026-10-10.md) | current delivery, cleanup decisions, validation and publication evidence |
37
+ | [`history/RELEASE-COMPLETION-PROMPT-v13.md`](history/RELEASE-COMPLETION-PROMPT-v13.md) | archived v13 execution prompt; historical, not operational guidance |
28
38
 
29
39
  ## Restoring offloaded artifacts
30
40
 
package/docs/claims.md CHANGED
@@ -62,8 +62,10 @@ Verbatim, because each of these has been tempting at some point in this project'
62
62
  - **That swarm-verify catches more wrong work than another tool, or is the only tool that does
63
63
  something.** No completed comparison supports either; the advantage is an open hypothesis
64
64
  tracked in `verifier-first/README.md`.
65
- - **That the fork route has been exercised on a real fork**, until the completion index records a
66
- real fork pull request run through the published Action.
65
+ - **That fork testing establishes unrestricted safety.** Real fork and Dependabot controls ran
66
+ on published 1.1.0 and 1.2.0, including hostile code and stale-head refusal; see SV-16 in
67
+ `verifier-first/README.md`. Those observations apply to their tested container and workflow
68
+ boundaries, not every runner or hostile program.
67
69
 
68
70
  - **"Seven red-team laps."** The loop ledger records one completed lap. Six of the seven
69
71
  pass directories were human-driven work outside the driver, which
@@ -76,13 +78,15 @@ Verbatim, because each of these has been tempting at some point in this project'
76
78
  - **"Fully secure", or any unbounded security claim.** The honest naming is known-pattern
77
79
  scrubbing, not secret removal, and there is a four-character floor under it. Zero crashes
78
80
  at a given fuzz budget is evidence, not proof.
79
- - **That a decomposition is checked for whether it satisfies the goal.** It is not. The
80
- harness checks that a graph is well formed and that its declared nodes ran and landed. The
81
- `--goal` run in `evidence/2026-08-24/swarm.md` passed every structural check on a
82
- decomposition that could not work. Say "declared before it runs and checked for structure".
83
- - **That redundancy picks the best solution.** The comparator picks the most disciplined green
84
- attempt. No number it reads tells doing the whole task from doing the minimum that passes
85
- its own tests, and a number that could would be a judge, which section 2 refuses.
81
+ - **That a well-formed decomposition proves the user’s goal complete.** The legacy graph run
82
+ in `evidence/2026-08-24/swarm.md` passed structural checks on an unusable decomposition. The
83
+ adaptive controller now checks declared executable obligations on the exact integrated tree,
84
+ with bounded revisions and independent acceptance (`redesign-implementation-2026-09-13.md`).
85
+ That establishes the tested contract, not that the contract captures all user intent.
86
+ - **That redundancy picks the best solution.** The legacy comparator selects discipline;
87
+ goal selection first requires applicable executable obligations and integrated checks, then
88
+ ranks under the sealed objective. Neither establishes semantic completeness beyond those
89
+ checks, and missing human judgments remain unjudged.
86
90
  - **That the oracle-reach check proves an oracle judged the change.** It proves the oracle
87
91
  *executed* the lines, which is a necessary condition and not a sufficient one, and for every
88
92
  runner but node's own it reads a coverage report the workspace's own processes wrote. Nothing
package/package.json CHANGED
@@ -1,19 +1,23 @@
1
1
  {
2
2
  "name": "swarm-orchestrator",
3
- "version": "14.3.0",
4
- "description": "A coding agent whose claims about its own work resolve to machine-captured evidence: an append-only hash-chained ledger, gates that retry under a numeric ratchet, and a signed bundle carrying its own verifier that anyone can check offline.",
3
+ "version": "14.4.0",
4
+ "description": "A coding agent that must prove its work: bounded repository changes, the project's real checks, challenges to weak evidence, retries that cannot trade away test quality, and a signed, hash-chained evidence record anyone can verify offline.",
5
5
  "keywords": [
6
+ "agent-harness",
6
7
  "agentic-ai",
7
8
  "ai-agents",
8
9
  "audit-trail",
9
10
  "cli",
10
11
  "coding-agent",
12
+ "coding-agents",
13
+ "developer-tools",
11
14
  "evidence",
12
15
  "hash-chain",
13
16
  "llm",
14
17
  "local-llm",
15
18
  "provenance",
16
19
  "quality-gates",
20
+ "software-engineering",
17
21
  "tamper-evident",
18
22
  "tui",
19
23
  "typescript",