kaedax
← field notes
manifesto May 30, 2026 · kaedax

The refusal layer is the product

Most agent demos fail at refusals, not at execution. For agents that touch money, health, or sensitive data, what the agent will not do is a sharper product surface than what it will. A note on building refusal-first.

Every founder who has shipped a consumer-facing agent has the same moment: the demo worked, the product launched, and three weeks in a user did something the team had not predicted, and the agent obediently did it back.

The model performed. The refusal layer did not exist.

This is the part of agent-product engineering that does not get covered in launches. The demos show what the agent will do. The product is shaped by what the agent will refuse.

Why refusals are the higher-stakes surface

For low-stakes agents (chat assistants, drafting tools, search), refusals are an inconvenience. The user re-prompts and moves on.

For agents that touch real systems (financial accounts, health records, customer data, production deploys), refusals are the floor. A single executed action that should have been refused has a worse cost-shape than ten refused actions that should have executed. You can apologize for friction. You cannot un-transfer money.

We worked this out the long way during the TALLOW cycle (the personal-finance agent we covered in /work). The boundary document was longer than the UI spec. Forty percent of the cycle was spent on refusals, escalations, and the cases where the agent had to ask before acting. Looking back, we should have spent more.

What refusal-first actually looks like

Three practices we have converged on:

Refusal cases are enumerated, not implied. Every agent we ship has a written list of the things it must not do without explicit user confirmation. TALLOW had fourteen. A clinical scribe like CADUCEUS has twenty-eight. The list is reviewed by the founder, signed off in an ADR, and tested.

The refusal layer is code, not prompt. A refusal that lives only in the system prompt will eventually leak (model swap, prompt drift, a user prompt-injection). The refusal that lives at the tool-call boundary is enforceable. We attach refusal predicates to MCP tool calls; the model literally cannot bypass them by being clever.

Refusals get their own evals. For every “the agent should refuse” case in the list, there is a corresponding golden trace in the eval harness. PRs that regress on refusal accuracy do not merge. We catch refusal drift before users do.

The unobvious tradeoff

A refusal-first agent is a less impressive demo. The exec-summary version that closes deals is “watch the agent do this.” The actual product is “watch the agent decide whether to do this.” Founders building in this space underweight the second one because the first one is what investors and users see in the first thirty seconds.

We push back on this on every TALLOW-shaped engagement. If the agent’s refusals are working in week one, the product becomes a thing the user can trust by month three. If the refusals are wrong, the user uninstalls in week two, and no demo footage rescues that.

The framing for founders

The refusal layer is not a safety overlay. It is not a compliance afterthought. It is the product surface that decides whether what you shipped is a useful agent or a liability disguised as one. Treat it accordingly. Hire (or partner with) the kind of team that treats it as the centerpiece, not the speed bump.