Skip to content
All work
Studio experimentAgentic workflows· 2025

Relay

Relay is a studio experiment in the least glamorous and most valuable kind of automation: the four request types a support team answers the same way every single day. It exists mainly as a vehicle for the hard part, which is deciding what an automated system is allowed to do on its own.

Technologies

  • TypeScript
  • Node
  • Python
  • FastAPI
  • Redis
  • PostgreSQL
  • React
01The problem

Support automation usually fails in one of two directions. Either it is too timid to be useful — a classifier that tags tickets a human then reads anyway — or too bold, taking actions that cost money on the strength of a confidence score.

The distinction that matters is not how capable the model is. It is whether the authority to act is defined in code, in a place a team can read and change, rather than implied by a prompt.

02Context & constraints
Authority in code
Amount ceilings, rate limits and always-review action classes live in configuration, outside the model.
Policy as retrieved text
Behaviour changes when the policy document changes — no prompt edit, no redeploy.
Idempotent side effects
Every external action is keyed, so a retry cannot issue a second refund.
A legible audit trail
Each decision must be explainable months later, including which policy version applied at the time.
03Approach

Requests are classified on arrival, then context is assembled — account state, billing history, prior contacts — before any reasoning happens. The agent proposes an action and must cite the policy clause that permits it. A proposal without a citation is rejected by the layer above it.

Action limits are then enforced by deterministic code. Some classes of action, refunds among them, are marked always-review no matter how confident the agent is, because the cost of being wrong is asymmetric.

Escalation is treated as a first-class success path rather than a failure. A request that reaches a person with the account history, the applicable policy and a proposed action already attached has been meaningfully handled, even though nothing was automated.

04System architecture
Intake classifier
Cheap, reversible intent and urgency classification, logged for review.
Context assembler
Parallel fetches from CRM, billing and ticket history with per-source timeouts and partial-failure handling.
Policy retrieval
Versioned policy documents retrieved as text with owner and clause references.
Proposal engine
Produces a typed action proposal with a required policy citation and confidence value.
Authority layer
Deterministic limit enforcement: ceilings, windows, per-account rate limits, always-review classes.
Tool adapters
Narrow, idempotent, individually permissioned functions per external system, with backoff and circuit breaking.
Approval surface
One screen showing action, cited clause and evidence, with approve, override and escalate.
05Product experience

The approval queue is designed to be cleared, not browsed. Each item presents the proposed action, the clause it rests on and the evidence behind it, and resolves with a single decision.

Overrides are the most useful signal the system produces. When an approver consistently overrides a particular proposal type, that is evidence the policy and the code disagree — and the queue surfaces that pattern rather than burying it in logs.

06Technical decisions
Required policy citation
Forcing the agent to point at a clause makes wrong decisions traceable to either a misreading or a genuinely ambiguous policy.
Always-review classes independent of confidence
Confidence is not a measure of consequence. Money leaving the business is a human decision.
Durable workflow state
A request paused for approval may wait for days. Workflow state is persisted, not held in memory.
Narrow tools over a general API client
Each tool does one thing with one permission, which makes the blast radius of a mistake small and legible.
07Testing & evaluation

The evaluation set is built from request transcripts paired with the action policy requires — including cases where the correct behaviour is to escalate without acting.

We scored two failure types separately, because they are not equally bad. Acting when the system should have escalated is a safety failure. Escalating when it could have acted is a cost failure. Conflating them hides the only tradeoff that matters.

Tool adapters are tested against recorded fixtures of the third-party APIs, including their error and rate-limit responses, which are the behaviours integration code actually has to survive.

08Limitations

What this does not prove

  • Exercised against synthetic request transcripts and sandbox accounts on the third-party services, not live customer traffic.
  • No figures exist for resolution rate, handling time or deflection, because the workflow has not run against a real queue.
  • Policy retrieval assumes policies are written clearly enough to cite. Many are not, and that work has to happen first.
  • Long multi-turn negotiations with a customer are out of scope; the system escalates them immediately.
Studio experimentDocument intelligence2025

Ledger

A document pipeline that extracts structured records from inconsistent supplier invoices, validates them in code, and routes only its own uncertainty to a person.

Concept demonstrationConversational analytics2025

Prism

A natural-language interface to a data warehouse that generates read-only queries inside permission boundaries and shows the definition behind every number it reports.

07Next step

Have something difficult in mind?

We like ambitious problems — the ones with awkward constraints, messy data and a real cost attached to getting them wrong. Tell us what you are building and what makes it hard.

Good fit
A real workflow with real constraints, an internal owner who can make decisions, and a problem where being wrong actually matters.
Less good fit
A chatbot with no defined job, a fixed-scope rebuild of something that already works, or a project that needs to look finished before it is understood.