What Is AI-Native Engineering?

James Phoenix
James Phoenix

Alfonso Graziano wrote the cleanest short definition I have seen: building production software by directing AI agents through spec, context, and verification. His three prescribed pillars are spec, context, and harness. I think verification is a fourth pillar rather than a step inside review, and it is the one that decides whether the other three hold.

Date: August 2026 | Riffs on: Alfonso Graziano, “What is AI-Native Engineering”


The definition

AI-native engineering is building production software by directing agents through a written spec, engineered context, an execution harness, and automated verification. The agent does the typing. The human stays accountable for what the system does in production.

The word doing the work in that sentence is native, and it is worth separating from assisted. AI-assisted means the model helps you write code you were going to write anyway: better autocomplete, a faster first draft, a rubber duck that answers back. Your workflow is unchanged, just quicker. AI-native means you restructured the work so an agent can carry it. The spec exists in a file because the agent cannot read your intent. The repo carries its own context because the agent starts every session with amnesia. The checks run without you because the agent needs to find out it was wrong before you do.

Leanpub Book

Read The Meta-Engineer

A practical book on building autonomous AI systems with Claude Code, context engineering, verification loops, and production harnesses.

Continuously updated
Claude Code + agentic systems
View Book
Take the agent away: an AI-assisted workflow gets slower because the spec, context and checks still live in your head, while an AI-native one stops because the scaffolding is doing the work
Take the agent away: an AI-assisted workflow gets slower because the spec, context and checks still live in your head, while an AI-native one stops because the scaffolding is doing the work

The tell is what happens when you remove the agent: an AI-assisted workflow gets slower, an AI-native one stops. That is not a failure state, it is the point. You built a system whose throughput is no longer bounded by how fast you type, and the cost of that is that the scaffolding has to be real.

The antipattern it is defined against

Alfonso names vibe coding as the thing this is not, and he is right to. Describe intent roughly, accept whatever comes back, ship it because it runs. For a prototype or a throwaway internal tool that is a legitimate mode and I use it happily. In production it fails for a specific reason: the output looks like code written by someone who understood the problem, and nobody did.

The subtler failure is the slide into it. You adopt agents to keep up, you start reviewing output instead of writing code, then you let an agent review the agent, and one stacked approval later you have stopped reading anything at all. I call that cognitive surrender, and it is worth naming because nobody decides to do it. It is what AI-native engineering degrades into when you keep the speed and drop the scaffolding. The two camps are separated by whether the channel is constrained before generation starts, not by tooling.

Pillar one: the spec

Write down what “done” means before you prompt, in enough detail that a stranger could judge the result. Behaviour, boundaries, acceptance criteria, the cases you explicitly do not care about.

This is the cheapest leverage in the whole practice because it moves review from “read 2,000 lines and pray” to “check the diff against the contract.” My version is verified spec-driven development: the spec is not a prose wish, it is a document with checkable claims. In practice that means a design doc that carries the full spec, indexed PRDs the agent can retrieve from, and enumerating options before committing to one so the agent is choosing inside a space you bounded rather than inventing one.

Pillar two: the context

Context engineering is getting the right information in front of the model at the right moment, and it is the discipline I have written the most about because it is where most of the day-to-day failure lives.

The entry points: writing a good CLAUDE.md so the repo teaches every session what it took you months to learn, dotfiles as a shared agent brain so conventions follow you across machines and projects, and contextual retrieval for the moment the codebase outgrows the window. The counterweight matters too: more context is not better context, and the MCP abstraction tax is what you pay when you bolt on tooling that fills the window with things the model did not need.

Pillar three: the harness

The harness is the environment the agent works inside: the commands it can run, the sandbox it runs them in, the loop that restarts it, the tools that let it see what it did.

Start at building the harness, then the sandbox is a harness for why isolation is a capability rather than a restriction, and 12-factor agents for the shape of an agent you can operate. The economic argument is the harness is cheaper now: infrastructure that was not worth building for a human team is trivially worth building for a fleet of agents, because the agent uses it a hundred times a day and never gets bored of it.

Pillar four: verification, and why it is load-bearing

Here is where I add to Alfonso’s version rather than just agreeing with it. He gets to “review output rigorously” and stops. That instruction cannot survive contact with agent throughput, because it asks a tired human to be the last line of defence against a generator that never tires.

Generation fell to roughly zero and verification stayed exactly as expensive as it always was, because it is still bottlenecked on a person reading a diff. Every pillar above increases the rate at which code arrives. Only this one changes what it costs to trust it. Skip it and AI-native engineering is just vibe coding with better paperwork.

Spec, context and harness stand as three pillars under the software you stay accountable for, and all three rest on verification as the load-bearing foundation
Spec, context and harness stand as three pillars under the software you stay accountable for, and all three rest on verification as the load-bearing foundation

What it looks like as engineering rather than exhortation: the verification ladder for how far to escalate proof as stakes rise, quality gates as information filters so each automated check collapses a huge space of defects into one signal that costs nothing to read, the trust-but-verify protocol so the agent produces the evidence and I review the evidence, and evals rather than vibes for anything whose correctness is a judgement call. Human attention does not disappear, it gets aimed: read less code, not no code, spending the budget where being wrong is expensive.

The role shift is real, but “orchestrator” is not a job title

The bottleneck did move from implementation to direction, and I would not fight that framing. I would resist the version where the engineer becomes a manager of agents who no longer needs to understand systems. The coder is obsolete, the programmer is not: writing the code was the commodity, deciding what should exist and what proves it works was always the job, and seniority was partly a proxy for typing speed until agents removed the proxy.

What changes is what you are responsible for. Stewardship over authorship: when you cannot read every line, reliability has to be a property of the system rather than of your attention. That is the practical content of “humans on the loop, agents in the loop” from the AI-native principles.

Where to start

In order, because each step makes the next one cheaper:

Five steps in order: write the repo context file, write the spec before the prompt, give the agent one way to learn it is wrong, grow the harness from real failures, then move each recurring review comment into a gate
Five steps in order: write the repo context file, write the spec before the prompt, give the agent one way to learn it is wrong, grow the harness from real failures, then move each recurring review comment into a gate
  1. Write the repo’s context file. One CLAUDE.md or AGENTS.md that says how this codebase works and what it will not tolerate. Highest return per hour of anything here.
  2. Write a spec before the next non-trivial prompt. One page. Behaviour, boundaries, acceptance criteria.
  3. Give the agent one command that tells it it is wrong. Types, tests, a lint rule, anything it can run itself without asking you.
  4. Grow the harness from the failures you actually hit. Do not design it up front, build it from what breaks.
  5. Move each recurring review comment into a gate. That is the compounding loop: every defect you catch by eye once becomes a check that catches it forever.

I run this across roughly 350,000 lines of production code as a team of one. Solo does not make the practice optional, it makes the pricing visible. There is no colleague downstream to absorb an unverified diff, so every gate I did not build lands on me at 2am.

One sentence

AI-native engineering is directing agents through spec, context, harness, and verification, and the fourth one is not optional, because it is the only pillar that changes what the other three cost you.

Related

Sources


Part of the field guide

This is one of my field notes in AI Native Software Engineering, a plain-English guide to building software with AI agents. The terms behind it are defined in the AI Coding Dictionary.

Topics
Agent ArchitectureAi AgentsContext EngineeringVerification

Newsletter

Become a better AI engineer

Weekly deep dives on production AI systems, context engineering, and the patterns that compound. No fluff, no tutorials. Just what works.

Join 306K+ developers. No spam. Unsubscribe anytime.


More Insights

Cover Image for Verified Spec-Driven Development (VSDD)

Verified Spec-Driven Development (VSDD)

Three methodologies that usually get argued about as rivals turn out to compose. Spec-driven development defines what, test-driven development enforces how, and adversarial verification checks that nothing was missed. Run them as sequential gates instead of competing philosophies and you get a pipeline where every line of code can be traced back to the requirement that demanded it.

James Phoenix
James Phoenix
Cover Image for “We Can’t Run Locally” Is a Concurrency Problem Now

“We Can’t Run Locally” Is a Concurrency Problem Now

The excuse survived a decade because one engineer’s feedback loop fitted inside one shared environment. Point twenty agents at that same environment and it stops being a slow loop and starts being a broken one.

James Phoenix
James Phoenix