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.
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
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.
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.
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.
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.
A document pipeline that extracts structured records from inconsistent supplier invoices, validates them in code, and routes only its own uncertainty to a person.
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.
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.