An Operating System for AI-Native Teams
AI agents write code faster than ever, but the bottleneck moved to human decision latency and review capacity. Here is the operating system that closes it.
Click image to open full size Why is AI activity high and business impact flat?
Organizations are investing heavily in copilots and developer agents, and code is being generated faster than at any point in the history of the craft. Tech leaders keep hitting the same gap: the work is visible and the value is not measured. When generation got cheap the bottleneck moved from writing syntax to human decision latency and review capacity.
Closing that gap takes an operating system for AI-native teams, since more tooling and more meetings leave it exactly where it is. Such a system manages human intent at the level of specifications, and it keeps the team’s working rules inside the flow of work where they get read, with validated outcomes as the measure of whether it is working. Most of it is writable this week, in artifacts your repository already has.
The core shift: managing human intent, not code syntax
Team complexity used to split in two: defining what to build, and figuring out how to write and debug the code, where the how was the expensive part. Agents now absorb most of that low-level how. That leaves defining the what and validating the why as the whole job. That remaining half is exactly as hard as it always was, because the cost of producing code fell through the floor while the cost of knowing whether it is the right code did not move.
That changes what is worth inspecting. If you inspect only outputs, meaning lines generated, pull requests merged, tickets closed, AI will make your metrics look spectacular while your product rots. This is Requirements Theater with better tooling, and it drives most of the AI Theater I see in the field. The inspection that matters asks whether the system’s behavior matches the business hypothesis: a different question from whether the code was written correctly.
A composite from several engagements makes the point, with the numbers rounded and the arithmetic left visible so you can check it against your own. Two months after rolling agents out across four teams, merged pull requests per week went from roughly forty to just over a hundred and twenty. The engineering leader put that chart in front of his executives as proof the investment was working. What the chart left out was the review queue: a standing thirty-one open pull requests against an arrival rate of about seventeen a day. By Little’s Law that puts the average wait under two days.
Under two days sounds fine, and that is exactly why the chart survived three executive reviews. The problem was never the average. It was the tail. Anything needing a specific person, the one reviewer who understood the payments path or the schema owner who was on leave, sat for eight or nine days, and those were disproportionately the items that carried the actual business bet. Meanwhile lead time from customer problem to validated outcome had drifted from about three weeks to closer to five. Review wait explains maybe a third of those extra fourteen days. The rest sat in a release approval process that never got faster and in the growing gap between something being merged and anyone finding out whether it worked.
Leveled-up human accountabilities
Because agents absorb the manual coding, the human team shifts its attention to intent and architecture, the systems engineering half of the job. That shift carries one hard rule: accountability does not transfer to an agent no matter how much of the work does. Being accountable means holding three things at once. You can be asked to explain a decision and give reasons a colleague can argue with; you carry the consequences when the decision turns out badly; you have the standing to decide differently next time.
An agent clears the first of those three, arguably better than most people do, since it will produce a reasoning trace on demand and never claims to have forgotten why. It fails the other two. Nothing lands on the agent when the call goes wrong, so the explanation it generates costs it nothing to produce. Nobody can hold it to that explanation next quarter either, because it has no standing to lose and no continuity to lose it across. So the accountability for every release and every validation stays on a named person, however much of the work moves to the agents.
Three accountabilities need to be actively held, and no new titles are required to hold them. The first is owning the business outcome: defining the expensive problem with its constraints and leading indicators, then supplying the context that stops agents from hallucinating business value. The second is architecting intent, because specifications are the high-level programming language now. Engineers who write clear, atomic intent and spend review time on structural integrity get far more out of the same agents than engineers who write vague prompts and argue with the output. The third is coaching the operating model, designing how humans and agents divide the work and noticing when the team is drowning in unreviewed generated code.
The continuous execution loop
The team operates in continuous cycles of learning, with goals decomposing into specifications that agents execute against and humans verify against reality. Which cadence you run is the second question. The first is whether the loop reliably does four things, because those four break once generation gets fast and human attention becomes the constraint.
The first is bounding the risk before generating at scale, agreeing on what you are trying to learn and how wide the blast radius is before agents produce miles of code against an unexamined assumption. The second is aligning on why before swarming, so people and agents working a problem in parallel are working the same problem. The third is inspecting emerging learning often enough that drift surfaces while the correction is still a small edit. The fourth is validating against real outcome data, so that somebody checks whether the target problem actually moved before any of the work counts as finished.
A lot of AI-age process advice goes wrong right here: those four are invariants that any cadence has to preserve. Scrum’s existing events already carry all four if you run them on the right data. A Scrum companion piece working through exactly how is coming.
One flow heuristic belongs here because it decides whether that accountability is real: cap work in progress at the level of the individual human, since a team-level limit hides the case that matters. A developer holding five generated pull requests open at once is not reviewing five pull requests, they are skimming five and signing all of them. Batch sizing and queue depth get their own companion piece, where the rest of the flow picture sits.
The five layers of the ambient intelligence model
Embed the operating rules into the flow of work as an ambient layer, so the team gets sensing and coaching without anyone having to recall a process document at the moment it matters. Five layers carry it, and they sit on two different axes worth naming up front. Boundaries, purpose and preferences record what the team has decided. Sensing and triggers are how those decisions reach a human at the moment they matter. Most operating-model documents record only the first three and stop there, leaving the decisions with no route back to the person who needs them.
Boundaries define what is non-negotiable and where accountability sits. A work item is never assumed done by an agent: it conforms to the verification plan, passes automated checks, then gets reviewed by a human. One piece of that is mechanically enforceable today. An agent-authored pull request that arrives with no verification plan at all is a presence check, and a presence check is a grep in CI, so the merge stops and a named human has to look. That is the same fail-closed treatment auth changes and schema migrations get.
Whether the output actually diverges from the plan it was given is the harder half, and nothing in your toolchain does it for you. Hold that thought, because it is the gap this whole model runs into later, and it belongs to a different layer.
Purpose defines the mission and what the team optimizes for on behalf of its customer, so the team can push back on generated work that does not move it closer to the business goal. Preferences shape the division of labor, assigning each kind of work a default mode and encoding WIP limits and batch sizes, so each delegation decision gets made once deliberately and then reused.
Sensing runs in the background to catch the two failure modes AI-native teams reliably hit. Specification drift is an agent quietly diverging from the plan. Work item aging by wait reason pinpoints where human attention is the constraint, since an item aging because it waits on a named person is a different problem from one aging in a build queue. That distinction makes it the leading indicator worth watching above all others. Triggers tie that sensing to repository events so feedback arrives in context, at the moment a person can still act on it. When someone starts a third specification, a trigger asks: “WIP limit reached. What should we stop starting so we can start finishing?”
Because boundaries block and triggers coach, and because the two do very different things to a person in the middle of their work, deciding which bucket a rule belongs in is the whole design decision here. Boundaries are the floor, so they are allowed to stop a merge cold and they should. Triggers sit above the floor, where the right answer depends on context a machine does not have, so they ask a question and let a human answer it. Get that assignment wrong and the model degrades fast: a boundary you made coachable gets waved through under deadline pressure, and a preference you made blocking gets routed around inside a week.
Making it real: a machine-readable configuration
The way to keep this from staying theoretical is to encode it in the repository where the agents and the tooling can read it. Here is a framework-agnostic configuration for the five layers:
# .team/operating-model.yaml
# Runnable working agreements for an AI-native team
boundaries:
definition_of_done:
- automated_tests_passed
- lint_errors_zero
- human_review_approved
- verification_plan_present_and_signed_off
human_accountability: 'A human approves every release to staging or production.'
escalate_to_human:
- auth_or_identity_changes
- customer_data_access
- schema_migrations
block_merge_on:
- verification_plan_missing_on_agent_authored_pr
purpose:
product_goal: 'Reduce time from customer problem identified to validated solution in production.'
optimize_for: 'validated_outcomes_over_output_volume'
anti_goal: 'Volume of generated pull requests is not a success measure.'
preferences:
wip_limits:
active_specs_per_human_driver: 2
batch_sizing:
max_spec_tokens: 1500
max_pr_diff_lines: 400
labor_division:
default_mode: 'augmented'
agent_led: ['test_scaffolding', 'dependency_upgrades', 'documentation']
human_led: ['architecture_decisions', 'pricing_logic', 'security_boundaries']
sensing:
active:
- specification_drift
- work_item_aging_by_wait_reason
triggers:
wip_limit_reached:
when: 'human_driver_starts_third_spec'
action: 'prompt_with_override'
message: 'WIP limit reached (2). What should we stop starting so we can start finishing?'
aging_item:
when: 'item_active_over_24h'
action: 'notify_team'
message: 'This item is aging. Is it waiting on a human decision?'
Read that file as working agreements that happen to be executable. Expect to argue about the specific numbers before you commit them, then expect to change them after a month of running against them. What matters is that they live in a file the tooling can read.
Now the honest part, because this is where most writing about operating-model files waves its hands about the runtime. The file above splits into three tiers, and knowing which line sits in which tier is what keeps the exercise honest.
Some of it runs today with nothing but off-the-shelf configuration. CODEOWNERS decides who approves which paths. Branch protection decides what cannot merge without that approval. A CI check asserts your definition of done on every pull request. Purpose and preferences are already read by agents every session through AGENTS.md and CLAUDE.md. In that one place, this model was already true before anybody wrote it down.
Some of it needs about a day of glue code, worth naming so nobody thinks it is harder than it is. A CI job that fails an agent-authored pull request whose body has no verification-plan section is a grep, and a token count on changed spec files against max_spec_tokens is a script. A bot that counts a given author’s open spec-labelled pull requests and comments when the third one opens is a scheduled GitHub Action against the API. That last one matters, because the WIP trigger in the file is written as though human_driver_starts_third_spec were a Git event, which it is not, so somebody has to count.
And some of it has no mechanism at all today, which is the next section.
Sensing is the one layer that does not exist yet, and I want to say that plainly, because most writing on this quietly implies there is a product you can go buy. Drift detection is the hard one, the same gap flagged back at the Boundaries layer. Checking that a verification plan is present is a grep, and checking that the output honors it is a judgment nobody has automated. Work item aging that knows which items wait on a human decision is more tractable, and it is buildable from data already sitting in your Git provider and issue tracker. Some teams approximate it with a scheduled job posting a weekly report on queue depth and item age, which is coarse but honest. Treat sensing as a direction you are moving in. Nobody has this layer working properly yet, so its absence is the normal state today.
Your first move this week
| Layer | What to write down | Where it lives today | How you know it is working |
|---|---|---|---|
| Boundaries | What an agent may never do without a named human, and what done actually means | CODEOWNERS, branch protection, a CI check asserting the definition of done | An auth or schema-migration change cannot merge without the named human |
| Purpose | The customer problem this team owns and the one anti-goal you refuse to chase | The top of AGENTS.md or CLAUDE.md, read by every agent session | Someone declines generated work by pointing at the purpose statement |
| Preferences | Which work is agent-led, augmented, or human-led, plus WIP and max diff size | .team/operating-model.yaml at the repository root | Delegation arguments end in five minutes because the answer is written down |
| Sensing | The two or three signals telling you the loop is jamming, starting with aging | Nothing off the shelf; a scheduled job over your Git provider and tracker | You can name the oldest in-flight item and who it waits on, without asking |
| Triggers | The one question you want asked when a working agreement is about to be broken | A GitHub Action commenting on the pull request, or a pre-commit hook | People answer the question instead of muting the bot |
Pick the Boundaries row and do it this week. It is the least controversial row and it runs on configuration you already own. Doing it makes every other row safe to experiment with. Ignore the rest until it hurts. It will announce itself when it does: preferences arrives as the same argument recurring every sprint, sensing as a surprise somebody should have caught two weeks earlier. Keep the whole thing small enough to read in one sitting. If you want this argument taken into a specific framework, companion posts working it through for Scrum, team-level flow, and SAFe are on the way.
Frequently asked questions
Is this just another framework?
The test is whether it adds anything you have to learn. There are no new roles or events, and no artifacts beyond a file encoding decisions your team already made, so if you run Scrum you keep running Scrum and change the data you inspect. If rolling it out starts to need a training course, the file has grown too big; cut it back until it fits on one screen.
What if our agents ignore the configuration file?
Some will, some of the time, which is why the boundaries layer gets enforced outside the agent. That enforcement runs at merge time and fails closed, so it does not depend on whether any given agent read its instructions or chose to follow them. The layers an agent reads will improve your odds most of the time, but only the merge-time enforcement is guaranteed.
How is this different from a definition of done?
A definition of done is one line inside the boundaries layer, and it stays as useful as it always was. It covers completion, which is a narrow question. The other four layers cover what the team chooses to work on, who or what does the work, and whether the loop is jamming.
The point of all this
If your organization is stuck in AI Theater, with plenty of activity and not enough impact, the problem is not the models. It is the operating system around them. Shift your inspection from outputs to outcomes, then embed the rules into the flow of work so they coach at the moment of the decision. When the focus moves from the mechanics of coding to the discipline of value realization, the conditions for genuinely unreasonable agility start to exist.
Encode the rules where the work happens, and you stop needing to remember them.
Practical thinking on turning AI pilots, adoption, and portfolio work into business impact - by finding the constraint, changing the work, and proving value as you go.
Yuval Yeret helps product and tech leaders move from agile theater to evidence-informed delivery. Work with Yuval →