Release notes

Kavach release notes:

Every release of Kavach, newest on top. 4 so far. Subscribe with RSS

4 new · 2 fixed · benchmark

Kavach 0.1.3: Stop one step before the crash and ask the service what it holds.

$ kavach replay null-amount.kavach --bin ./ledger --until 26 --probe …
  1. probe 1{"type": "withdraw", "account": "bob", "amount": 5000}ledger.rejections{"reason": "insufficient funds"}
  2. probe 2{"type": "deposit", "account": "bob", "amount": null}panic: nil pointer dereference
  3. probe 3{"type": "withdraw", "account": "bob", "amount": 10}ledger.entries{"delta": -10, "balance": 1640}
A real run on the ledger demo’s fixture. Replay stops after step seq 26 and keeps the service alive; the recorded crash at seq 32 never runs, so the verdict is ok. The null deposit brings the same panic back from the held state.

New

  • Time-travel replay. kavach replay <fixture> --bin <host> --until <seq> replays the fixture up to and including input seq, then holds the service there with its state intact. A replay stopped before the recorded failure reports ok, since the failing step never ran.
  • Probe the held service. Each --probe <input> is sent to the held service, and Kavach prints what it emitted, or how it failed, without changing the verdict. Probes see the last recorded clock, deterministic random bytes, and config as it stood at the step you stopped on.
  • --hold reads probes from stdin, one per line, until end of file, so you can question the service interactively.
  • kavach_time_travel over MCP. Agents get the same replay, with until, held_at_seq and each probe's outputs, decoded as text where they are UTF-8.

Fixed

  • Benchmark images keep their PATH in login shells. Tools installed in the image were missing from the agent's shell.
  • Invited trial runs no longer ask for a Turnstile check, and the widget's own errors are shown instead of a silent failure.

Benchmark

  • A trial mode for the benchmark console. Visitors can run the benchmark with their own OpenRouter key and a Daytona or Modal key, or with an invite code. Keys are held in memory only and scrubbed from every log and response.
  • An Events tab shows an attempt's OpenCode event log, and tool calls that are still running show up as steps.
  • Attempts in Daytona and Modal follow the event log through each provider's stream.
  • Every task sizes its own sandboxes, and an attempt without a patch says why.

v0.1.3 on GitHub

3 new

Kavach 0.1.2: The setup and invariant skills write their plan down first.

/kavach-setup

state-map.md

  • State Ledger.Balances, Ledger.Net
  • Entry points deposit, withdraw, transfer
  • Through env env.Now() for the time, env.Read() for the txn id

The handler is instrumented

/kavach-invariants

invariants.md

  • balances_non_negative, falsified by dropping the overdraft check
  • money_conserved, falsified by skipping the sender’s debit

The mutation sweep, written back to the file

  • invariant_violated(balances_non_negative)@19
  • invariant_violated(money_conserved)@9
The plans for the ledger demo, abridged from examples/ledger/.kavach/plan/. Each mutant was caught in 61.1 µs of replay.

New

  • /kavach-setup maps the service before touching it. It writes .kavach/plan/state-map.md first: the state boundaries, the entry points, and every clock, random and config read that has to go through env. A template ships with the skill.
  • /kavach-invariants plans before it mutates. Candidate invariants, and the one-line mutant meant to falsify each, go in .kavach/plan/invariants.md before any handler code changes. After the mutation sweep, the kill table is written back to the same file.
  • A worked plan for the ledger demo, in examples/ledger/.kavach/plan/, shows both files filled in.

v0.1.2 on GitHub

6 new

Kavach 0.1.1: Four agent skills, installed with the CLI.

kavach-setup

Instruments a handler with its SDK, or builds a kavach-host harness

kavach-invariants

Finds the state's laws and proves each one catches a mutant

kavach-fix

An incident: reproduce, fix, widen

fixed
kavach-implement

A feature: contract, approval, build

pass
scripts/install.shkavach, kavach-recorder and the four skills, into~/.claude/skills~/.codex/skills~/.config/opencode/skills
Set a service up once, find its invariants, then fix incidents or build features against them. Each skill stops at the verdict Kavach prints.

New

  • kavach-fix reproduces a production crash from its fixture and widens the fix until kavach diff returns fixed across the incident's variants and its regression variants.
  • kavach-implement runs the contract-first feature loop: record traffic, declare invariants from the spec, stop for a person to approve, then iterate until kavach contract check returns pass.
  • kavach-setup instruments a service handler, or builds a scoped kavach-host harness, in any of the twelve SDK languages.
  • kavach-invariants finds a service's domain invariants and checks each one with a mutation sweep that takes milliseconds.
  • One installer for the CLI and the skills. scripts/install.sh installs kavach, kavach-recorder and all four skills for Claude Code, Codex and OpenCode. --skills-only installs just the skills; --no-skills or KAVACH_SKIP_SKILLS=1 leaves them out.
  • A Claude Code plugin. The repository is also a plugin marketplace, and npx skills add kavachlabs/kavach finds the skills.

v0.1.1 on GitHub

6 new · faster · 3 fixed · benchmark

Kavach 0.1.0: Replay the crash, and count a fix only when its variants pass too.

The first release. A service records every input, clock read and random read through its SDK; a crash becomes a fixture; kavach replay reproduces it against any build, and kavach diff decides whether a fix really fixed it.

Your service

  • C/C++
  • Elixir
  • Go
  • Haskell
  • Java
  • Julia
  • OCaml
  • PHP
  • Python
  • Ruby
  • Rust
  • TypeScript

reads time and randomness, and emits, through env

kavach-recorder

null-amount.kavach, crash at seq 32

kavach

  • kavach replayreproduce it on a buildstill_failing@32
  • kavach diffthe incident, ≥ 10 variants and ≤ 48 regression variantsfixed
  • kavach contracta feature against approved traffic and invariantspass

kavach mcp serves all of it to coding agents

The tape is the ledger demo’s fixture: eight inputs, then a crash at seq 32. Over MCP, agents can replay, diff and check contracts; approving one is left to a person.

New

  • kavach replay replays a fixture against a host command for any build, compiled or interpreted, and prints a verdict: still_failing@N, fixed, diverged@N, nondeterministic@N and the rest.
  • kavach diff checks a fix against variants of the incident. Besides the recorded failure, it replays at least ten variants that make the old build fail the same way: fields changed or removed, array elements swapped across positions or changed in pairs, the failing input moved earlier, earlier inputs dropped or redelivered, the clock shifted. A fix that only handles the exact recorded input fails one of them.
  • Regression variants. kavach diff also mutates up to six earlier inputs that resemble the failing one, up to 48 variants, and the new build must give the old build's outputs on each. A fix that breaks nearby behaviour gets regressed(K)@N, and the variant is saved as <fixture>.regression-NN.kavach.
  • kavach contract for features. init, show, approve and check turn recorded traffic and invariants written from a spec into a contract a new feature has to meet. approve is for a person; there is no MCP tool for it.
  • kavach mcp serves incidents, replay, diff and contracts to coding agents over the Model Context Protocol.
  • Twelve SDKs record through kavach-recorder: C and C++, Elixir, Go, Haskell, Java, Julia, OCaml, PHP, Python, Ruby, Rust and TypeScript. A service without an SDK can speak the protocols directly; INTEGRATING.md shows how.

Faster

  • Recording goes over a shared-memory ring. The SDK publishes each record with a copy and one release store, and falls back to the pipe when a ring can't be set up. Recorder overhead per event fell under 100 ns in each SDK measured.
  • Recorder segments are sealed in the background, with a standby segment ready to take over.

Recorder overhead per event, over the ring

Rust62 nspipe 271 ns4.4×Rustring 62 nspipe 271 ns4.4× less per event
Julia64 nspipe ~14,000 ns219×Juliaring 64 nspipe ~14,000 ns219× less per event
Java76 nspipe 416 ns5.5×Javaring 76 nspipe 416 ns5.5× less per event
Go81 nspipe 556 ns6.9×Goring 81 nspipe 556 ns6.9× less per event
Haskell84 nspipe 405 ns4.8×Haskellring 84 nspipe 405 ns4.8× less per event
C and C++93 nspipe 469 ns5.0×C and C++ring 93 nspipe 469 ns5.0× less per event
Show as a table
SDKPipeRing
Rust271 ns62 ns
Julia~14,000 ns64 ns
Java416 ns76 ns
Go556 ns81 ns
Haskell405 ns84 ns
C and C++469 ns93 ns
Median of five runs on an M3 Pro, for the six SDKs measured. Each records an event in under 100 ns over the ring, down from 271 ns to about 14,000 ns over the pipe.

Fixed

  • A crashed step is reported as crash. It used to read error: , so variants of a crash incident never matched it.
  • Every SDK waits for the recorder to be ready before running the first step.
  • The ledger demo's fixture no longer carries a real hostname, user or build paths. It still fails at seq 32.

Benchmark

  • An agent benchmark of incident and feature tasks taken from Redis, Valkey, axum, httpx, kombu and go-genai, each run by coding agents with and without Kavach, in Docker or in cloud sandboxes on Daytona, Modal or Vercel with your own keys. bench export writes a read-only copy of the console for a static host.

v0.1.0 on GitHub