What's new in Vary v122-alpha.1 (2026-04-25) — v122-alpha.1 is out. The headline is vary var, a new top-level command that runs check, test, mutation, and review under a cost budget. The mutation engine was rewritten around reachability tracing, kill-first scheduling, and a hot-swap backend. Frugal, a native PEG parser library ported from Parsimonious, also lands.
Vary mutation testing speed: comparing to AST and PIT (2026-04-20) — Vary now measures mutation-testing performance directly on real benchmark programs, including a project-scale parser workload and a PIT-style comparison fixture, and the current results are strong enough to talk about in concrete terms.
Inside PIT, Part 2: Why It Stays Fast (2026-04-12) — PIT is not just fast in one narrow benchmark sense. This article explains the design choices that make it a strong production mutation tool.
Inside PIT, Part 1: The Execution Model (2026-04-12) — PIT is one of the clearest production examples of fast JVM mutation testing. This article explains its execution model in plain language.
How AI tools should use vary var (2026-04-12) — vary var is the control loop for AI-assisted coding: run it, fix what it reports, run it again until the working tree is complete.
The Bytecode Mutation Thesis (2026-04-11) — An architectural argument for why bytecode mutation should be faster than source-level mutation, now grounded in controlled benchmarks across Python and Vary on the same ported codebase.
Why Mutation Testing Is Slow (and What to Do About It) (2026-04-10) — Mutation testing has a dirty secret: some mutants create infinite loops. This article explains why, how Vary handles it, and what it means for your mutation scores.
How Bytecode Mutation Testing Works (2026-04-09) — What mutation testing is, why bytecode makes it fast, and one worked example showing the exact instructions that change when Vary mutates compiled code.
Bytecode mutation under the hood (2026-04-09) — How Vary's bytecode mutation engine actually works: which library does the patching, what changes inside a class file, and how the runner decides whether a mutant got caught.
Bytecode Mutation Is Why Vary Uses the JVM (2026-04-09) — Source-level mutation testing is too slow to become part of the everyday loop. Vary targets JVM bytecode because patching compiled methods is fast enough to make mutation testing practical.
Verifying Vary releases with Sigstore (2026-04-05) — Starting with v117, every Vary release is signed with Sigstore. Varyup checks the signature automatically. Here is how to verify it yourself.
Installing agent skills (2026-04-04) — vary new now copies a language skill pack into the right directory for your AI coding tool. One flag, and the agent writes valid Vary from the first prompt.
Human-readable, AI-written, confidence at scale (2026-04-02) — Vary is adding three optional flags to vary check that push AI-generated code and tests toward stronger patterns before heavier verification runs. Here is what they do and what they do not do.
From generated code to confidence at scale (2026-04-02) — Vary's confidence workflow starts from a stronger project shape and pushes generated code and tests toward better defaults before deeper validation begins.
The verification ladder for AI coding tools (2026-04-01) — An LLM should not run every verifier on every edit. Start with the cheapest command that can reduce uncertainty, then escalate only when the earlier stage is clean.
How We Mutation Test the Compiler (2026-03-26) — Vary has built-in mutation testing for Vary code, but the compiler is still written mostly in Kotlin. That means compiler quality comes from three different layers: PIT for Kotlin implementation tests, VAST for compiler semantics, and release validation around both.
Value Pools Make Random Programs Better (2026-03-24) — VAST finds compiler bugs by generating random valid programs. Value pools make those programs less like disconnected noise and more like real code by reusing earlier values.
Wiring Vary Check into the LSP (2026-03-21) — Vary's check engine runs the same rules in the CLI, CI pipelines, and your editor. Here is how we connected a lint engine to a language server without duplicating anything.
Building a lint engine that explains itself (2026-03-21) — Most linters give you a code and a one-liner. Vary's check engine ships rationale, examples, and fix guidance for every diagnostic, generated from structured metadata rather than hand-written prose.
Binary data without the footguns (2026-03-21) — Vary ships a Bytes type that threads through filesystem, HTTP, and crypto APIs as a single coherent type. No casting, no encoding accidents, no 'was that a string or bytes' confusion.
Vary VAST finds a bug (2026-03-19) — Vary's built-in fuzzer generates thousands of random programs and runs them three different ways. When two paths disagree, there is a bug. This week it found one.
Across the bridge: why three trucks is not enough (2026-03-17) — Vary's new across construct generates random typed inputs for your test assertions, catching edge cases that hand-picked examples miss.
Contracts that catch bugs before tests do (2026-03-17) — Vary lets functions declare what they promise: what inputs they accept, what outputs they guarantee, and what should never change. When a promise breaks, you hear about it immediately.
Try Vary in Five Minutes with Docker (2026-03-15) — You do not need to install anything on your machine. Pull the Vary Docker image and run real programs in under five minutes.
Introducing Vary (2026-03-01) — Vary is a statically-typed language that compiles to JVM bytecode. It has readable syntax, compile-time null safety, contracts, and a built-in mutation testing engine.