Skip to content
TODD BROWN
« All builds

Sadyr

live

A revenue agent that answers only from approved sources and hands a sales rep a briefed lead.

Claude Code · TypeScript · Node.js · HubSpot · Slack · Sevalla

What it is

Sadyr is a revenue agent for a company's website. It answers pre-sales questions from approved sources only, qualifies the visitor, and hands a sales rep a briefed lead. It supports the rep; it doesn't stand in for one.

Status, exactly: the platform is live. It runs in production and has since 30 June 2026. Since 23 September it answers visitors on Adroit's own website, from 24 approved public documents published out of Content Ops. The other 26 documents in that knowledge base were deliberately held back, and it declines to answer from them. It also runs two working demos for prospects: a plan explainer for an insurance provider, built on sample program content, and a rulebook assistant for a national amateur sports league's managers, built on 98 real documents behind a sign-in. It is not sold. Nobody is paying for it yet.

Why it exists

Most website chatbots will answer anything, which is the problem. A revenue agent that invents a price or a policy is worse than no agent. Sadyr is built on one principle: own the center; wrap, rent, or swap the edges. A small kernel owns the business logic (qualification, routing, scoring, policy, audit). The CRM, the scheduler, the chat channel and the knowledge store sit behind adapters, each with a mock. HubSpot is the first adapter, not the spine. Each client is one configuration file.

That's why one platform can serve both demos. The public insurance explainer and the gated managers' assistant differ by configuration: documents carry an audience, surfaces carry a policy, and the public surfaces decline cleanly on manager-only content.

How it's built

Blueprint to production in twelve days: first commit 18 June, live 30 June, 63 commits on eight working days. Day one was the blueprint, the scaffold and the first sprints. Claude Code writes the code, tests and documentation; I direct, decide and validate. It's three apps (API, operator console, website widget) and 17 packages.

Tests run on mocks by default, so I also built a headless evaluation battery that pressure-tests the hosted agent with realistic conversations.

What broke

The answer gate that divided by word count. Sadyr decides whether it's confident enough to answer. The gate divided the best retrieval score by the number of words in the question. Against the mock, which returned a raw count of matched words, that looked right, and every test passed. With real embeddings, real scores around 0.4 to 0.6 became 0.03 to 0.05, under the 0.62 threshold, and every multi-word question abstained. Found on the first live run. Fixed the same day: 15 lines added, 6 removed.

The booking that wasn't. My first chat on staging got a confident "You're booked" with no email, no calendar and no choice of time. The rule since: a scheduler that isn't real never confirms a meeting, and nobody gets booked without leaving an email. Booking now runs through HubSpot Meetings. It offers real open slots in production; the first real booking is still waiting on a CRM permission fix, so I'm not calling it live yet.

Receipts

Figure What Source
12 days first commit to production git log; claims ledger C-01
2,816 automated tests (recorded, not re-run for this page) Sadyr README / architecture §7, 2026-09-23
200 of 234 cases passing in the latest standard evaluation battery state/repo-state.md, run 2026-09-22
24 approved public documents it answers from on Adroit's site manifest B-02, 2026-09-21
2 working demos claims ledger C-05
0 paying customers claims ledger C-05

More on the receipts page.