# Articles

- [What's new in Vary v122-alpha.1](/articles/whats-new-in-vary-v122/) (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](/articles/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](/articles/why-pit-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](/articles/how-pit-works/) (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](/articles/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](/articles/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)](/articles/why-mutation-testing-is-slow/) (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](/articles/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](/articles/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](/articles/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](/articles/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](/articles/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](/articles/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](/articles/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](/articles/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](/articles/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](/articles/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](/articles/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](/articles/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](/articles/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](/articles/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](/articles/across-the-bridge/) (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](/articles/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](/articles/try-vary-in-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.
- [Why Mutation Testing Belongs in the Compiler](/articles/why-mutation-testing/) (2026-03-10) — Most mutation testing tools bolt on after the fact. Vary builds it into the compilation pipeline.
- [Introducing Vary](/articles/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.
