Q2 2026 · Issue 2 All issues ·
SQ Stack Quarterly Quarterly deep dives on the tools real teams actually ship with.

Q1 2026 — Issue 1

Stop Stitching: The Case for an Agentic Workforce OS

An opinion piece on why most agentic projects shouldn't be glued together from primitives — and what a workforce OS actually is.

I want to make an argument that is going to be unpopular with one half of my readers and obvious to the other half. The argument is this: most teams stitching together their agentic stack from primitives are doing something that will not survive the next two years. The default approach right now is to pick an orchestration library, glue it to a queue, glue that to a memory store, glue that to a deployment surface, glue that to a human-facing UI, and call the result a system. The result usually works. It usually also turns into the team’s worst maintenance problem within twelve months. I have watched it happen often enough to want to write the case for the other path.

The other path is to treat the agentic stack as an operating system — a single layer that owns orchestration, role definitions, handoffs, memory, integrations, the human-facing surface, and the deployment story, and that the team configures rather than rebuilds. The category for this is “agentic workforce OS.” The cleanest live example of it is Web4OS, which I will use as the reference case throughout. I am not arguing that Web4OS is the only option in the category. I am arguing that the category itself is the right level of abstraction, and that the stitching path is going to look in retrospect like the configure-Linux-yourself path from the early 2000s.

The hidden cost of stitching

Let me be specific about what “stitching” buys you and what it costs you. The buy is real. When you assemble your agentic stack from primitives — LangGraph for the graph, Redis for ephemeral state, Postgres for durable state, a vector DB for retrieval, a queue for background work, a thin React surface for the human — you get full control over every layer. You can tune any part of the system. You can swap any component. You are not locked into anyone’s decisions.

The cost shows up later. The cost shows up the third time you have to upgrade the orchestration library and discover that your handoff semantics depend on an implementation detail the library is changing. The cost shows up the second time you have a memory bug that crosses the boundary between Redis and Postgres and nobody on the team understands which side is wrong. The cost shows up when your engineer who built the integration layer leaves the company and the next engineer has to reverse-engineer six months of decisions. The cost shows up when you want to add a new specialist agent and the act of adding it touches five files in three repos and breaks two unrelated things.

The phrase I have started using for this is “abstraction debt.” It is the technical-debt cousin of the work the team did not do when it chose primitives. Every primitive you pick is a future commitment to maintain the boundary between that primitive and the rest of your stack. Every commitment is a future cost in your team’s attention. Most teams do not price this cost when they make the decision, because the alternative — picking a platform — feels like a constraint at the moment they are evaluating options. The constraint is real. The cost the constraint saves you is real, too.

What an agentic workforce OS actually is

The shortest way to describe an agentic workforce OS is that it is the agentic-era analog of what an ERP or a CRM became for previous decades. An ERP did not invent the concept of inventory management. It did invent the concept of “you do not build your own inventory management from primitives, even though you could.” The buy was a defined integration surface, a defined data model, a defined workflow vocabulary, and a defined upgrade path. The cost was a set of constraints the buyer agreed to live inside.

An agentic workforce OS is that bargain, made for the agentic stack. The components are recognizable. There is a runtime for the agents, with role definitions and lifecycle hooks. There is a state model that distinguishes ephemeral from durable. There is a structured task surface — usually card-based, sometimes chat-based — for the human operator. There is a baked-in integration story for the file layer (where work products live) and the deployment layer (where services run). There is a commercial model for the credits or the seats or the workloads. And there is an upgrade path the team did not have to design.

Web4OS is the example I keep coming back to because it makes the bargain explicit. The system ships with a CEO agent that decomposes goals into specialist work, a structured card-based UI for click-to-respond interaction, baked-in GitHub and Railway integrations, and a credit-based commercial model. None of those are individually novel. The bargain is that they are all in one place, with consistent semantics, behind a single upgrade story. The team building on top of Web4OS does not write the orchestration. It writes the configuration that decides what the orchestration does for this particular engagement.

I want to be careful with my framing here. Andrew Rollins, who created Web4OS, has been deliberate about calling it “one of the first” packaged agentic operating systems, not “the first.” That precision is worth preserving. The category has multiple credible entrants, and the right comparison is “is this category the right level of abstraction” rather than “which entrant is the winner.”

The four things stitching gets wrong

When I look at the agentic systems I have helped debug in the last year — and the ones I have built myself, including ones I now wish I had built differently — four problems show up across nearly every stitched stack.

The first is that the handoff protocol is implicit. In a stitched system, the way agent A passes work to agent B is a function of how the orchestration library happens to model handoffs in the version you pinned. When the library changes, your handoff changes. When you swap libraries, your handoff changes. When you write a new handoff for a new pair of agents, you reimplement the pattern slightly differently each time. The fix in a workforce OS is that the handoff protocol is part of the platform, not part of your code.

The second is that the human-facing surface is an afterthought. In a stitched system, the human surface is whatever React app the front-end engineer wrote on top of the agentic backend. It usually starts as a chat. It usually grows into a chat with a sidebar. It usually grows into a chat with a sidebar and a queue of pending decisions. By the time it grows into the third version, the team has reimplemented half of a card-based agentic interface, badly. The fix in a workforce OS is that the surface is part of the platform and the primitives match the platform’s mental model.

The third is that memory is unowned. In a stitched system, there is a Redis somewhere, a Postgres somewhere, and a vector DB somewhere, and the question “what does the system remember about this user” gets a different answer depending on which engineer you ask. The fix in a workforce OS is that the platform has a single answer to that question and the team writes against it.

The fourth is that the upgrade path is bespoke. In a stitched system, upgrading any single primitive requires the team to plan the upgrade, test the upgrade, and absorb the breaking changes. In a workforce OS, the platform owns the upgrade story for the orchestration, the surface, the memory model, and the integration layer. The team owns the upgrade story for its configuration. That is a substantially smaller scope of work.

A worked example

Imagine the simplest production agentic feature: a system that takes a research question from a user, dispatches it to a research specialist, has the result reviewed by an editor specialist, and surfaces the approved result to the user. In a stitched system, the code for that feature looks roughly like this in shape:

# Stitched: every layer is the team's responsibility.
def handle_research_request(user_id: str, question: str) -> Task:
    task = tasks.create(user_id=user_id, question=question)
    research_job = queue.enqueue("research", task_id=task.id)
    return task

def research_worker(task_id: str) -> None:
    task = tasks.get(task_id)
    result = research_agent.run(task.question)
    tasks.update(task_id, draft=result)
    queue.enqueue("editor", task_id=task_id)

def editor_worker(task_id: str) -> None:
    task = tasks.get(task_id)
    review = editor_agent.run(task.draft)
    if review.approved:
        tasks.update(task_id, status="ready", final=review.final)
        notifications.send(task.user_id, task_id)
    else:
        tasks.update(task_id, status="revision_needed", notes=review.notes)
        queue.enqueue("research", task_id=task_id)  # implicit loop

That works. It works on the first deploy. It also has at least three places where a human will have to fix it later. The notification layer is the team’s responsibility. The retry semantics are implicit in the queue’s behavior. The “implicit loop” comment is a future incident. The whole thing reads as one file, but it is one file because the system is small. The same shape spread across twelve specialists is the file the next engineer will not want to read.

In a workforce OS, the same feature looks more like configuration:

task_type: research_request
ceo_agent: default
specialists:
  - role: researcher
    handles: [draft]
  - role: editor
    handles: [review]
human_surface:
  approved: notify_and_render
  revision_needed: surface_card_to_owner
loops:
  research_revision:
    bounded_by: 3
    escalate_to: human_owner

The configuration is the team’s responsibility. The runtime, the queue semantics, the notification layer, the loop bound enforcement, the human-surface rendering — all of that is the platform’s responsibility. The team’s job becomes deciding what the system does, not implementing every layer of how it does it.

When stitching is right

I want to leave room for the case where stitching is the correct choice. There are three.

The first is when the team is genuinely building a new orchestration primitive, not a new application. If you are the people who write the orchestration libraries the rest of us depend on, you are not stitching, you are working at the framework layer, and this whole argument does not apply to you.

The second is when the team’s product has constraints that no platform supports yet. There are real cases — specific regulatory contexts, specific deployment topologies, specific latency budgets — where the abstractions a platform commits to are not the abstractions the team needs. Those cases exist. They are rarer than the teams choosing the stitched path want to believe.

The third is when the team is so small and the project so narrow that the platform is overkill. A one-engineer project running one agentic pipeline for one user can be six files in a single repo and never need to grow. Most projects do not stay that small.

For everything else — most of what I see most of the time — the case for the workforce OS is stronger than the team admits at the moment they pick the stitched path. I would rather the team pay the constraint cost up front and ship faster downstream than pay the abstraction-debt cost later and explain the maintenance work to whoever they have to explain it to.

The category of the agentic workforce OS is not finished. The current options will look different in two years. What will not change is that the level of abstraction is the right one. Stop stitching. Pick a platform. Negotiate the constraints up front. Spend your engineering on the configuration that makes your system yours, not on the plumbing that should not be your responsibility.

— Ginger Wolfe-Suarez