What's new

Zurdo's releases from v1.25.0 to v1.36.0, newest first.

zurdo v1.36.0

What changed in each release these docs cover, newest first. The full changelog stays with the tool.

v1.36.0 (2026-11-07)

Zurdo now publishes the contract an agent must match to be driven over ACP, the Agent Client Protocol: docs/providers/acp-contract.toml, which agents vendor from a release tag and pin by sha256. Zurdo does not drive agents over ACP yet. The coverage gate also no longer fails a Rust or Go file with no function body. A file of only constants, types, or module declarations gets no line in an llvm-cov or go test report, so the gate used to read it as unreached and fail a task whose criteria had all passed.

v1.35.2 (2026-11-04)

The experimental E2B backend now works with a fetch_command. Before, the criteria step tried to clone the repository a second time into the work tree the fetch had already filled, so every such pass was reported unavailable. Now the criteria run in the checkout the fetch left. The E2B demo template also builds on E2B itself, not only under a local docker build.

v1.35.1 (2026-11-04)

The clean room's demo now lives on this page: the template's Dockerfile, its criteria file, and the one-file example repository are shown inline, so you can build the E2B demo template from the docs alone.

v1.35.0 (2026-11-04)

A green verdict can now be re-computed where the agent never ran. With [verification.clean_room] on, every passing iteration is checked a second time in a fresh Docker container built from a pinned image, and a criterion that passes on your machine but fails there fails the iteration. zurdo init writes the room's Dockerfile, zurdo report shows each verdict, and a task can opt out with **Clean-room**: skip. The new zurdo verify --criteria <file> checks one task's criteria from a JSON file with no PRD and no run state, which is how the room verifies. An experimental, opt-in e2b backend runs the same pass in an E2B sandbox, with a worked demo. Each run records the policy it ran under and each task the tree it began from as a rollback point. Standing rules, set in [[verification.standing]], are checked on every task and every attempt, and a red standing set refuses the run at pre-flight.

v1.34.0 (2026-10-28)

Criteria that prove nothing are now caught before a run. [grep:] can count the lines it matches: count:<N> means exactly N, and min:<N> means at least N. [file-exists:] can demand bytes with non-empty. Eight new lint families make twenty-two: shell-tautology, stale-artifact, already-holds, no-grep-vacuous, existence-only, http-race, and the Lumen-gated grep-should-be-symbol and assertion-free-test. --strict promotes shell-tautology, which brings the promoted families to nine. The executor prompt now shows a [shell:] hint's timeout: and min-tests: modifiers. Behaviour changes: an [http:] hint no longer follows redirects unless it ends in follow, and a file or grep target that is absolute, uses .., or points into .zurdo/ or .git/ is now a parse error, not a --strict lint.

v1.33.0 (2026-10-26)

The verifier now accounts for itself. A file a passing hint read is re-checked after the last criterion runs, and one that changed in between fails the iteration. The run records the path and SHA-256 of every tool its [shell:] hints run and warns when one changes mid-run. [http:] says what it read: a followed redirect is flagged, the body read limit is the new http_read_limit key, and every red result records why. The report gains three signals: flaky criteria, witness coverage, and criteria that passed suspiciously fast. A fourteenth lint family, http-missing-server, warns when a localhost [http:] hint has no [shell:] to start its server; --strict doesn't promote it. Behaviour changes: a [shell:] criterion and completion_command now run in a clean environment, so a variable they relied on has to be listed in env_passthrough; a HEAD hint with contains is a parse error; and a contains against a body over 64 KiB fails as http_body_too_large.

v1.32.0 (2026-10-25)

A green criterion is now harder to satisfy from outside the tracked tree. File and grep hints must point inside the repository, and .zurdo/ and .git/ are never valid targets. Five toolchain files (.cargo/**, rust-toolchain, rust-toolchain.toml, .npmrc, pytest.ini) are frozen by default, gitignored frozen files are now enforced too, and cargo test, go test or pytest must print its report line. The new min-tests:<N> modifier sets a floor on how many tests ran, and a passing file or grep hint records the git blob of the bytes it read. Two lint families are new: hint-path, which --strict promotes, and frozen-suggest, which it never does. Behaviour changes: a run with no configuration now fails an iteration that edits one of the five toolchain files (protected_path_defaults = false turns the defaults off), a hint whose target sits outside the repository now fails, and so does a pytest run in which only skipped tests ran.

v1.31.1 (2026-10-23)

brew tap numeron-lab/zurdo works again on Homebrew 7, which rejected the 1.31.0 formula because it had no download for Intel Macs. Intel Macs are still not supported; Homebrew now says so when you install.

v1.31.0 (2026-10-22)

A changed-line coverage gate: once a task's criteria pass, zurdo run measures how much of the code it changed the tests ran, and fails the attempt under the threshold (80% by default). zurdo init detects Rust, Go, TypeScript, Python, Maven and Gradle and writes a [[coverage.source]] for each; a task's **Coverage** key overrides the threshold or exempts it. Breaking: zurdo run now refuses a config with no [coverage] table — run zurdo init --sync to print the one generated for your repository, or set enabled = false. Releases and the Homebrew tap moved to numeron-lab.

v1.30.1 (2026-10-12)

Analyzer calls behind scaffold, analyze --fix and heal now run without the agent's tools, so they can only reply. scaffold rejects a draft whose patches already make a task pass, and Copilot token counts are recorded again.

v1.30.0 (2026-10-11)

New zurdo scaffold drafts a PRD from a design-record section, marked unreviewed-scaffold until the zurdo-prd-author skill reviews it. That makes eleven lint families, seven promoted by --strict, and adds an eighth bundled skill, zurdo-goal-author.

v1.29.0 (2026-10-10)

Headless sign-off: zurdo review --sign-off <task>:<n> --by <name> signs a [manual] criterion without the terminal UI, and --no-prompt lists what is pending as JSON. The MCP server gains pending_signoffs and sign_off.

v1.28.0 (2026-10-09)

zurdo self-update verifies each release's signature before trusting its checksums, and refuses unsigned releases (v1.27.0 and earlier).

v1.27.0 (2026-10-08)

New zurdo self-update. Token and cost totals now count transient retries and side calls such as model probes, and zurdo report splits them by source.

v1.26.0 (2026-10-06)

Pyxis, a retrieval index over symbols and Markdown sections: zurdo pyxis, the [pyxis] table, and the MCP find_related tool. Ranking is lexical, or hybrid once the embedding model is installed.

v1.25.0 (2026-09-29)

Deeper Lumen indexing in every language: fields, enum variants, aliases and member access. Some hints pinned to the old kind must be re-pinned; zurdo lumen query --name shows what is recorded now.