agentlanguages.dev
verification camp

Pact.

Intent blocks on every function and route, pipeline syntax, explicit effects, errors as types. Single binary that ships an HTTP server, SQLite, an LSP, and an MCP server with five tools.

authorViktor Kikot
implementationRust
targetInterpreted (tree-walking)
licenceMIT
first seenApril 2026
maturityworking compiler

The thesis.

Pact’s diagnosis is that most backend code is glue, and that the glue is exactly where agents waste iterations. Intent is hidden in comments that drift, effects are hidden in implementation bodies, and errors are hidden in exception hierarchies. The verification-camp move is to drag all three back into the signature: every function and every route opens with an intent string, declares a needs list of effects, and resolves to a sum type like User or NotFound. The compiler reads that as the contract; the type checker, formatter, LSP, and MCP server all consume the same declarations.

Every function says why it exists. Errors are data, not explosions.

The distinctive move is the breadth of what ships inside one binary. A .pact file declares app Notes { port: 8080, db: "sqlite://notes.db" } and pact run brings up an HTTP server with SSE streaming, SQLite in WAL mode, JWT auth, a structured logger, and a built-in MCP server — no dependencies, no ORM, tables auto-created from struct fields. This is close to Aver in design DNA (declared intent + declared effects + colocated checks), but where Aver lifts verify blocks into Lean 4 and Dafny, Pact spends its complexity budget on the runtime an agent will actually drive.

What it looks like.

intent "create a new user with default Viewer role"
fn create_user(data: NewUser) -> User or BadRequest
  needs db, time, rng
{
  let existing: User = find_by_email(data.email)
  return BadRequest { message: "Email already taken" } if existing != nothing

let user: User = { id: rng.uuid(), email: data.email, role: “Viewer”, active: true, created_at: time.now(), }

db.insert(“users”, user) }

An intent line, an effect list, and a sum-typed return — all in the signature before the body.

Distinctive moves.

Maturity.

Single-author project, MIT-licensed, currently at v0.5 with six tagged releases (latest v0.3.1, Apr 2026), 204 commits and 496+ tests on the master branch. The README is explicit that it works for small APIs and CRUD services and is not production-ready; the web playground is the next planned milestone. Stars and forks are at zero, which understates the surface area shipped — deep type checker, formatter, LSP, MCP server, VS Code extension, install script for macOS/Linux, and a Docker image are all in the tree today.

Agent tooling.

CLAUDE.md and a checked-in .mcp.json orient Claude Code at the project level. pact mcp exposes five tools over stdio JSON-RPC: pact_run, pact_check, pact_docs, pact_format, pact_test. pact lsp provides diagnostics, hover, and autocomplete for any LSP-capable editor. Documentation is queryable from the CLI (pact docs <topic>) so an agent can pull a topic and a working example before generating code.

design DNA
  • Aver verification Closest design relative. Both attach declared intent and effects to every function; Aver lifts the verify block into Lean 4 and Dafny exports, while Pact keeps the surface lighter and ships a working web stack.
  • Vera verification Vera's requires/ensures clauses are the strict cousin of Pact's intent blocks. Vera mechanically discharges them via Z3; Pact treats the intent as documentation the type checker and MCP server consume.
  • Boruna orchestration Another single-author Rust project where the engineering depth runs well ahead of the public profile. Both ship MCP servers as the agent-facing surface.