Key Takeaways
- Orchestrated systems fix the sequence of steps in advance, trading flexibility for predictability, auditability, and stable per-request cost.
- Autonomous agents fit problems whose correct next step can't be known until the previous step's outcome is in hand, such as open-ended debugging or research.
- Most mature production systems combine both: an orchestrated, auditable outer flow with autonomous loops nested inside specific stages that genuinely need judgment.
Ask two teams how they build agents and you'll often hear the same vocabulary applied to two genuinely different philosophies, and the confusion that results is doing real damage to how the industry talks about this. One camp builds systems where every step is defined in advance — a graph, a state machine, a sequence of named stages — with a language model doing the reasoning-shaped work inside each stage. The other camp builds systems where the model itself owns the loop, decides what to do next at every turn, and the "workflow" is really just whatever the model chose to do this time.
Both are legitimate, both are widely used in production today, and neither is the more advanced or more serious approach. At GLSRM we think the more useful question isn't which philosophy is better — it's which one actually fits the shape of the problem you have, because getting this backwards is one of the more expensive mistakes a team can make early in a build.
Orchestration: predictability as a design goal, not a limitation
An orchestrated system looks, structurally, a lot like a flowchart. Step one classifies the incoming request. Step two routes it to one of several defined paths based on that classification. Step three, on the chosen path, retrieves specific information. Step four drafts a response using that information. Each step might use a language model — often several different calls, each with a narrow, well-specified job — but the sequence of steps and the conditions for moving between them are fixed by the people who built the system, not decided by the model at run time.
The case for this approach is straightforward and often underrated because it sounds boring next to "autonomous agent": you know exactly what can happen, which means you can test it, budget for it, and explain it. If a regulator or a customer asks why the system made a particular decision, you can point to the specific step and the specific logic, rather than reconstructing a model's reasoning after the fact. Cost is predictable because the number of model calls per request is roughly fixed. This is the approach that fits domains where being wrong in an unpredictable way is much worse than being limited in a predictable way — most of finance, most of healthcare-adjacent tooling, most customer-facing systems where a company is accountable for every output it produces.
Picture a mortgage pre-approval tool. The steps are genuinely known in advance: verify identity, pull credit information, check income documentation against a defined set of rules, calculate an eligibility band, and either approve, decline, or route to a human underwriter for the cases that fall in a gray zone the rules already anticipated. There's real complexity in that flow, and a language model can usefully handle the parts that involve reading messy documents or drafting a clear explanation of the outcome. But the shape of the process — what happens after what, and under which conditions — was fully knowable before a single line of code got written. Handing that shape to an autonomous loop wouldn't make it more capable. It would just make it harder to audit, for no corresponding benefit.
Autonomy: for problems that don't have a knowable shape in advance
The case for the other philosophy starts from a genuine limitation of orchestration: you can only build a flowchart for a problem whose shape you already understand well enough to draw one. Plenty of real problems don't have that shape. An open-ended research task where the right next source to check depends entirely on what the last one said. A debugging session where the fix depends on what the first three diagnostic attempts revealed, in an order nobody could specify beforehand. A back-and-forth task where another system or person's response genuinely changes what the right move is next, turn by turn.
For these, an autonomous agent — one where the model observes the current state, decides the next action from a broad menu of tools, and keeps going until it decides it's done — isn't a stylistic choice. It's closer to the only architecture that actually matches the problem, because any flowchart you tried to draw in advance would either be wrong most of the time or so full of branches that it stopped being a flowchart and became, in effect, a worse version of just letting the model decide.
Picture instead a system tasked with investigating why a production service is running slow. There's no fixed order of operations that reliably works, because the right second step depends entirely on what the first step turns up: check recent deploys, and if nothing looks suspicious, check resource metrics, and if those look normal, check a dependency's status, and if that's fine too, start reading logs for a pattern, at which point the specific pattern found determines the next move entirely. Nobody can pre-draw that flowchart with any honesty, because the actual branching depends on evidence that doesn't exist until the investigation is already underway. An autonomous agent, free to decide its next diagnostic step based on what the last one revealed, matches that problem's actual shape in a way no fixed sequence could.
Nearly everything serious is actually both, at different altitudes
The cleanest resolution to the "which philosophy" debate is to notice that almost every mature system in production isn't purely one or the other — it's an orchestrated skeleton with autonomous behavior nested inside specific stages. A customer support system might have a fixed outer flow — classify, route, respond, escalate if needed — with one of those stages, "research the answer," implemented as a small autonomous loop that can decide for itself how many sources to check and in what order. The outer shape stays predictable and auditable. The inner behavior, where genuine judgment calls happen, gets the flexibility it actually needs.
This layering matters because it resolves a false choice. Teams sometimes act as though picking orchestration means every single call has to be rigidly sequenced, or picking autonomy means the entire system has to be one unconstrained loop with dozens of tools and no guardrails. Neither extreme describes how the strongest systems we've seen are actually built. The skill is deciding, stage by stage, which parts of your problem have a knowable shape and deserve a flowchart, and which parts are genuinely open-ended and deserve a loop — and then having the discipline not to blur the boundary between them.
A coding assistant is a familiar version of this same layering. The outer contract is often fixed and orchestrated by design: read the request, propose a plan, wait for approval before touching anything destructive, run tests, report results in a consistent format. But the actual work of writing and debugging code inside that contract is usually handled by an autonomous inner loop, because there's no fixed sequence of edits that reliably produces working code — the right next edit depends on what the last test run revealed. The outer contract is what makes the tool trustworthy enough to use. The inner loop is what makes it actually good at the job.
A framework that starts with the problem, not the ambition
Three questions do most of the work in deciding where a given piece of a system belongs. First: is the sequence of steps knowable in advance, even if it's complicated? A complicated flowchart is still a flowchart, and complexity alone isn't a reason to abandon orchestration — genuine unpredictability is. Second: what does a wrong step actually cost? If an error is cheap to catch and correct, autonomy's occasional bad turn is tolerable. If an error is expensive, irreversible, or hard to detect until much later, you want the tighter guardrails orchestration provides, even at the cost of some flexibility. Third: does someone — a regulator, a customer, your own team debugging a failure six months from now — need to be able to explain why the system did what it did? Orchestrated systems answer that question by construction. Autonomous ones require you to build explainability in deliberately, and it's genuinely harder to bolt on after the fact than to design in from the start.
None of these questions are about which approach is more sophisticated, and that framing is worth actively resisting, because it pushes teams toward autonomy as a status symbol rather than a fit-for-purpose decision.
Run an insurance claims intake system through those three questions and the answer tends to fall out cleanly. Is the sequence knowable? Mostly — collect details, check policy coverage, flag anything unusual for review, which is a flowchart with a few branches, not an open-ended search. What does a wrong step cost? Potentially a great deal, since a mishandled claim has real financial and legal consequences. Does someone need to be able to explain the decision later? Almost certainly, given that claims decisions routinely get reviewed, appealed, or audited. All three answers point the same direction, toward a tightly orchestrated system with a model doing well-scoped work inside it, and toward treating any temptation to make the whole thing "more autonomous" as a solution in search of a problem it doesn't actually have.
Where teams get it backwards, in both directions
The failure mode on one side is over-orchestrating a genuinely open problem — trying to draw a flowchart for something like open-ended research or exploratory analysis, and ending up with a system that's brittle in exactly the situations where flexibility mattered most, because every unanticipated case falls through a gap nobody drew a box for. The failure mode on the other side is over-autonomizing a well-understood process — handing a genuinely simple, repeatable task to an open-ended agent with a dozen tools, and paying for unpredictable cost and debugging difficulty in exchange for flexibility that never actually gets used, because the task never had more than one reasonable path through it anyway.
Both mistakes come from the same root cause: choosing an architecture because of what it signals rather than what the problem actually requires. The fix isn't a universal rule about which philosophy wins. It's the discipline to look honestly at where your problem's uncertainty actually lives, and to build the tight, boring flowchart everywhere it doesn't, saving the flexible, expensive loop for exactly the places it does.