internal/website/docs/guides/agent-harness.md
The first wave of agent frameworks solved one problem: put a model in a loop with some tools. The harder problem is operating that loop — and that's what a harness is.
A harness is the runtime around an agent:
Go Micro's bet is that this runtime is the one you already deploy. An agent is a service with a model inside; the harness is the distributed-systems machinery services already have. So you don't bolt a separate orchestration product onto your stack — the harness is the stack.
| Harness concern | In Go Micro | Status |
|---|---|---|
| Tools | Every service endpoint is an MCP-callable tool from registry metadata — no extra code | Shipped |
| Memory | Store-backed agent memory (AgentMemory), durable across restarts | Shipped |
| Guardrails | MaxSteps, LoopLimit, ApproveTool, tool wrappers — enforced at the call site | Shipped |
| Workflows | Durable flows; flow.Loop for run-until-done | Shipped |
| Planning / delegation | Built-in plan and delegate tools on every agent | Shipped |
| Discovery & RPC | Registry + client; agents and services find and call each other | Shipped |
| Interop | MCP (tools), A2A (agents), x402 (paid tools) | Shipped |
| Resilience | Per-call timeout with context propagation; opt-in retry/backoff (ModelRetry) across the loop | Shipped |
| Durable runs | Checkpoint and resume an agent run (flows already do) | In progress |
| Observability | RunInfo → OpenTelemetry spans; run history on the CLI | In progress |
| Streaming | ai.Stream through chat, agent, and A2A | In progress |
The "in progress" rows are exactly the roadmap's Now and Next, and the work is happening in the open.
An agent that does real work needs typed, discoverable, callable capabilities — which is what a service is. The harness is credible because of the service layer, not in spite of it:
Agent.Chat, and
are reachable by other agents.Use Go Micro when the agent has to operate a system, not just answer a prompt — when it needs real tools, state that survives, limits you can enforce, and a way to be seen and called. If you only need a model in a loop, you don't need a harness. When that loop has to touch production, you do.