Skip to content
Fig. 00 — Agentra · Sheet IndexAI · Private

Selected work · agentic support platform

Agentra · a coordinated fleet of support agents

An AI support platform where a fleet of narrow agents classifies, retrieves, resolves, and guards every case. Teams define their own modules, schemas, policies, and workflows. MCP servers and APIs connect the fleet to the systems those answers actually live in. Every write action stops at a human approval gate, and every case carries a trace that explains it.

Beats 01 to 04 · Console · Trace · Approval · EscalationCaptured Jul 2026 · Agentra console
Case sheetFile 04 / 04 · Flykitt
Role

Senior Full-Stack Engineer / Backend Architect

Timeline

2024 to 2025

Contribution split · I implemented
85%
backend + ai
15%
product

agentra · fleet, mcp layer, approvals, traces

StackShow 7 items
Cloudflare Workers · Durable Objects · MCP servers · Anthropic · OpenAI · RAG · embeddings · OpenTelemetry · Braintrust · Postgres
AccessPrivate build. Architecture shown, code not public

Context

Agentra is a customer support platform built as a coordinated fleet of agents. A case arrives from a chat widget, an inbox, a help desk, or a messaging app, and the fleet classifies it, finds the answer, drafts the reply, and decides whether a person needs to see it first.

The part that makes it a platform rather than a bot is the layer above it. A team defines its own modules, the schemas its agents may reason about, the policies that bound them, and the workflows a case follows. Agentra adapts to how that product actually operates instead of asking the team to describe their business in a prompt.

Problem

Support tooling is fragmented by default. The answer to one refund question lives in an orders database, the rule that governs it lives in a policy document, the evidence lives in an attachment, and the action lives in a payments system nobody wants a model touching unsupervised. Every case is a manual join across four systems, done by a person under an SLA.

Automating the join is the easy half. The hard half is that the last system on that list is the one that moves money, and the honest answer to who may call it is almost always not the model on its own. So the constraint shaping the whole product was never accuracy. It was permission.

The permission constraintoff by default
OFF

Nothing is granted by default

Discovery finds what a connected system can do. It does not decide what the fleet may do. Every tool on the right starts switched off, and a person turns each one on at read, needs approval, or nothing at all.

Payments MCP connection panel showing 14 tools discovered automatically, with get_charge and list_customer_charges granted as read, create_refund and void_invoice requiring approval, and update_dispute switched off
Tool permissions · one connected mcp server

What one refund request has to touch

The order
orders db · line item · price
The policy
return window · refund limits
The evidence
customer photo · prior cases
The action
payments · refund · void

Architecture

The system reads as four layers. At the top, a tenant defines its modules, schemas, workflows, and policies, and each of those definitions governs one agent. Below it, the fleet runs in a fixed order: the classifier routes, the retriever gathers, the resolver drafts, the guard checks. Below that is the connection layer, where every side effect lives and every tool carries the tier it was granted. At the floor is the person who signs off.

Fig. 01the fleet · config, agents, connections, and the human floor
CHANNELS INTENANT CONFIG · DEFINED PER TEAMTHE FLEET · FOUR NARROW AGENTSCONNECTION LAYER · READ / NEEDS APPROVAL / OFFHUMAN IN THE LOOPchat widgetembedded · your siteemailimap · smtphelp deskexisting ticket queuemessagingsocial · smsmodulesorders · returns · billingschemastyped case fieldsworkflowsdraft · hold · hand overpoliciesrefund limits · windowsclassifierintent · sentiment · routeretrieverorder · policy · past casesresolverdrafts the reply and actionguardpolicy check before sendorders dbmcp · readhelp center kbmcp · readrest apisper tenant · readpaymentsmcp · needs approvalwarehouse apimcp · offapproval gatewrite actions heldhuman agentapprove · edit · take overescalationsummary generatedevery tool starts off · a person grants each onethe approved reply goes back out the channel it came in onwritequeued

reads can fan out freely. the one write path stops at the approval gate.

The connection layer is the part a team actually sets up. Agentra is pointed at an MCP endpoint, inspects it, and lists what it found: the tools, their schemas, and their limits. Nothing is enabled by that discovery. The ops team grants each tool a tier, and the product then restates in plain language what the fleet can newly do, agent by agent, before any case touches it.

One tool in the diagram has no line reaching it. The warehouse api is connected and switched off. That is the point of having tiers at all: an ungranted tool is unreachable regardless of what a model decides to call.

Agentra setup step three of six, Connect your systems: a grid of connected MCP servers and APIs for payments, orders, warehouse, help center, mail, chat widget, shipping, and loyalty, each showing how many tools were discovered, beside a Payments panel listing per tool permissions and a plain language summary of what Agentra can do now
exhibit a · connecting a tenant's systems · production ui
§04

One case, end to end

SG-18274 · Cracked lantern · Four beats

One ticket, followed the whole way through. A customer reports a cracked lantern and asks for a refund. What follows are four production captures of that same case: where it lands, how the fleet reasoned about it, where it stopped, and what the person on the other end was handed.

Fig. 04 — One case · SG-18274 · cracked lanternLive · seeded case

One case, four beats

A cracked lantern, from queue to refund.

Order SG-18274 arrives as a chat message with a photo attached. What comes back is a drafted reply, a refund held at an approval gate, and a trace that explains both. Nothing is sent until a person says so.

Beat 01 · Queue

queue 8 of 31 · cs-4821 · sla 38m left

The needs-review console

Eight cases are waiting on a person, out of thirty one in flight. Open one and the whole thread is there: what the customer wrote, what the fleet drafted, and every step it took to get there.

Agentra console: a needs-review queue of eight cases with confidence scores on the left, the SG-18274 cracked lantern thread with a drafted reply and Approve and send, Edit reply, and Take over case buttons in the middle, and a four step agent trace rail on the right
  1. 01needs-review queue8 of 31 · confidence scored
  2. 02drafted reply, heldapprove · edit · take over
  3. 03agent trace4 steps · 41s · $0.011
Console · needs review · case thread · agent trace
Beat 02 · Trace

classifier 0.8s · retriever 6.2s · resolver 28.4s · guard 41.0s

The agent trace

Four narrow agents, in order, each with its own job and its own tool calls. The trace is the record: what was classified, what was retrieved, what was drafted, and what the guard checked before the reply was allowed to send.

Agent trace panel with four steps: Classifier at 0.8 seconds routing a damaged item intent to the Orders module, Retriever at 6.2 seconds showing orders_db.get_order returning SG-18274 and a knowledge base search returning policy 4.2, Resolver at 28.4 seconds showing payments.create_refund for $42.50 queued awaiting human approval, and Guard at 41 seconds confirming the policy check passed
Agent trace · four steps with their tool calls
Beat 03 · Hand-over

payments.create_refund($42.50) → queued · awaiting approval

The hand-over

The resolver can draft a refund. It cannot issue one. The write action stops at an approval gate, and the case surfaces three choices: send the draft, edit it, or take the case over entirely.

Hand-over strip reading Drafted by Resolver, held for your approval, above the refund reply text and three buttons: Approve and send, Edit reply, and Take over case
Hand-over · a drafted reply held for approval
Beat 04 · Escalation

policy §4.2 · outside return window · manager approval

The escalation summary

When policy says a person has to decide, the fleet says so in plain language and hands over a summary: the order, the evidence, the rule that blocks it, and the action it suggests. Nobody has to repeat themselves.

Chat thread where Agentra explains the request falls outside the 30 day window and brings in a teammate who can approve an exception, followed by a highlighted Summary card listing the SG-18274 refund request with photo verified, the policy 4.2 manager approval requirement, and a suggested $42.50 refund with no return, then the human support agent approving the exception
Escalation · the customer view with the generated summary
Captured from the Agentra console · demo tenant, seeded caseSG-18274 · cracked lantern · $42.50 refund

Key decisions

  1. Four narrow agents in a fixed order, not one agent with every tool.

    Classifying an intent, finding the right order and policy, drafting a reply, and checking that reply against the rules are four different jobs with four different risk profiles. One agent holding all of them is a single prompt nobody can evaluate. Splitting them into a classifier, a retriever, a resolver, and a guard keeps each job small enough to test on its own, and makes the sequence legible in the trace.

    Impact·A wrong classification gets caught downstream instead of becoming a wrong customer answer, and each agent can be changed without reasoning about the other three.

  2. Tools arrive as MCP servers, discovered rather than configured.

    Every tenant runs on a different set of systems. Hand writing an integration per customer does not scale, and stuffing capabilities into prompts makes them untestable. Pointing Agentra at an MCP endpoint and letting it inspect the tools, schemas, and limits on the other side turns integration into a connection step. REST APIs get the same treatment through a thin adapter.

    Impact·A new tenant system becomes a connection, not a release. The same typed tool surface is what every agent sees, so tools can be tested without a model in the loop.

  3. Every tool starts off, and each one carries a permission tier.

    An agent that can issue refunds is a security decision before it is a product decision. Discovery finds what a system can do; it does not decide what the fleet may do. Each discovered tool sits at read, needs approval, or off, and the ops team sets that per tenant. The product then states in plain language what the fleet can newly do, before a single case touches it.

    Impact·Blast radius is a setting, not a code path. A tool nobody enabled is unreachable no matter what the model decides to call.

  4. The fleet drafts; a person sends.

    Deflection is easy to optimize into something worse than a queue. Rather than tuning a confidence threshold and hoping, write actions stop at an approval gate by default. The resolver produces a complete draft and a queued action, and the case surfaces three real choices: approve, edit, or take it over. Reads never block.

    Impact·Nothing customer facing or money moving ships without a person, and the human queue is short because the work arriving in it is already done.

  5. Escalation carries a generated summary, not a transcript.

    The usual failure of a support handoff is asking the customer to repeat themselves. When policy will not let the fleet decide, it says so to the customer and hands the teammate a summary: the order, the evidence it verified, the rule that blocks the action, and the action it suggests. The rule that triggered the escalation is named, so the human knows what they are being asked to override.

    Impact·The person picking up a case starts from a decision, not from reading. The customer is told a human is coming and why.

  6. Observability is one bus, with cost as a first class attribute.

    An agent trace is not a request trace. The interesting spans are turns, tool calls, and handoffs, and the attribute that hurts is dollars, not milliseconds. Emitting every event once onto a shared bus, then subscribing sinks to it, made adding a new destination one call instead of a rewrite. Prompt caching means the invoice cannot be derived from a token count, so the precomputed total is the number that lands in the UI.

    Impact·Per case cost and the full reasoning trace are visible while a case is still open, and a new dashboard is a subscriber rather than a project.

  7. The harness was chosen by building the same crew three ways.

    Picking an agent runtime on a launch post is guessing. Before committing, the same support crew was built three times over: on Flue, on Cloudflare's Think, and on AWS Bedrock AgentCore with Strands. That comparison is where the real differences showed up, in where subagents run, how retries handle side effects, how memory is scoped, and how much wiring observability costs.

    Impact·The runtime decision came with the tradeoffs already measured, and the two writeups below are the notes from it.

Goes deeper

Related notes