How to deliver high-quality software with AI-native development / Set the standard before you build
The decisions that stay with your engineers
An agent will make an architectural decision without telling you it made one. It will pick a queue, invent a boundary, choose a consistency model, and present all of it as implementation. This page covers which decisions should stay with your engineers, why those specific ones, and how to record them so the next session does not reverse them without anyone noticing.
Published September 1, 2026. Editorial.
Key takeaways
- The test is reversibility. Decisions that are expensive to undo stay with people; decisions a later change can cheaply replace can be delegated.
- Agents make architectural choices silently, presented as implementation detail, which is what makes them hard to catch in review.
- Write decisions down as short records in the repository. An unwritten decision will be reversed by the next session that has no reason to know about it.
- Data models, trust boundaries, external contracts, and anything with a migration attached are the four that most reliably need a human.
The useful question in an AI-native team is which decisions a person should make. Putting a person on every decision brings back the slow step you were trying to remove. Putting them on none produces a system whose design nobody chose.
We decide with one test, and then apply it to four specific areas.
The test: how expensive is it to undo
A decision belongs to a person when reversing it later is expensive, and can be delegated when a later change can replace it cheaply. That is the whole rule, and it is deliberately about cost rather than about importance, because importance is an argument and cost is a number you can estimate.
Choosing how a function is structured internally is cheap to undo: rewrite the function. Choosing how a value is stored across ten million rows is not: you need a migration, a backfill, a period where both shapes exist, and a rollback plan for each step. The second one gets a person even though the first one might look more like real engineering.
This test also explains why the split between human and delegated decisions moves over time. As a system gets more coupled, more decisions become expensive to reverse, and more of them need a human. A team that finds itself needing sign-off on everything usually has a coupling problem rather than a governance problem.
The four that reliably need a person
The data model. Field names, nullability, cardinality, where a value lives and which service owns it. Everything built on top depends on these, and the cost of changing one after data exists is measured in weeks. An agent will readily add a nullable column to solve today's ticket, and that column will be interpreted three different ways within a quarter.
Trust boundaries. Who is allowed to do what, where that is enforced, and which side of the boundary a piece of input arrives on. Permission logic is unusually easy to generate and unusually hard to review, because a plausible-looking check in the wrong place reads exactly like a correct one. This is also where the consequences are worst, since a permission mistake is often silent until it is public. Our post on why permissions are the hardest part of an AI feature covers the pattern.
Contracts other people depend on. Public API shapes, event payloads, file formats, anything a customer or another team has already integrated with. These are expensive to reverse because the cost is paid by people outside your team, on a timeline you do not set.
Anything that carries a migration. If undoing the change requires moving data, the decision is not an implementation detail regardless of how small the diff looks.
Everything else, including most of the code, can be delegated with checks. That is a larger share of the work than most leaders expect when they first make this split.
Why agents make these decisions invisibly
A human engineer proposing a new queue, a new table or a new service will usually say so, because they know it is a decision and they want others to agree with it first. An agent will do the same thing inside an implementation, describe it in one line of a summary, and move on. It is not hiding anything. It simply does not have a model of which choices your organisation considers reversible.
The practical consequence is that these decisions do not arrive labelled. They arrive as a diff. If your review process depends on someone noticing that line 340 introduced a second source of truth for customer status, you will catch it sometimes.
Two things help. The first is asking for the decision explicitly before the work: what are you going to store, where, and who owns it. The answer takes a minute to read and is the single highest-value minute in the process. The second is making the important boundaries visible in the codebase itself, so an automatic check detects when one is crossed, rather than someone having to notice. Directory boundaries, module ownership rules, and lint rules that forbid an import across a layer all turn an architectural rule into a failing check, which is the subject of the quality gates that should block a merge.
Write the decision down or it will be reversed
An unwritten architectural decision does not last long in an AI-native codebase. The next session has no memory of the discussion, sees code that could be simpler, and simplifies it. That is not a defect of the tool, it is the correct behaviour given the information available.
Short decision records fix this, and they need to be in the repository rather than in a wiki nobody has ever linked to from the code. Ours are a few lines: what was decided, what the alternatives were, why this one, and what would make us revisit it. The last clause matters more than it looks, because it tells a future reader whether the decision is still binding or whether the reason behind it has expired.
Two rules make records work rather than accumulate. Keep them next to what they constrain, so someone touching the code has a reason to encounter them. And keep the count low: a hundred decision records is a document nobody reads, while twelve that describe the real design of the system get read by every new engineer and every agent session that is given them to read.
The mechanics of writing this so both a person and a model can use it are in documentation an agent and a new hire can use.
Make the agent declare its decisions
There is a cheap technique that removes most of the invisibility problem, and it costs one extra step before the work.
Ask for the decisions before the implementation. What will you store, where, and which component owns it. What will this call, and what happens when that call fails. What are you assuming about who is allowed to do this. The answer is a short list, it takes a minute to read, and it arrives before any code exists, which is the only point where changing the plan costs nothing.
Two details make it work rather than becoming a formality. Ask for the alternatives that were rejected, because a list with no alternatives usually means the first plausible option was taken. And ask specifically what the change assumes about existing behaviour, since that is the category that produces the worst surprises: an implementation that is correct in isolation and wrong about the system it is joining.
For the mechanical parts of this, the plan-then-implement pattern is standard practice in agentic tools and Anthropic recommends it directly, separating research and planning from implementation to avoid solving the wrong problem [3]. The addition here is a leadership one: read the plan for the decisions in it, not for the steps.
Judgment is now the scarce input
There is a broader point behind all of this. When writing code was expensive, the scarce resource was people who could produce code. Now it is people who can tell a good decision from a plausible one, quickly, in a domain they understand.
DORA's 2025 report found 30 percent of nearly 5,000 respondents report little or no trust in AI-generated code, alongside 90 percent using it at work [1]. Stack Overflow's 2025 survey puts trust in accuracy lower still, with 45.7 percent distrusting AI accuracy against 32.7 percent trusting it [2]. Those numbers describe a workforce using a tool it does not fully trust, which is a reasonable position and also an argument for putting human judgment where it changes outcomes rather than spreading it across everything with little time for each.
Concentrating senior attention on the four areas above, and automating the rest, is what that looks like in practice. It is also why AI-native teams keep needing senior engineers: the work that remains is disproportionately the work that requires having seen the failure before.
There is a scheduling consequence worth planning for. If the same two people make every decision that is hard to reverse, they become a queue, and a queue on decisions is more damaging than a queue on review because it blocks work before it starts. Spread the ownership by domain, write down who decides what, and make the list visible, so an engineer with a data model question knows who to ask without escalating.
Where this connects
Decisions that stay human have to be enforced by something, or they are preferences. The enforcement is partly gates, partly the review policy in team shape and ownership, and partly the release process for the changes that carry the most risk, in progressive delivery for AI-written changes. The governance version of this question, for larger organisations with policy and audit requirements, is covered in enterprise AI coding governance. The main guide has the full picture.
Best for
- Data model changes: field names, nullability, ownership, and anything that will need a backfill to undo
- Trust boundaries: who may do what, and where that is enforced
- Contracts other teams or customers have already integrated with
- Any change whose reversal requires moving data
Avoid if
- The decision is internal to one function or module and a later change can replace it cheaply
- The choice is already constrained by an existing convention the codebase enforces
- You are adding a human step because the change feels large rather than because reversing it is expensive
Check before you decide
- Ask the agent what it will store, where, and which component owns it, before the work starts
- Check that the boundary is mechanically enforced, by a lint rule or module structure, not by reviewer attention
- Confirm a written decision record exists next to the code it constrains, with the condition that would make you revisit it
Common questions
Which decisions should never be delegated to a coding agent?
The ones that are expensive to reverse: the data model, trust boundaries, contracts other teams or customers already depend on, and anything whose undo requires a data migration. Everything else, including most implementation, can be delegated with automated checks. The test is reversal cost rather than how important the decision feels.
Why is it hard to notice when an agent has made an architectural decision?
Because it arrives as implementation rather than as a proposal. A human engineer introducing a new table or queue usually says so and asks others to agree. An agent makes the same choice inside a diff and mentions it in one line of a summary, so catching it depends on a reviewer noticing that line 340 created a second source of truth.
How do we stop an agent from reversing an architectural decision later?
Write it down in the repository, next to the code it constrains. A later session has no memory of the discussion, sees code that could be simpler, and simplifies it, which is correct behaviour given the information it has. A short record naming the decision, the alternatives, the reason and the condition to revisit it prevents that.
What belongs in an architecture decision record for an AI-native team?
Four lines: what was decided, what the alternatives were, why this one won, and what would make you revisit it. The last line matters most, because it tells a future reader whether the decision still binds or whether the reason behind it has expired. Keep the total count low or nobody reads any of them.
Why do permissions and access control need human attention specifically?
Because permission logic is easy to generate and hard to review. A plausible check in the wrong place reads exactly like a correct one, and the failure is usually silent until it is public. This is the area where a review that only confirms the code looks reasonable provides the least protection.
Does keeping decisions human bring back the slow step AI was meant to remove?
Only if too many decisions are kept for humans. Restricting human decisions to changes that are expensive to reverse usually covers a small share of the work, while the majority of implementation proceeds with automated checks. A team that needs sign-off on everything normally has a coupling problem rather than a governance problem.
How do we make architectural boundaries enforceable rather than advisory?
Turn them into failing checks. Module structure, ownership rules and lint rules that forbid an import across a layer make crossing a boundary something an automatic check detects instead of something a reviewer has to spot. A boundary that exists only in a document will be crossed by the next session that never read it.
Should an agent be allowed to add a new dependency or service on its own?
Adding a dependency is a supply chain decision and needs a gate rather than a reviewer's judgment, because models invent package names at measurable rates. A new service is an architectural decision with high reversal cost and belongs with a person. Both should be visible as their own step rather than hidden inside a feature diff.
What changes about the senior engineer role in an AI-native team?
The scarce input becomes telling a good decision from a plausible one quickly, in a domain you understand. Writing code is cheap, so the remaining work is disproportionately the part that requires having seen the failure before: data modelling, trust boundaries, and knowing which changes cannot be undone.
How does the line between human and delegated decisions change over time?
It moves with coupling. As a system becomes more interconnected, more decisions become expensive to reverse and more of them need a person, which is why a growing sign-off list is a signal to look at architecture. Reducing coupling widens the range of work that can safely run on automated checks alone.
References
- [1] Google Cloud / DORA, 2025 State of AI-assisted Software Development report: 90% of nearly 5,000 respondents use AI at work and 30% report little or no trust in the code it generates. Accessed 1 September 2026.
- [2] Stack Overflow 2025 Developer Survey, AI section: 3.1% highly trust and 29.6% somewhat trust AI accuracy, against 26.1% somewhat distrust and 19.6% highly distrust. Accessed 1 September 2026.
- [3] Anthropic, Best practices for Claude Code: “Explore first, then plan, then code”, and “Separate research and planning from implementation to avoid solving the wrong problem.” Accessed 1 September 2026.
Related reading
Why permissions are the hardest part of an AI feature
A normal feature shows one user one screen. An AI feature reads across everything it can reach and writes a summary, and a summary has no permission model.
What to do when the AI writes the wrong abstraction
A wrong abstraction does not fail a test or break a build. It makes the next twenty changes harder without anyone noticing, and by the time someone does, removing it has become a project of its own.
Monolith vs microservices for an early-stage startup
For almost every early-stage startup, one well-built monolith is the right first choice. Microservices solve problems you do not have yet, and they add cost you cannot afford to pay early.
More in Set the standard before you build
What done means when an agent writes the code
A coding agent stops when the work looks done, and looking done is easy. A definition of done for AI-written work has to be checkable without a person reading the diff: named acceptance criteria, an automated check for each one, and a stated limit on what the change can affect. This page covers what belongs in that definition, who writes it, and how to tell when yours is too weak.
How to break work into units an agent can finish
The size of the unit you hand an agent decides almost everything that follows: whether it finishes, whether the diff can be reviewed, whether a failure can be isolated, and whether a rollback is one flag or one migration. This page covers how to size work for coding agents, the two failure modes at either end, and how to split a large change without losing track of the whole.