Prologue · the essay that started the week

Vibe coding, minus the vibes

An AI wrote this Rust. A reviewer called it gorgeous. It doesn't look AI-written — and that's the whole point.

Lane Thompson · 2026-07-03 · 5 min

Last week I watched an agent write a Rust module I'd put up against most senior engineers' work. Lazily-compiled regexes behind OnceLock. A small, documented helper reproducing JavaScript's lenient parseFloat semantics — a subtlety nobody asked it to handle. Clean branches, honest types, zero dead code. A reviewer skimming it would swear a careful human wrote it.

Here's what makes that interesting: the same class of model, on a normal day, produces the code we've all learned to squint at. Happy-path tests. Abstractions nobody needed. Logic that's plausible right up until it's wrong. We have a name for that output now — vibe coding — and the discourse about it has exactly two settings: "this is the future" and "this is slop."

Both miss what vibe actually is.

Vibe is uncertainty made visible

A model fills every degree of freedom your problem leaves unconstrained with its priors — the averaged habits of all the code it has ever seen. Vague ask, vibey answer: the happy-path bias, the hedge-everything error handling, the kitchen-sink config object. None of that is the model misbehaving. It's the model answering the question you actually asked, which was underspecified, so it padded the gaps with vibes.

The slop isn't in the model. It's in the leftover freedom.

That reframe changes the fix. If vibe were an intelligence problem, you'd wait for a smarter model. If it's a freedom problem, you can squeeze it out — mechanically, today.

The squeeze

This is the loop rederive is built on. Four moves, each one removing a class of freedom:

What it looks like when the freedom is gone

We ran this on a color-parsing package millions of projects depend on. Along the way, characterization surfaced a real bug — a floating-point rounding slip that renders rgb(50%, 50%, 50%) one shade off (127 instead of 128; 2.55 isn't exactly representable, and no test had ever noticed). We didn't patch the code. We corrected the contract, and let the machine rebuild from that.

Three agents rebuilt the unit in JavaScript, blind, in parallel. All three passed every held-out case. All three agreed with each other on five thousand randomized inputs — and structurally, they'd written nearly the same program: same shape, same helper, same hoisted constants. Then, as a lark, we handed the identical contract to a fourth agent and said: Rust.

# one contract → four blind reconstructions
  emit_1 (js)   5000/5000
  emit_2 (js)   5000/5000   ← agree with each other
  emit_3 (js)   5000/5000
  emit_4 (rust) 5000/5000   ← byte-identical behavior to the JS builds

The Rust agent fought through real language friction on its own — Rust's standard regex crate doesn't support lookahead, so it found the crate that does; JavaScript's number parsing is lenient, so it wrote and documented a bridge for exactly that semantic. The bug is fixed in every version — by agents that never saw the buggy line.

That Rust is the gorgeous module from the opening. Nobody told any of these agents to write clean code. There was just nothing left to be messy about. Every decision a model normally vibes through — structure, behavior, edge cases, garbage input — was already decided by the contract and enforced by the oracle. What remained was the one thing models are genuinely great at: fluent, idiomatic expression.

Vibe diverges; certainty converges

That's the tell I now use everywhere. Ask an agent for the same thing three times and you'll get three aesthetics, three bug profiles, three vibes — that's the prior talking. Constrain the problem fully and independent attempts collapse onto the same solution.

The measurement nobody talks about

Agreement between blind rebuilds isn't just a correctness check. It's a measurement of how much vibe was left in your spec. Where independent attempts diverge is exactly where your contract was ambiguous — and that's information you can act on.

Steal this, even without our tooling

"Vibe coding" was never a fixed property of the technology. Freedom is a dial. Turn it down with contracts and ungameable checks, and the same models that produce slop produce work that converges, verifies, and reads like a careful human on their best day.

We've spent the last months turning that dial into infrastructure. It's called rederive, it's open source, and it's live: npm i -g rederive.

Lane Thompson — Founder, rederive · GitHub · rederive.ai