sgnk.ai Craft. Harness. Deploy.
sagnik → sgnk · ai
sgnk Writes · 2026

The Harness.

The paper Multi-Agent Harnessing Architecture and Orchestration Patterns in Specialized Autonomous Systems

Pretty much everyone has a multi-agent system now. But after building a few of these myself, I have slowly come to think the part that actually matters is the harness around the agents, and not the agents themselves. This is the easy-reading version of why — the full, heavy-detail thing is in the paper.

Author Sagnik Mitra · sgnk
Published 2026
Reading time ~13 min
Status Original research
↓ Download the full paper (PDF) ⌘ Cite this work → Start reading

What's inside

  1. More agents do not make an architecture
  2. A few definitions first
  3. The five planes (a restaurant)
  4. Contracts, not personality prompts
  5. Orchestration patterns
  6. The harness layer
  7. Verification
  8. State, memory and failure
  9. The autonomy maturity ladder
  10. Where this pays off: agentic coding
  11. A few rules I try to follow
  12. So, in the end
  13. References
  14. How to cite

§ 01More agents do not make an architecture.

You will say that why another write-up on multi-agent systems in 2026, when pretty much everyone has one now. And you would be right, to be honest. A planner agent, a researcher agent, a coder agent, a reviewer agent, and an executor agent that quietly does most of the actual work while the others keep busy having meetings about it. Put them in a loop and it does look pretty much like a system.

But I have built a few of these now, and I have slowly landed on a slightly awkward conclusion — most of them are not really systems at all. They are a bunch of language models taking turns, which is about as much an architecture as five people in a group chat are a company.

And here is the part nobody really likes to hear. The agents are the easy bit, honestly. They are replaceable; you can swap one model for another over a coffee. The hard bit, the one that decides whether the whole thing survives a real Tuesday in production, is the harness around them — the unglamorous layer that decides who is allowed to do what, who owns the truth, and what happens when something breaks. And something always breaks; as of now there is no model clever enough to change that.

Think of it like a climbing harness (the name is not an accident :) ). It does not make you a better climber. It just makes sure that one bad move is not the end of the story. That is pretty much the whole idea, and the rest of this is me trying to make it concrete. NIST treats AI risk as a lifecycle thing — design, development, use, evaluation — and not a "which model did you pick" thing [1], and the moment your agents start acting over time and across tools, you feel exactly why.

The one idea to hold on to Agents can be autonomous inside their own lane, but the system as a whole must never be uncontrolled. Pretty much everything below is just me trying to turn that one sentence into something you can actually deploy.

§ 02A few definitions first.

Quick vocabulary, so we mean the same things when I use these words.

An Agent is a bounded worker that can look at some context, think about a task, produce something, and sometimes use a tool. The word doing the heavy lifting there is bounded.

The Harness is everything wrapped around the agent — permissions, budgets, schemas, memory, checks, logging, recovery. Unglamorous, and also the part that does most of the real work; a bit like plumbing, which you only really think about on the day it fails.

Orchestration is how you split a goal into pieces, hand them out, and keep track of the whole thing without it quietly turning into chaos.

Now, notice that none of this cares how clever the model is, and that is pretty much the point. You get good behaviour out of a probabilistic thing by surrounding it with rules that are not probabilistic.

§ 03The five planes (or: a restaurant).

A serious agent system keeps five planes apart. A shaky one stuffs all five into one giant prompt and then looks genuinely surprised when nobody can tell what went wrong. If it helps, picture a restaurant kitchen:

Control Plane
Data Plane
State Plane
Execution Plane
Assurance Plane
Figure 1. The five planes of agentic autonomy.
How to read itTop-down, by authority. The Control plane sits on top because it owns the decisions — what gets delegated, cancelled, escalated or approved. Everything beneath reports up to it: the Data and State planes move the information and hold the truth, the Execution plane does the actual work, and the Assurance plane (the dark one) sits across all of them as the part that is allowed to say no. Most broken systems quietly mash these five into one prompt, which is pretty much why nobody can tell which plane failed.

Put all five inside one supervisor's prompt and it is not really five planes — it is one very stressed chef doing everyone's job at once. And that is usually the table where dinner goes wrong.

→ the full reference architecture (Figure 1 in the paper)

§ 04Agents need contracts, not personality prompts.

Agents should not be defined by a personality, to be honest. "You are a brilliant, meticulous senior engineer who deeply cares about quality" is a lovely sentence that constrains pretty much nothing — it is the prompt version of hiring someone by telling them to "just be great" and hoping for the best. A contract works far better: an actual job description that says what the agent may touch and, more importantly, what it may not.

agent:
  id: verifier.payment_policy.v1
  role: independent_verifier
  allowed_tools:    [policy_lookup, transaction_limit_checker]
  forbidden_tools:  [payment_execute, database_write]
  output_schema:
    decision: approve | reject | repair | escalate
    risk_score: number
    human_approval_required: boolean
Listing 1. An agent contract — allowed tools, forbidden tools, and a schema-d output.

Allowed tools, forbidden tools, input and output schemas, budget and retry limits, escalation rules. The narrower the boundary, the easier the 2 a.m. debugging. A verifier that physically cannot call payment_execute is not going to pay anyone by accident — and honestly, you would be surprised how reassuring "physically cannot" feels at 2 a.m.

§ 05Orchestration patterns, and when to use them.

No single pattern wins everything. Real systems mix a few, depending on the risk, the latency, and how much it stings when something fails.

To stop "cheap" from quietly winning the auction, I score the candidates with a weighted thing rather than a single number — capability and confidence pull up, cost, latency and risk pull down:

Score = 0.30·C + 0.20·Q − 0.20·K − 0.15·L − 0.15·R

C capability, Q confidence, K cost, L latency, R risk.

What you needPattern that fits
Mission controlHierarchical supervisor
Dynamic allocationAuction / market
Shared reasoningBlackboard
Tool propagationEvent-driven mesh
Safety approvalVerifier + human gate
MemoryCanonical state + event log
Table 1. Choosing the pattern by the job it has to do.
→ every pattern, with diagrams and schemas (paper, §6)

§ 06The harness layer, in a bit more detail.

The harness is the piece that makes a probabilistic agent behave inside boundaries that are not. A reasonably complete one carries identity and access control, tool whitelists, data egress controls, output validation, risk scoring, budget ceilings, approval gates, sandboxed execution, rollback and an immutable audit log. LangGraph's docs put durable execution, persistence, human-in-the-loop and runtime visibility right at the centre for pretty much the same reasons [3].

In plain terms, the runtime gate is a bouncer with a checklist:

Incoming Goal / Action
Schema Check
Permission Check
Risk + Budget
Execute (low)
Verify (med)
Human Gate (high)
Commit / Block / Repair
Figure 2. The runtime harness gate. Low risk walks straight in; high risk waits for a human.
How to read itTop to bottom. Every action an agent wants to take walks in at the top, and before it is allowed to touch anything it clears three quick checks — does it match the schema, does this agent actually have permission, and is it within budget and risk. Then the gate routes it by how risky it is: low-risk just runs, medium-risk goes through a verifier first, and anything high-risk waits for a human. Whatever path it takes, the result is committed, blocked, or sent back for repair — and the whole thing is written down.

None of it is exciting, honestly, and that is exactly what you want sitting between a probabilistic agent and your production database. And if you want to know what this looks like in actual tools rather than boxes, here is the boring, dependable stack — nothing exotic, on purpose:

LayerWhat people actually use
OrchestrationLangGraph, Temporal, a custom DAG runtime
StatePostgres, Redis, an event store
Memorypgvector, Qdrant, an object store
MessagingKafka, NATS, Redis streams
PolicyOPA, Cedar, a custom policy service
ObservabilityOpenTelemetry, Prometheus, Grafana, Jaeger
Execution sandboxDocker, Firecracker, gVisor
Human gateA GitHub PR, a Slack approval, an internal console
Table 2. A practical stack for a harnessed system — nothing exotic, on purpose.
→ the harness deep-dive and full stack (paper, §8 & §15)

§ 07Verification, and why the executor cannot check itself.

This is the step everyone skips and then quietly regrets. Verification has to be independent and weighted by risk — because asking the agent that did the work to confirm the work is a bit like asking a student to grade their own exam. The results are wonderful, and honestly not trustworthy at all.

ActionWhat must verify it
Read-only retrievalProvenance + schema
Database writeSchema + permission + state version
Code executionSandbox + tests + static analysis
Payment or tradePolicy + risk + human approval
Customer messageFactuality + tone + compliance
Production deployCI + security + rollback plan
Table 3. Risk-weighted verification matrix — match the checking to the size of the mistake.

A read costs you a schema check. A payment costs you a human in the loop. That is pretty much the whole trick: the more a mistake would hurt, the more it has to survive before it counts.

§ 08State, memory, and planning for failure.

Multi-agent systems wobble the moment "state" gets fuzzy. It helps to keep three layers — a local working memory, a shared mission workspace, and one canonical state that holds the truth. And agents do not get to edit the truth directly. They propose a change, and the harness verifies it and then commits it — a bit like how you cannot just walk into the bank and rewrite your own balance; you submit a transaction and let the system decide. (Agents opening pull requests against reality, if you like.)

Also, please design the sad path before throwing a party for the happy one.

FailureRecovery
Hallucinated outputVerifier rejects, then repair or reassign
Tool timeoutRetry with backoff, then a fallback tool
Infinite loopA retry-budget kill switch
Prompt injectionIsolate the content, block the tool call
Compromised agentRevoke its identity and its tools
Table 4. Common failure modes and how to climb out of them.
Failure Detected
Classify Type
Reassign / Retry / Safe-Stop
Resume from Checkpoint
Verify Recovered State
Figure 3. The recovery path. Nothing is allowed to resume until the recovered state has been verified.
How to read itThe unhappy path, left to right. When something goes wrong, the system first works out what kind of failure it is — because a hallucination, a tool timeout and a compromised agent all need very different responses. Depending on the type it reassigns the work, retries with a fallback, or safely stops; then it resumes from the last good checkpoint. The important box is the last one: nothing is trusted again until the recovered state is verified, the same way nothing was trusted the first time around.

Every mission, task, tool call and decision carries a trace id. Once the agents start acting asynchronously, "what just happened" turns into a proper distributed-systems question, and a trace record is pretty much the only honest answer to it:

{
  "trace_id": "trace_abc",
  "mission_id": "mission_001",
  "agent_id": "planner.v2",
  "tool_name": "database.write",
  "policy_bundle": "policy.finance.v3",
  "risk_score": 0.72,
  "decision": "request_human_approval",
  "latency_ms": 1200,
  "retry_count": 1
}
Listing 2. A minimum trace record — the receipt for every decision the system made.
→ the state-transition schema and memory diagram (paper, §10–11)

§ 09The autonomy maturity ladder.

Most teams will tell you they are running L4. So will most demos, to be honest. The honest difference between L2 and L4 was never the number of agents — it is governance, verification, state, observability and recovery, which is to say, all the parts that do not demo well.

LevelWhat it actually means
L0Human uses tools manually
L1An assistant suggests actions
L2An agent uses tools under human control
L3Multiple agents coordinate tasks
L4Harnessed autonomy, with verification and state
L5Adaptive governed autonomy, with self-repair
Table 5. Autonomy maturity levels.

There is no shame in sitting at L2, honestly. The shame is in putting "L4" on the slide.

§ 10Where this pays off: agentic coding.

This is where the whole thing starts paying rent. The point of agentic coding is not faster code — it is faster product, without quietly trading away quality, security or trust along the way. A real product is auth, tenant isolation, billing, observability, audit logs, rollback and cost control. The screens are the easy 20%; the other 80% is the part that pages you on a Saturday.

So you give each concern its own agent with its own contract — Product, UX, Architecture, Backend, Frontend, QA, Security, DevOps — and a Verifier that refuses to ship if tests, tenant isolation or audit logging are missing. Think of it less as one genius doing everything and more as a small, slightly bureaucratic factory: every station has one job, and someone signs off before the next station starts.

Market / User Problem
Product + UX Agents
Architecture Agent
Backend + Frontend
QA + Security
Verifier + Release Gate
Telemetry + Feedback
Figure 4. An agentic product loop. It does not end at the code — it ends at the telemetry that tells you whether the product actually worked.
How to read itLeft to right, and notice it loops back. A market or user problem comes in, the product and design agents shape it, architecture lays the foundation, backend and frontend build it, QA and security try to break it, and the verifier holds the release gate. Then telemetry feeds back to the start — because the loop does not end at shipping the code, it ends at finding out whether the thing actually worked.

Underneath, it runs as a mission-to-commit loop: intake, then a policy check, then a task graph, then specialist work, then independent verification, then commit, then a trace. The important bit is that state only gets written after something other than the author has checked it.

Mission Intake
Policy Check
Task Graph
Specialist Work
Independent Verification
Commit State
Trace + Audit
Figure 5. Mission-to-commit — the spine of the whole thing. State is written only after something other than the author has checked it.
How to read itThis is the one to remember, to be honest, left to right. A mission comes in, gets checked against policy, and is broken into a task graph. The specialist agents do the work — but their output does not become real yet. It goes through independent verification first, and only then is the state committed and a trace written. Work is proposed, then verified, and only then committed; never the other way around.

And there is one rule I keep coming back to.

The rule I keep coming back to The same agent should not get to define the requirement, write the code, approve the change, disable the test, deploy it, and then explain the failure. That is not autonomy, it is just unchecked work. It is far safer to split the duties: builders make things, verifiers challenge them, policy decides what is allowed, CI enforces the checks, and a human approves the few actions that genuinely need it.

MCP standardises how agents reach files, databases and tools [5] — which is great, and honestly also pretty much exactly why least privilege and tool isolation matter more, not less, once everything is one connector away.

→ the mission-to-commit and product-factory diagrams, with the per-role table and release gates (paper, §7 & §14)

§ 11A few rules I try to follow.

If you ignore everything else, keep these. I have learned most of them the slow way, to be honest.

  1. Start hierarchical before reaching for swarm behaviour.
  2. Define the canonical state before building agent memory.
  3. Define the contracts before writing the prompts.
  4. Add verification before adding more agents.
  5. Keep planning, execution and approval separate.
  6. Trace every agent and every tool call.
  7. Treat all external content as untrusted.
  8. Sandbox code execution and browser automation.
  9. Put a human gate on the high-impact actions.
  10. Optimise for recoverability, not for the demo.

§ 12So, in the end.

Multi-agent systems are not powerful because they are crowded. They get powerful when responsibilities are split cleanly, autonomy is bounded, authority is explicit, state is coherent, verification is independent, and failure is recoverable. Take those away and "more agents" just means more confident output that nobody checked — and confident-but-wrong is a pretty painful way to be wrong.

In short The agents were never really the hard part. The harness is. That, to me, is the whole difference between a system you can put in front of real users and one that only works in the demo.

This was the easy-reading version. The full paper has the complete reference architecture, the mission-to-commit and recovery diagrams, the agent-contract, event-envelope and state-transition schemas, the implementation stack and the autonomy table — basically all the detail I only waved at here. If it saves you even one 2 a.m., that is a win. And if you are building one of these and want to argue about any of it, you can always reach me at sagnik@sgnk.ai — I have some good discussions to be done with you :) — Sagnik

§ ReferencesWhere this comes from.

  1. National Institute of Standards and Technology. AI Risk Management Framework — incorporating trustworthiness into the design, development, use, and evaluation of AI systems. nist.gov/itl/ai-risk-management-framework
  2. OpenTelemetry. Signals — observability signals: traces, metrics, logs, baggage, profiles. opentelemetry.io/docs/concepts/signals/
  3. LangChain. LangGraph Overview — an orchestration runtime for long-running, stateful agents with durable execution, human-in-the-loop, and persistence. docs.langchain.com/oss/python/langgraph/overview
  4. OWASP GenAI Security Project. LLM01:2025 Prompt Injection — least privilege, output validation, human approval, adversarial testing. genai.owasp.org/llmrisk/llm01-prompt-injection/
  5. Model Context Protocol. What is MCP? — an open standard for connecting AI apps to external systems, data, and tools. modelcontextprotocol.io/docs/getting-started/intro
  6. Gupta, R. et al. RobotFleet: An Open-Source Framework for Centralized Multi-Robot Task Planning. arXiv, 2025. arxiv.org/abs/2510.10379
  7. Datta, S. et al. Agentic AI Security: Threats, Defenses, Evaluation and Open Challenges. arXiv, 2025. arxiv.org/abs/2510.23883

§ CiteHow to cite this work.

If this informed your thinking, you can cite it as:

@misc{mitra2026harnessing, author = {Mitra, Sagnik}, title = {Multi-Agent Harnessing Architecture and Orchestration Patterns in Specialized Autonomous Systems}, year = {2026}, month = {May}, howpublished = {\url{https://sgnk.ai/harness}}, note = {sgnk research} }

Plain text:

Mitra, Sagnik. (2026). Multi-Agent Harnessing Architecture and Orchestration Patterns in Specialized Autonomous Systems. sgnk research. https://sgnk.ai/harness