A periodical about version control, git, and the future of agentic version control.
FeaturesLong read

How Composable Infrastructure Actually Gets Assembled at the Component Level

Control plane reconciliation and GitOps turn modular components into genuinely composable systems.

· 10 min read
Cover illustration for “How Composable Infrastructure Actually Gets Assembled at the Component Level”
Features · October 5, 2026 · 10 min read · 2,183 words

Most teams that say they have adopted composable infrastructure have actually purchased a modular-looking monolith.

The marketing pitch, best-of-breed components that mix and match as needs change, is accurate as a philosophy. It says nothing about the mechanism that has to exist for that mixing and matching to actually happen without an outage. Mirantis's 2026 guide draws the line precisely: unlike monolithic or tightly coupled architectures, composable systems let you swap, upgrade, or scale individual parts without rewriting the whole platform. The weight of that sentence rests on "without rewriting," because any system can be modified given enough engineering hours. Composability is the claim that modification doesn't require a rewrite, and that claim stands or falls on a specific piece of engineering, not on how the components were marketed.

The real distinction is whether the control plane governing those components belongs to the team or to the vendor. Under the pressure of an actual swap, an upgrade, a failover, it behaves exactly like the monolith it was supposed to replace, because nothing in the architecture ever guaranteed that substitution would converge cleanly.

The four-part assembly logic that makes composition work

Composable infrastructure runs on a specific operating grammar, and understanding it at the component level is what separates genuine composition from the appearance of it. Four elements have to be present, each one depending on the one before it: a catalog of building blocks, a declaration of intent, a policy engine that evaluates that intent, and automation that carries the decision through to a running system.

The catalog comes first. Compute, storage, network, security, and data services exist as discrete, independently addressable components, each with an interface a consumer can call without needing to understand what sits behind it. Without this layer, there is no "composing," only configuring, because nothing in the system is actually separable from anything else.

Declaration of intent comes next. Workloads state what they need rather than how to wire it, which is the point at which desired state replaces hand-written, imperative scripts. A team no longer writes the sequence of commands that produces a database with the right replication factor. It declares that the database should have that replication factor and leaves the sequencing to the layer below.

The policy engine evaluates that declared intent against guardrails before anything gets provisioned. Nothing reaches production until it clears this check.

Automation closes the loop. It provisions, enforces, observes, and retires resources on an ongoing basis. Without this fourth element, the first three are documentation. A catalog without a way to act on it is a wiki page; a declared intent without enforcement is a comment in a design doc; a policy without something checking it is a PDF. The cycle these four elements produce, assemble, run, disassemble, recycle, means components return to the pool once the work is done rather than piling up as permanent, unaccounted-for fixtures.

A fair objection follows from all of this: a well-governed infrastructure-as-code setup might seem to already do this. The distinction is that infrastructure-as-code describes resources. Composable infrastructure abstracts those resources into a catalog with defined interfaces, so the person consuming a database or a network path never has to touch the wiring underneath it. Composable infrastructure requires it by definition.

The control plane as rewireable-system builder

Once components sit in a catalog and a team declares intent against them, something has to keep the whole arrangement honest over time. That job belongs to the control plane, and its core function is to continuously close the gap between the state a team has declared and the state actually running. That reconciliation loop is what separates a system that is merely modular from one that is genuinely reversible.

Without continuous reconciliation, composable infrastructure drifts quietly. Declared intent and live state can diverge without anyone noticing, so the promise of swapping a component without rebuilding the platform breaks the first time a team actually tries it. Each of those is a distinct discipline, and a control plane that only does some of them is a partial one.

Crossplane illustrates what a fully realized control plane looks like in practice. Crossplane is a control plane framework for platform engineering, built as an extension on top of Kubernetes, and it lets teams design the APIs and abstractions their users interact with directly, independent of which cloud or vendor sits underneath. Any substitution of one component for another has to produce a system that settles into a single, coherent state. It cannot end up in a split-brain configuration, where part of the system believes the old component is still live while another part has already moved on. Without that guarantee, swapping a component becomes a migration project, with all the risk and calendar time that phrase implies.

GitOps as the durable state layer for auditable, reversible infrastructure

GitOps is the mechanism that gives the control plane's reconciliation loop a permanent, inspectable record. All desired state lives in Git, and an automated agent continuously reconciles the live environment against it, so every decision about how the system is composed becomes a versioned, reviewable, and reversible event rather than something that happened once and left no trace.

The loop itself is straightforward to describe and difficult to fake: desired state is in Git, an automated agent reads it, compares it against what is actually running, and provisions or terminates resources until the gap closes. This is what makes substituting one component for another safe. When a team changes the declaration in Git, the reconciliation agent detects the delta between what's declared and what's deployed, and the live environment converges on its own. The old component gets retired and the new one gets wired in without anyone running a manual migration script at 2 a.m.

GitOps does not, by itself, guarantee that the declared state is good. It guarantees that the live system matches whatever has been declared, which is a different claim. A team can commit a Git change that violates every security policy the organization holds, and GitOps will faithfully reconcile the live environment to match that violation. This is why the policy engine has to sit upstream of the reconciliation loop rather than downstream of it: Open Policy Agent or its equivalent needs to evaluate the proposed state before it ever reaches Git as an accepted declaration, before the reconciliation agent has already acted on it. The combination, declarative intent in Git, policy evaluation at the point of admission, and a reconciliation loop that closes the gap continuously, makes the whole assembly model self-healing and self-documenting.

The same logic extends naturally to the agent layer itself. If you version AI prompts and model weights alongside application code, as first-class citizens, you prevent model drift and keep agent behavior consistent over time. It is the same desired-state discipline GitOps applies to infrastructure, applied instead to the artifacts that drive an autonomous coding agent. That extension is the bridge into a much larger question: what happens to a composable stack once the workloads running through it are agents operating at a different speed and scale than humans typing code.

What agentic software development demands from a composable stack

Agentic software development does not just add more volume to workflows that already exist. It changes the performance contract the composable stack has to meet, because agents operate at a speed and concurrency that expose every coupling point the stack was quietly carrying.

Across practitioner sources, the hybrid workflow that dominates now runs in four stages. Work gets planned locally, broken down into file-level tasks. Agents then execute autonomously, editing files, running tests, and self-correcting until the suite goes green. CI then verifies the result, using the same linters, tests, and security scans that human-authored code goes through. Finally, a pull request serves as the checkpoint, where a human stays on-the-loop at review and merge.

Each of those four stages touches a different infrastructure component: the IDE environment, the sandbox execution layer, the CI fleet, the merge queue, and version control itself. Platform Engineering 2.0, as framed by Pankaj Gupta and Sam Barlien, identifies composable architecture as one of five pillars a platform needs to handle AI workloads and autonomous agents, noting that agents are on track to outnumber every human user on these platforms, which creates scale challenges platforms need to address now. Agents also change how code storage gets used: cloud-native agents hit version control at a rate and concurrency profile that human-first tooling was never built around, with branching frequency and sync requirements that look structurally different from a single developer's commit history.

The requirement this creates is specific. If a team has tightly coupled its CI fleet, merge queue, and code storage into a single vendor's pipeline, it cannot tune or swap any one of those components without touching all of them. That is precisely the failure mode the four-part assembly logic described earlier was built to prevent, and it occurs first, and most visibly, in the merge queue.

The merge queue as the failure point when agent throughput meets a coupled pipeline

Coding agents made writing code the cheapest part of shipping software. They did not make landing that code any cheaper, and in a serial, tightly coupled merge queue, the arrival rate agents produce can overwhelm a service rate that was sized for a much slower, human pace of work.

The underlying logic is a queuing problem. Wait times under this pressure do not grow in a straight line. They grow asymptotically, because queuing theory holds that as arrival rate approaches service rate, latency stops scaling gently and starts scaling explosively.

Flakiness cascades make the problem worse. When a batch fails inside a merge queue, the queue has to bisect the batch to find which change caused the failure, and that bisection costs multiple full CI runs on its own. If one test goes red, it invalidates the speculative state every pull request behind it in the queue was tested against, so the whole queue has to restart from the point of failure.

The fix is not necessarily more compute. RunPod's engineering team cut merge-queue CI time to a median of 4.5 minutes, not by throwing more hardware at the problem, but by giving each test worker its own isolated identity and splitting their five largest test files into 22 self-contained files. Atlassian's production data tells a parallel story at a different scale: with 800 or more developers and 300 or more merges a day, CI failures caused by semantic merge issues dropped to nearly zero after the team put dedicated merge-queue management in place, and internal incidents from semantic merge conflicts fell from 3 to 5 per week down to rare edge cases.

Research on queue ordering points the same direction. The queue's internal ordering logic is itself a tunable, replaceable component, not a fixed property of whatever CI platform a team happens to use. That is the composability lesson the merge queue makes concrete: a queue that an agent can operate directly, handling conflict resolution, CI failure triage, and ordering decisions on its own, is a discrete component that can be swapped out and improved independently. A merge queue baked permanently into a single monolithic CI/CD platform is not, and a team stuck with the latter will feel every one of these bottlenecks with no lever to pull against any single one of them.

Agent transcript analysis as a feedback component in the composable stack

The merge queue is not the only place where agent-scale throughput exposes a composable stack's hidden assumptions. The agent layer itself needs a feedback component: transcript analysis, the discipline of examining the durable record of what happened during an agent's session.

An agent transcript captures user input, model response, tool call, tool result, file change, error, retry, approval, and checkpoint, in sequence, as a session unfolds. That last category carries weight: a tool call whose result the agent never acts on is dead weight. It adds noise to the agent's context window and degrades performance on every subsequent turn, without ever showing up as an obvious failure anyone would notice from the outside.

You can see what disciplined transcript analysis looks like in the VS Code team's own practice. Models get benchmarked offline before they ship, and measurement continues after they go live, through A/B tests, aggregate usage signals, and weekly reporting. A team can treat agent performance as something observable and tunable in the stack, rather than a fixed quality baked permanently into whichever model happens to be running underneath.

As a composable component, transcript analysis sits apart from the agent runtime itself. It operates on the session log after the fact, not inside the live inference loop, so a team can swap it, improve it, or point it at an entirely different agent without touching anything else in the stack. That separability is the same property that made the catalog, the policy engine, and the merge queue genuinely composable earlier in this argument. Infrastructure, CI, and the agent layer all answer to the same discipline, once a team actually builds a control plane that can enforce it.

More in Features