Archive Index

Browse the publication

Move between essays, the shelf, highlights, and the observatory without losing the editorial thread.

Deep Dive Software Architecture 18 Min Read

Phoenix Architecture: Disposable Code, Durable Systems, and the End of Software as We Know It

Herman Boma

March 24, 2026

There is an assumption so deeply embedded in how we think about software development that most practitioners never examine it: code is the product. We write it, we test it, we review it, we refactor it, we measure ourselves by its elegance, and we mourn when it must be thrown away. The entire craft of software engineering is organized around the premise that the code we produce is the primary artifact of our labor.

Chad Fowler — a venture capitalist at Blue Yard Capital, but shaped by decades as a builder: CTO of Wunderlist, leader of Ruby Central, serial practitioner of system-euthanasia consulting — argues that this assumption has always been wrong, and that AI-generated code makes the wrongness impossible to ignore.

His thesis, articulated through what he calls Phoenix Architecture, inverts the relationship between specification and implementation: the specification is the source code. The implementation — the actual running software, in whatever language, whatever framework — is a build artifact. A compiler output. Something that should be regenerated as casually as we recompile a binary.

“The code that we have is a liability and the system is the asset that we’re building.”

The word phoenix is chosen deliberately. The mythological bird that burns to ash and rises again is the exact metaphor: constantly destroying and rebuilding every piece of the system, but never destroying the system itself. The system persists because it has a shape — consistent calling conventions, shared data models, architectural invariants — that survives any individual implementation. The implementations burn. The shape endures.

Architectural blueprint engulfed in regenerative flames — the phoenix metaphor for disposable code and durable systems


The Euthanasia Problem

Fowler’s thinking did not begin with AI. It began in the early 2000s, when he found himself in a recurring professional role: the person organizations hired to kill their existing software systems. A company would have a system that had served them well but could no longer keep pace with business or technical demands. Fowler would arrive, and the system would be euthanized. A new one would be built in its place.

After performing this ritual enough times, a question began to gnaw at him: why are we building systems that die within five years? The amounts of time, money, and emotion invested in software systems are enormous. Yet these systems reliably decay, become unmaintainable, and eventually must be replaced.

Meanwhile, human bodies — which most of us do not maintain with anything resembling the investment we pour into software — persist for decades. What do biological systems know about durability that software systems do not?

The answer, Fowler realized, is that software systems die for the same reason muscles atrophy: disuse. A server with two years of uptime is not a testament to stability — it is a system that has not practiced change. When change finally becomes necessary, the system cannot perform it. The build toolchain has rotted. The dependencies have drifted. The knowledge of how the system works lives only in the heads of people who may no longer be available. The system’s impressive uptime is actually evidence of its fragility.

At Wunderlist — the to-do list application that would eventually be acquired by Microsoft — Fowler tested an idea. He imposed a radical constraint on his engineering team: you can write code in any language you want, as long as each unit of code fits on a single page of your editor. The team built a microservices architecture where every service was tiny, had consistent calling conventions, and had well-defined interfaces.

Two incidents validated the approach. A service written in Haskell — so stable it never needed changes — became undeployable because its build system rotted beneath it. An engineer simply rewrote the entire service in Go in an afternoon and deployed it. The disposability of the code was the feature, not the bug. Later, after a major release, the team replaced approximately 70% of the codebase over three months — swapping Ruby on Rails services for implementations in Closure, Go, and Rust. Infrastructure costs dropped to roughly 25% of what they had been at launch. The system survived a near-total code replacement because the code was never the asset. The system — its shape, its conventions, its interfaces — was the asset.


Cattle, Not Pets

The DevOps revolution formalized a related insight as immutable infrastructure: never modify a server, always replace it. Containers and cloud instances made this practical. The cattle-versus-pets metaphor captured it perfectly — you stop naming your servers and start treating them as interchangeable units in a herd.

Fowler’s second insight was that the same principle should apply to code.

“I also knew that server’s name and I knew its IP address and I set it up myself physically. I cared about it. And when you get to immutable infrastructure, you can never be attached to one running instance. I think the same lesson applies to code — we have all developed this almost fetish-like worship of our code, forgetting that the code is not actually the thing we’re trying to build.”

In Phoenix Architecture, you do not compile Java to a JAR; you compile a specification to Java (or Go, or Rust, or whatever the current best target happens to be). The specification is what you version control, what you review, what you reason about. The code is what falls out of the compilation step.

Andrej Karpathy, working from an entirely different starting point, arrived at the same conclusion. In his analysis of the auto-research paradigm, he described the inversion with characteristically sharp precision:

“Code is no longer a durable artifact that engineers maintain for years. It is a disposable byproduct of intent expression. The user says what they want. The agent generates code to accomplish it. The code runs, the result is delivered, the code may never be used again.”

The implications cascade. If code is a build artifact, then code review as traditionally practiced becomes unnecessary — or rather, it transforms into specification review. If code is a build artifact, then the choice of programming language is a compilation target decision, not an identity decision. If code is a build artifact, then “legacy code” stops being a burden — you do not maintain legacy compiled binaries, you recompile from the source with a newer compiler.

“What we’ll be compiling to is more system architectures — a shape of the system that allows us to have pluggable, replaceable components because of the shape of the system, because of the calling conventions and the consistency. They won’t be about the programming language. They’ll be about how this thing runs and how the components interact.”

Ford and Richards, in Architecture as Code, independently discovered the same pattern. They propose an Architecture Definition Language as a “Rosetta Stone” — a single, declarative, human-readable specification of architectural concerns from which platform-specific implementations can be generated. The ADL becomes the canonical specification; the generated code is a disposable, regenerable artifact.

A grid of identical glass cubes — one shattered, the rest unaffected. Individual units are disposable; the grid persists

A shadow on a sunlit wall that acts independently of the person casting it — agent decisions nobody chose


The Shadow Spec Problem

This is where Phoenix Architecture moves from elegant theory to genuinely unsettling practice. When AI agents build software, they make countless decisions that no human ever reviewed or even saw. Fowler names these shadow specs — decisions the agent made autonomously, creating an invisible stratum of unchosen design decisions.

“There’s the spec and the shadow spec — which are the decisions you never made but have been made for you.”

The shadow spec problem is not merely a provenance nuisance. It is an alignment drift problem at organizational scale. As agents make more autonomous decisions — choosing data structures, designing database schemas, implementing error handling strategies, selecting third-party libraries — the gap between what the organization intends its software to do and what the software actually does widens silently. The system works, so nobody investigates. But the accumulated shadow specs represent a growing body of unchosen, unreviewed, potentially contradictory design decisions that will eventually create problems nobody can trace to their source.

Simon Willison, in his analysis of the Trust Threshold for AI coding tools, identified the same structural concern from the practitioner’s side. He distinguishes between the specification surface — where human intent is expressed — and the execution surface — where code actually runs. The traditional development setup collapses these onto the same machine. Phoenix Architecture separates them by design, and in doing so, makes shadow specs visible through its provenance chain: every piece of code can be traced back to a specification, and every specification can be traced back to either a human decision or an agent decision.

This is a new category of technical debt: not code that was written badly, but decisions that were never made — they just happened. The antidote is provenance tracking that distinguishes between human-specified, human-reviewed, and agent-autonomous decisions.


Pace Layers and the Lock

The most technically substantive challenge in Phoenix Architecture is what Fowler calls pace layers — the idea that different parts of a system should change at different speeds, and that this differential velocity must be built into the architecture itself.

Consider Fowler’s current project, an IRC network called Freak. At the bottom of the stack is the IRC protocol implementation. This needs to get right quickly and then be locked — it should change only if there is a bug or a deliberate protocol upgrade. Above that are protocol extension layers, then client SDKs, then client applications. Each layer moves at a different speed, and specifications at lower layers should be more stable, more carefully reviewed, and more resistant to casual regeneration.

The critical skill in a Phoenix Architecture is knowing what to lock. A specification can be “locked,” which means its corresponding tests and implementations are frozen. You can regenerate the entire codebase from specifications, and the locked layers will produce identical output, while unlocked layers may produce new implementations.

Ousterhout’s insight from A Philosophy of Software Design applies directly: “Software systems are composed in layers, where higher layers use the facilities provided by lower layers.” The key addition Phoenix Architecture makes is that these layers should have explicit stability semantics — locked layers regenerate identically, unlocked layers regenerate differently. The specification crystallizes in the areas that matter and remains deliberately open in the areas where you are genuinely indifferent.

The right level of specification detail, Fowler argues, is not determined by analysis but by iteration. You write a vague spec, the agent builds something, you look at the result, you refine the spec where the result diverged from your intent, and you leave it vague where the agent’s choices were acceptable. Over time, the spec crystallizes into the minimum viable specification for your actual intent.


The Easy Path Principle

Fowler frames the entire motivation for Phoenix Architecture around a principle that deserves wide circulation: the easy path principle. The goal of the architecture is to be able to deploy code in production that was generated by AI and that humans never reviewed.

This sounds reckless until you hear the reasoning. It is not a technology prediction — it is an anthropological one.

“We know that’s what’s going to happen — not because we’re looking at the future and technology trends, but because we know human behavior and it’s way too easy to do that now. People are always going to do the easy thing. So let’s figure out systems that make the easy thing okay to do.”

The reasoning echoes a deep insight from extreme programming: if something is hard, do it all the time. Testing was hard, so extreme programming said test constantly. Code review was expensive, so pair programming said review constantly. Change is hard, so Phoenix Architecture says change constantly — make change so fundamental to the system’s operation that the system cannot function without it. Build architectures where you have no choice but to constantly change, and where you can never actually look at the code. Then, when AI generates code that nobody reviews, the system is already designed to handle exactly that situation.

Theo Browne and Chris Gregory, writing in “Code Is Cheap, Software Is Expensive,” name the same pattern explicitly:

“The Disposable Code Pattern: Code written with no intention of reuse, maintenance, or long-term operation. Single-use intention — written to solve a specific problem exactly once. No version control. Minimal error handling — if it breaks, regenerate rather than fix. Quality standard: ‘good enough to run once.’”

What was once the exception — throwaway scripts, one-off data transforms — becomes the rule. The infrastructure that makes disposable code safe (specifications, invariants, evaluations, pace layers) becomes the real engineering artifact. The code is the exhaust.

Earth strata as a metaphor for pace layers — granite at the bottom, smoke at the top, each changing at its own speed

A zen garden where all paths lead gently to one point — the easy path principle made architectural


What Changes Now

If you have absorbed this analysis, several questions deserve immediate attention.

For individual developers: start treating your specifications as more valuable than your code. Right now. Version-control your prompts, your system instructions, your architecture decisions, your constraints. If your AI coding tool sessions disappear into the void, you are losing the most valuable artifact of your work. The conversation that produced the code is the source code.

For architects: examine your system boundaries. Are your components small enough and bounded enough that any one of them could be replaced by regenerated code without affecting the rest? Are your calling conventions consistent enough that a code generator could target them? If not, you are building a system that cannot survive the transition to regenerative software — and that transition is coming whether your system is ready or not.

For engineering leaders: conduct a shadow spec audit. How many design decisions in your codebase were made by AI agents without explicit human review? You almost certainly do not know the answer, and the answer is almost certainly larger than you think. Those shadow specs represent a new form of technical debt — unchosen decisions that may or may not align with your intent.

“It’s a miraculous time to be a software developer — as well as a terrifying one. But we get to be steering through this crazy time.”

The phoenix metaphor is apt in one final way. When the bird burns, the ash is not nothing. It contains the seed of what comes next. The specifications, the invariants, the intent chains, the knowledge graphs — these are the ash that survives the fire. The code burns. The system rises.

Related from the Archive