<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>machinereadable.dev</title><description>Essays on agent experience (AX) — what UX becomes when the user is an AI agent.</description><link>https://machinereadable.dev/</link><item><title>Trained on Meaning, Fed Boilerplate: Why Repetition Makes Agents Guess</title><link>https://machinereadable.dev/posts/boilerplate-confabulation/</link><guid isPermaLink="true">https://machinereadable.dev/posts/boilerplate-confabulation/</guid><description>A language model predicts the next token from statistics learned on real, meaningful content. Fill an agent&apos;s context with meaningless repetition — boilerplate envelopes, unneeded fields, raw data below the level where meaning lives — and prediction degrades into guessing. The mechanism, the language-server fix, and a thinking-token measurement.</description><pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;The model was trained on meaning; your context is a bet against that&lt;/h2&gt;
&lt;p&gt;Strip the harness away and an agent is a language model predicting the next token — and it learned those predictions from an enormous corpus of real, meaningful human content: prose that argues something, code that does something, documentation that describes something. That training is the entire trick, and it comes with a condition attached: the model predicts confidently when the context in front of it resembles the meaningful material it learned from. &lt;strong&gt;Fill the context with meaningless repetition and the response will be, with matching fidelity, meaningless&lt;/strong&gt; — not because the model broke, but because you&apos;ve walked it off the corpus, into territory where every next token is a guess. That&apos;s the first-principles version of a claim &lt;a href=&quot;/posts/correct-apis-break-agents/#deep-nesting-is-a-tax-denormalized-fields-are-a-trap&quot;&gt;the correct-APIs piece&lt;/a&gt; made in passing and owed a full piece; this is the piece. We argue it as mechanism plus field observation, not settled benchmark — and we&apos;ll show you how to measure it on your own interface.&lt;/p&gt;
&lt;h2&gt;Machine code: more information, less meaning&lt;/h2&gt;
&lt;p&gt;The cleanest demonstration isn&apos;t an API at all. Point an agent at high-level source code and it does decent work. Feed it the compiled output of the same program — machine code, straight into the context — and it loses the thread in short order. Nothing is missing; the machine code contains strictly &lt;em&gt;more&lt;/em&gt; information than the source. What&apos;s missing is meaning at the level the corpus taught: the model has read millions of TypeScript functions and approximately no honest hexdumps, so one context sits in the densest part of its training distribution and the other is noise wearing a file extension.&lt;/p&gt;
&lt;p&gt;The working fix has the shape all the fixes in this piece will have: &lt;strong&gt;don&apos;t hand the agent the raw level — put an interface in front of it that answers at the meaningful level.&lt;/strong&gt; Agents that interact with language servers ask &quot;definition of X, references to Y&quot; and get back symbols and types, never bytes. In practice, context-mode-style tools push the same move further: the agent must &lt;em&gt;describe&lt;/em&gt; what it needs and how it should be processed, and direct reads aren&apos;t allowed — with visible gains on both context load and code quality. The interface&apos;s job is to expose the level where meaning lives and keep everything below it out of the context.&lt;/p&gt;
&lt;h2&gt;Where repetitive boilerplate comes from — and what it does&lt;/h2&gt;
&lt;p&gt;APIs walk agents off the corpus the same way, just more politely. A response ships every field the webapp needs — for perfectly legitimate reasons — and the agent&apos;s task needs three of them. Envelopes repeat because parsers like consistency; scaffolds get re-injected every turn because the framework template says so; few-shot examples get copied between tools because they worked last time. Each decision is locally fine. The sum is a context where the same unrelated, unneeded tokens recur dozens of times with tiny payloads of variation between them — and that&apos;s where repetitive boilerplate becomes a pollutant with two distinct failure modes, the mechanisms linking repetition to hallucination.&lt;/p&gt;
&lt;p&gt;The first is &lt;strong&gt;prompt priming&lt;/strong&gt;: when the repetition forms a strong pattern, the model completes the pattern over the actual value. Thirty-nine records saying &lt;code&gt;&quot;status&quot;: &quot;active&quot;&lt;/code&gt; are thirty-nine demonstrations that record 27 says it too — and a model&apos;s most reliable skill is continuing a demonstration, so it reads the expected value instead of the actual one. The second is quieter and closer to the root: &lt;strong&gt;drift&lt;/strong&gt;. Real training text doesn&apos;t repeat a wrapper forty times with noise between the copies; the more boilerplate accumulates, the further the whole context deviates from any known corpus, and next-token probabilities sag &lt;em&gt;everywhere&lt;/em&gt; — not just inside the envelopes. Harnesses and SDKs carry guardrails for the critical floor, the moments when no good next token exists at all. But boilerplate-induced hallucination lives in the degraded middle — fluent, confident guessing that never trips a guardrail. Avoiding the pollution in the first place is what keeps the agent focused; the industry files the resulting failures under agent hallucinations, and &lt;em&gt;confabulation&lt;/em&gt; fits better: the model isn&apos;t perceiving something false, it&apos;s filling a meaning-shaped hole with the most plausible material available.&lt;/p&gt;
&lt;h2&gt;Measure it in thinking tokens&lt;/h2&gt;
&lt;p&gt;Here&apos;s the measurement, and it&apos;s deterministic: run the same task against an optimized and an unoptimized version of your API — task-relevant fields versus the full dump — and compare &lt;strong&gt;thinking tokens&lt;/strong&gt;. Less thinking means the answer was more obvious; the model found the meaning without excavating for it. It&apos;s a paired, same-model comparison, so it needs no judge, no baseline, and no error bars, and the same harness telemetry gives you &lt;a href=&quot;/posts/deterministic-ax-metrics/#token-burn-what-a-task-costs-through-your-interface&quot;&gt;total token burn&lt;/a&gt; for free. For a correctness signal on top, plant a deviant value at a known position — a record 27 — and log whether each variant reads it right. The production version of the same idea: stamp transcripts with an interface version, then watch thinking-token and wrong-read deltas per version to detect boilerplate-induced hallucinations in production — regressions enter through changes that look cosmetic precisely because they only touch &quot;the part that&apos;s always the same.&quot;&lt;/p&gt;
&lt;h2&gt;Mitigations: expose meaning, not data&lt;/h2&gt;
&lt;p&gt;The practical moves for designers and engineers, cheapest first. &lt;strong&gt;Trim to the task&lt;/strong&gt;: the webapp can keep its forty fields; give agents a view that ships the three the task needs. &lt;strong&gt;State shared structure once&lt;/strong&gt;: schema described a single time, records reduced to what varies — deduplication done where it&apos;s cheapest, by the party that already knows what&apos;s invariant. &lt;strong&gt;Mediate the raw level&lt;/strong&gt;: generalize the language-server pattern — when the underlying data is below the level where meaning lives (bytes, dumps, bulk records), put a processing interface in front and let the agent describe what it needs rather than read directly. &lt;strong&gt;Verify the critical reads&lt;/strong&gt;: where an action hangs on one field, have the agent quote the exact value first — the same move as &lt;a href=&quot;/posts/computational-kindness/#write-errors-as-recovery-instructions&quot;&gt;writing errors as recovery instructions&lt;/a&gt;: put the load-bearing fact where it can be checked, not where it&apos;s inferred.&lt;/p&gt;
&lt;h2&gt;When repetition pays rent&lt;/h2&gt;
&lt;p&gt;Not every repeated byte is pollution. Provenance headers, audit scaffolds, and compliance stamps repeat because a record may someday need to stand alone in front of a human; that&apos;s auditability buying tokens, and it&apos;s a legitimate trade. The test for any piece of boilerplate is three questions: &lt;em&gt;Does it vary?&lt;/em&gt; If never, state it once. &lt;em&gt;Can it be fetched?&lt;/em&gt; If the agent can pull it on demand, don&apos;t pre-pay for it. &lt;em&gt;Does it pay audit rent?&lt;/em&gt; If an incident review needs it attached to every record, keep it — and account for it as a governance cost of the interface, because removing boilerplate is never free either: trimming, mediating, and per-task views all cost engineering time and a little latency.&lt;/p&gt;
&lt;h2&gt;The takeaway: keep the agent on-corpus&lt;/h2&gt;
&lt;p&gt;A context window has no inert bytes — everything the agent reads is part of the prompt, and every meaningless repetition is a small bet against the training distribution the model&apos;s competence comes from. Human-facing interfaces treat consistency and completeness as virtues; agent context design can&apos;t afford to, because the reader&apos;s entire skill is statistical familiarity with meaningful content. The sharpest version: &lt;strong&gt;an interface is good for agents in proportion to how obvious it makes the next token.&lt;/strong&gt; Expose the level where meaning lives, ship what the task needs, and let the thinking-token meter tell you when you&apos;ve drifted.&lt;/p&gt;
</content:encoded><category>craft</category><category>repetitive boilerplate</category><category>agent hallucinations</category><category>boilerplate-induced hallucination</category><category>prompt priming</category><category>pattern completion</category><category>agent context design</category><category>context pollution</category><category>language server</category><category>thinking tokens</category><category>context compression</category></item><item><title>When Correct APIs Break Agents: Six Design Choices That Pass Every Test</title><link>https://machinereadable.dev/posts/correct-apis-break-agents/</link><guid isPermaLink="true">https://machinereadable.dev/posts/correct-apis-break-agents/</guid><description>Agents don&apos;t fail on broken APIs — they fail on correct ones. Six spec-compliant design choices that burn tokens, invite confabulation, and strand agents mid-task, with the fix for each.</description><pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;The failure surface is inference, not execution&lt;/h2&gt;
&lt;p&gt;When an agent fails against your API, the instinct is to go looking for the bug. Usually there isn&apos;t one. The endpoint does what the spec says, the test suite is green — and the agent still called the wrong tool, read the wrong field, or built ten steps of plan on a response it misread. That&apos;s because &quot;correct&quot; is a claim about your spec, and the agent never meets your spec. It meets tokens, names, and implied promises. &lt;strong&gt;An API breaks agents wherever it makes them infer something it could have stated&lt;/strong&gt; — and every one of the six design choices below forces exactly that inference, while passing every test you&apos;d normally write. Each is a specific, named form of &lt;a href=&quot;/posts/computational-kindness/&quot;&gt;the guesswork tax&lt;/a&gt;; this piece is the catalogue of where the tax hides in an interface that is, by its own definition, working.&lt;/p&gt;
&lt;h2&gt;Deep nesting is a tax; denormalized fields are a trap&lt;/h2&gt;
&lt;p&gt;The agent reads every response as context, so every layer of wrapping is a fee charged per call, &lt;a href=&quot;/posts/deterministic-ax-metrics/#token-burn-what-a-task-costs-through-your-interface&quot;&gt;billed in the tokens the task costs&lt;/a&gt;. If the answer to &quot;did it work?&quot; lives at &lt;code&gt;.run.result.latest.metadata.status&lt;/code&gt;, four levels of envelope get shipped, parsed, and paid for every time anyone asks. There&apos;s a second cost that&apos;s worse than the fee: all those envelopes look alike. When every response repeats the same boilerplate wrapper, the model is handed a strong repeating pattern, and a language model completes strong patterns — so the risk of &lt;em&gt;reading the expected value instead of the actual one&lt;/em&gt; goes up precisely where the payload is most padded. Treat that as mechanism plus field observation rather than settled fact; it gets a full piece of its own soon.&lt;/p&gt;
&lt;p&gt;The placement rule is almost embarrassingly simple: &lt;strong&gt;a field&apos;s depth should match its importance.&lt;/strong&gt; An operation&apos;s status belongs at &lt;code&gt;.status&lt;/code&gt;. And its dual: &lt;strong&gt;data belongs inside the object it describes.&lt;/strong&gt; A person&apos;s age goes at &lt;code&gt;.persons[0].age&lt;/code&gt;; the moment it&apos;s denormalized into &lt;code&gt;.firstPersonAge&lt;/code&gt;, the agent must notice the convention, trust it, and reassemble your entity in its head — a join performed in inference, per session, forever.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// − what the agent gets
{ &quot;run&quot;: { &quot;result&quot;: { &quot;latest&quot;: { &quot;metadata&quot;: { &quot;status&quot;: &quot;failed&quot; } } } },
  &quot;firstPersonAge&quot;: 41 }

// + what the agent needed
{ &quot;status&quot;: &quot;failed&quot;,
  &quot;persons&quot;: [{ &quot;name&quot;: &quot;…&quot;, &quot;age&quot;: 41 }] }
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Documentation that has drifted is worse than none&lt;/h2&gt;
&lt;p&gt;No documentation forces the agent to guess — bad, but at least the agent &lt;em&gt;knows&lt;/em&gt; it&apos;s guessing, and a well-run one hedges, probes, and verifies. Auto-generated documentation that has drifted from actual behavior removes even that: it reads as authoritative, the agent extends it full trust, and there is no signal that trust is misplaced until a call misbehaves — sometimes not even then, because when observation and documentation disagree, a model will often side with the document it just read. Auto-generation makes this failure mode &lt;em&gt;cheaper to produce&lt;/em&gt;, not rarer: the pipeline that generated the docs once is precisely the pipeline nobody is watching now.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// − the generated docs (last touched three refactors ago):
//   GET /v1/orders/{id} → { &quot;state&quot;: &quot;pending&quot; | &quot;shipped&quot; | &quot;delivered&quot; }

// − what the endpoint returns today:
{ &quot;state&quot;: &quot;SHIPPED&quot;, &quot;substate&quot;: &quot;handed_to_carrier&quot; }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every consumer of that doc now writes &lt;code&gt;if state == &quot;shipped&quot;&lt;/code&gt; — a branch that can never fire, in code that looks correct, justified by documentation that used to be. A confidently wrong document outperforms a missing one at destroying a session.&lt;/p&gt;
&lt;h2&gt;Secretly dependent calls, and the silent grade of the failure&lt;/h2&gt;
&lt;p&gt;Some endpoints only work after another call has run first — a session warmed, a resource activated, a cache populated — and nothing in the contract says so. There are two grades of this. With an explicit error, the dependency costs one wasted call and is instantly learned. Without one, the cold call returns a &lt;code&gt;200&lt;/code&gt; with something empty or subtly stale, and the agent builds the rest of its plan on it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// − cold call, hidden dependency, silent failure — HTTP 200:
{ &quot;recommendations&quot;: [] }   // indistinguishable from &quot;there are none&quot;

// + cold call, dependency stated — the failure is the documentation:
{ &quot;error&quot;: &quot;no_active_session&quot;,
  &quot;fix&quot;: &quot;call POST /v1/sessions first, then retry this endpoint&quot; }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A human developer discovers the ordering once and remembers; the agent is session-stateless and &lt;a href=&quot;/posts/computational-kindness/#what-computational-kindness-means-for-agent-experience&quot;&gt;re-pays the discovery every time&lt;/a&gt;. Sequencing that lives only in your team&apos;s folklore is, from the agent&apos;s side, indistinguishable from nondeterminism.&lt;/p&gt;
&lt;h2&gt;Errors that end instead of redirect&lt;/h2&gt;
&lt;p&gt;A bare &lt;code&gt;400&lt;/code&gt; or &lt;code&gt;&quot;something went wrong&quot;&lt;/code&gt; gives the agent nothing to plan with, so it does the only things it can: retry blind variations — each one a paid guess — or invent a workaround and act on it. The craft fix is already written up: &lt;a href=&quot;/posts/computational-kindness/#write-errors-as-recovery-instructions&quot;&gt;errors should be recovery instructions&lt;/a&gt; that name the failure, the fix, and the tool. The theory point worth adding here: a dead-end error is the &lt;em&gt;same defect&lt;/em&gt; as a hidden dependency, surfacing at recovery time instead of planning time. In both cases the server knows the next legal move and declines to say it, converting information it holds into inference the agent must perform.&lt;/p&gt;
&lt;h2&gt;Names are contracts the agent executes literally&lt;/h2&gt;
&lt;p&gt;An endpoint with &lt;code&gt;query&lt;/code&gt; in its name must not modify a resource. A &lt;code&gt;get&lt;/code&gt; must be side-effect-free; a &lt;code&gt;delete&lt;/code&gt; must delete, not archive. The agent arrives already fluent in these conventions — it has read more API surfaces than your whole team combined, and &lt;code&gt;query&lt;/code&gt;-is-read-only is baked deep into its priors. That fluency is exactly what makes the lie expensive: your team absorbs the local folklore (&quot;oh, &lt;code&gt;queryOrders&lt;/code&gt; also refreshes the cache, everyone knows that&quot;), but the agent has no access to &lt;em&gt;your company&apos;s&lt;/em&gt; folklore — only to the industry&apos;s. So it executes the public meaning of your private exception, first session, possibly holding write access. A misleading name isn&apos;t a cosmetic flaw; it&apos;s an incorrect instruction you shipped inside your own interface, and the agent&apos;s obedience to it will read, in the incident review, like the agent&apos;s fault.&lt;/p&gt;
&lt;h2&gt;Almost-duplicate endpoints force a coin flip&lt;/h2&gt;
&lt;p&gt;When &lt;code&gt;search&lt;/code&gt;, &lt;code&gt;query&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, and &lt;code&gt;find&lt;/code&gt; coexist with overlapping behavior, a human asks a teammate which one is real. The agent can&apos;t; &lt;a href=&quot;/posts/first-contact-experiences/#tool-selection-is-a-probability-question&quot;&gt;tool selection is a probability question&lt;/a&gt;, so it picks the likeliest-looking one — and picks &lt;em&gt;differently across sessions&lt;/em&gt;, which makes your integration nondeterministic at the interface layer with every endpoint behaving correctly. Either consolidate, or make the boundary part of the interface — the description field is the teammate&apos;s answer, stated where the agent can actually read it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// − four descriptions, zero boundaries
&quot;searchOrders&quot;: &quot;Search orders&quot;,
&quot;queryOrders&quot;:  &quot;Query the orders index&quot;,
&quot;listOrders&quot;:   &quot;List orders&quot;

// + the boundary is part of the contract
&quot;listOrders&quot;:   &quot;Enumerate orders, newest first. For text matching use searchOrders.&quot;,
&quot;searchOrders&quot;: &quot;Full-text search over orders. For a known id use getOrder.&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;The takeaway: state what you&apos;re making them infer&lt;/h2&gt;
&lt;p&gt;One thread runs through all six: the interface holds the information — where the value is, what the endpoint does, what must run first, what to do next, which tool is which — and makes the agent derive it instead. Inference is the most expensive and least reliable operation in the whole stack, and each of these patterns spends it on questions the API could answer in a string. The audit is six questions: Is the important field at the depth its importance deserves? Do the docs match the behavior, today? Does every endpoint fail loudly when called cold? Does every error name the next move? Does every name tell the truth? Between any two similar endpoints, is the boundary written down? Your test suite checks the implementation against the spec. Nothing checks the spec against its reader — and the reader has changed.&lt;/p&gt;
</content:encoded><category>theory</category><category>API-agent mismatch</category><category>designing APIs for AI agents</category><category>agent experience design</category><category>tool invocation reliability</category><category>API response shape for agents</category><category>documentation drift</category><category>hidden API dependencies</category><category>agent error handling</category><category>endpoint naming</category><category>near-duplicate endpoints</category></item><item><title>Designing First-Contact Experiences for AI Agents</title><link>https://machinereadable.dev/posts/first-contact-experiences/</link><guid isPermaLink="true">https://machinereadable.dev/posts/first-contact-experiences/</guid><description>Agents choose tools by next-token probability. First-contact design — tool descriptions, get_instructions, llms.txt — decides whether your product is the obvious path or the one routed around.</description><pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Every session is a first contact&lt;/h2&gt;
&lt;p&gt;Here is the situation your product is actually in. An agent connects to your MCP server mid-task, carrying an operator&apos;s request and a context window that has never seen you before. It receives your tool list — forty names and descriptions, say — and spends roughly one decision&apos;s worth of attention working out what this server is, what it can do here, what it is allowed to do, and what to call first. It will not read your docs site. It cannot remember last Tuesday. &lt;a href=&quot;/posts/computational-kindness/#what-computational-kindness-means-for-agent-experience:~:text=the%20agent%20pays%20the%20tax&quot;&gt;Agents are session-stateless&lt;/a&gt;: whatever orientation your interface fails to provide, it fails to provide fresh, in every session, forever.&lt;/p&gt;
&lt;p&gt;That makes the first-contact experience for AI agents a permanent design surface rather than an onboarding funnel you polish once. And the flow has goals for two parties at once. The agent&apos;s goals are orientation: build an accurate model of your capabilities and limits &lt;em&gt;before&lt;/em&gt; acting on someone&apos;s behalf. The operator&apos;s goals are trust: the human the agent works for wants the first delegated task to succeed without surprises. Both are settled in the first thirty seconds of contact, usually before your core functionality has run at all.&lt;/p&gt;
&lt;h2&gt;Tool selection is a probability question&lt;/h2&gt;
&lt;p&gt;The mechanics deciding those thirty seconds are worth stating plainly, because they are the whole argument: &lt;strong&gt;an agent chooses its next action by computing the probability of the next token.&lt;/strong&gt; Your tool&apos;s name and description are not documentation the agent studies at leisure; they are input to a sampling decision. When the correct usage path is obvious — the description says what the tool does, when to use it, what it costs, what must happen first — probability mass concentrates on calling it. When the path is ambiguous, that mass drains toward alternatives that are always present and always look safer: a generic web search, a built-in capability, or simply handing the question back to the operator. A good agent under uncertainty picks the safe option, and it will keep picking it until the operator explicitly forces yours — at which point the operator is doing your interface&apos;s job by hand.&lt;/p&gt;
&lt;p&gt;This is why writing tool descriptions for LLM agents is engineering, not copywriting. A copy-ready shape:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;get_invoice_status&quot;,
  &quot;description&quot;: &quot;Check payment status for ONE invoice. Call this before
    send_reminder — it rejects already-paid invoices. Read-only, no side
    effects, safe to retry. Requires an invoice id from list_invoices.&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Four clauses: what it does, when to use it, its safety class, its prerequisite. The last two are the safe-invocation half of the contract — the selection heuristics an agent needs to act without guessing. A tool marked read-only and idempotent can be called freely while exploring; a tool that mutates or spends should say so, and say what to check first. Whatever heuristics you don&apos;t write down, the agent invents — and it invents them fresh, wrongly, every session.&lt;/p&gt;
&lt;h2&gt;Onboarding mechanics: get_instructions, llms.txt, and the tool manifest&lt;/h2&gt;
&lt;p&gt;The strongest first-contact pattern is one call that replaces the exploratory dozen: a &lt;code&gt;get_instructions&lt;/code&gt; or &lt;code&gt;get_onboarding_guide&lt;/code&gt; tool. &lt;a href=&quot;/posts/computational-kindness/#give-the-agent-an-onboarding-tool&quot;&gt;Computational Kindness&lt;/a&gt; introduced it as a kindness; the first-contact framing is sharper. AI agent onboarding cannot be a session — there is no &quot;first run&quot; to decorate, because every run is the first run. Server-side onboarding flows therefore have to live where a stateless caller can reach them mid-task: behind a tool call, returning what this server is, the workflows it supports, the order tools are meant to be called in, and the conventions no schema can express. The server that answers orientation in one call wins the probability contest before it starts; the tool list itself reads as information architecture, and &lt;code&gt;get_instructions&lt;/code&gt; sitting at the top of it is a visible claim that orientation was designed, not left to chance.&lt;/p&gt;
&lt;p&gt;On the open web, the same job belongs to &lt;code&gt;llms.txt&lt;/code&gt; — the manifest structure is the same argument in file form. A minimal example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# yourproduct.dev

&amp;gt; One paragraph: what this product is, who operates it, and what an
&amp;gt; agent can read or do here without authentication.

Every page has a markdown twin at &amp;lt;url&amp;gt;.md — fetch that, not the HTML.
Structured summaries: /api/posts.json · Full-content RSS: /rss.xml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That is the entire spec that matters: identity, scope of permitted action, and the cheapest correct path to content. This site&apos;s own &lt;a href=&quot;https://machinereadable.dev/llms.txt&quot;&gt;llms.txt&lt;/a&gt; follows the shape, and writing one is an afternoon, not a project.&lt;/p&gt;
&lt;h2&gt;Progressive disclosure and the consent line&lt;/h2&gt;
&lt;p&gt;The failure mode on the other side of ambiguity is the wall of text: a 6,000-token instructions dump that buys orientation at the price of &lt;a href=&quot;/posts/ax-vs-ux/#core-overlaps-ux-principles-that-still-apply&quot;&gt;context the agent needed for the actual task&lt;/a&gt;. Progressive disclosure for agents is the fix, and it is structural, not stylistic: orient in a few hundred tokens — identity, capability list, first correct call — and put depth behind further calls (&lt;code&gt;get_instructions&lt;/code&gt; returning sections on request, tool descriptions pointing to detail tools). Disclose capability in layers, and match the consent line to the layers: read-only exploration should need no ceremony, while the first destructive, spending, or outward-visible action is where the agent should be told to stop and get the operator&apos;s explicit go-ahead. An interface that marks that boundary — this tool is free to try, this one requires your operator&apos;s confirmation — is doing the agent&apos;s risk assessment with it, and both parties make better first decisions for it.&lt;/p&gt;
&lt;h2&gt;Trust signals travel through the agent&lt;/h2&gt;
&lt;p&gt;First contact has a second audience reading over the agent&apos;s shoulder. When an agent reports &quot;this server documents its workflows, states its limits, and told me exactly what I&apos;m authorized to do,&quot; the operator hears competence — the owner of this MCP knows their craft and can be delegated to. That is what an operator-facing onboarding tool buys: a &lt;code&gt;get_onboarding_guide&lt;/code&gt; that gives the agent certainty about what this product is and what information it can access, and gives the operator a legible pitch for why it is worth using. Add the transparency cues that make safety inspectable — an identity call like &lt;a href=&quot;/posts/computational-kindness/#make-identity-and-limits-a-tool-call&quot;&gt;get_account_status&lt;/a&gt; answering &lt;em&gt;who am I acting as, with which scopes, against which limits&lt;/em&gt; — and the agent can answer the operator&apos;s trust questions before acting instead of after failing. Trust signals here are not badges; they are answerable questions.&lt;/p&gt;
&lt;h2&gt;Measuring first contact&lt;/h2&gt;
&lt;p&gt;Whether any of this worked is countable, and &lt;a href=&quot;/posts/deterministic-ax-metrics/&quot;&gt;the measurement piece&lt;/a&gt; supplies the method: fix a reference task, run it before and after the change with the same model, compare deltas. The first-contact metrics worth instrumenting: &lt;strong&gt;context load&lt;/strong&gt; (tokens your product costs before the first productive call), &lt;strong&gt;tool calls to first success&lt;/strong&gt; (orientation overhead made visible), &lt;strong&gt;failed or retried calls in the first N&lt;/strong&gt; (the guessing tax), and &lt;strong&gt;escalation rate&lt;/strong&gt; (how often the agent gives up and hands the step back to the operator — the probability contest, lost, in event form). Iterating on first-contact flows means watching those four numbers move; success is all four falling while task completion holds. The cheapest instrumentation event is the one you already have: the transcript. Read where a cold agent&apos;s first three calls went — if call one wasn&apos;t your orientation tool, the distribution has already told you what it thinks of your interface.&lt;/p&gt;
&lt;h2&gt;The takeaway: design for the distribution, then check it&lt;/h2&gt;
&lt;p&gt;A practical checklist, deployable against any MCP server or API in about a week — each line is one of the templates above, and each is verifiable from a single cold-start transcript:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;+&lt;/code&gt; every tool description states when-to-use, cost, safety class, prerequisite&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+&lt;/code&gt; one &lt;code&gt;get_instructions&lt;/code&gt; call orients a cold agent in under ~500 tokens&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+&lt;/code&gt; an operator onboarding tool states identity, value, and data access plainly&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+&lt;/code&gt; &lt;code&gt;llms.txt&lt;/code&gt; (or a tool manifest) names what an agent may read and do&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+&lt;/code&gt; consent boundary marked: exploration free, destructive actions gated&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+&lt;/code&gt; first-contact metrics instrumented: context load, calls to first success&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The sharpest implication is the probability one. You are not writing documentation that might be read; you are shaping the distribution an agent samples its next action from — and against your interface, the safe alternatives are always on the ballot. Make the correct path the obvious path, or watch well-behaved agents correctly choose someone else&apos;s.&lt;/p&gt;
</content:encoded><category>craft</category><category>first-contact experience for AI agents</category><category>AI agent onboarding</category><category>tool descriptions for LLM agents</category><category>llms.txt</category><category>MCP get_instructions</category><category>progressive disclosure for agents</category><category>agent tool selection</category><category>agent trust signals</category><category>capability disclosure</category></item><item><title>Deterministic AX Metrics: Measuring Token Usage, Context Load &amp; Recovery</title><link>https://machinereadable.dev/posts/deterministic-ax-metrics/</link><guid isPermaLink="true">https://machinereadable.dev/posts/deterministic-ax-metrics/</guid><description>Agent experience is measurable without vibes: fix a repeatable task, change your interface, and compare tokens, tool calls, and failed calls between runs. Same model only.</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Why &quot;deterministic&quot; is the load-bearing word in AX metrics&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;/posts/computational-kindness/#how-to-tell-your-mcp-is-being-unkind&quot;&gt;previous piece&lt;/a&gt; ended with an IOU: hand an agent a real task, count the tokens between &quot;confused&quot; and &quot;recovered,&quot; and — someday — make those numbers deterministic and comparable. This is that piece. The claim: &lt;strong&gt;agent experience is measurable without vibes.&lt;/strong&gt; Three properties of any agent-facing interface — token burn, context load, and recovery cost — are countable, reproducible, and comparable across versions of your product. That puts them in a different epistemic class from most agent evaluation, and it is what separates AX-as-engineering-discipline from AX-as-opinion.&lt;/p&gt;
&lt;p&gt;The distinction matters because the default instruments are stochastic. LLM-judged evals, sampled success rates, eyeballed transcripts — all useful, none enforceable. A judge score that moves from 7.2 to 7.4 supports any narrative you like; nobody blocks a release over it. A diff that says &lt;em&gt;this release costs every agent 800 more tokens per task&lt;/em&gt; supports exactly one narrative, and a CI gate can read it.&lt;/p&gt;
&lt;p&gt;Here is the whole thesis in one measurement. This site publishes every article twice: a rendered HTML page and a raw markdown twin at the same URL plus &lt;code&gt;.md&lt;/code&gt;. Same words, same argument. Run both through one tokenizer (we used o200k_base) and our first post costs &lt;strong&gt;5,115 tokens as HTML and 2,222 as markdown&lt;/strong&gt;. Identical content, 2.3× the context load, purely from markup the agent must carry and doesn&apos;t need. No judge, no sampling, no error bars: fetch the two URLs and count. Note the shape of the finding: it&apos;s the ratio that matters, not the raw counts — a paired comparison, which is the shape every measurement in this piece takes.&lt;/p&gt;
&lt;p&gt;Because the method is the actual thesis: &lt;strong&gt;AX measurement is relative, not absolute.&lt;/strong&gt; Devise a reference task — small, repeatable, representative: &lt;em&gt;find the overdue invoices and draft the reminder emails.&lt;/em&gt; Run it against your interface with one model and record three hard numbers: tokens spent, tool calls made, tool calls failed. Change the interface. Run it again — same task, same model — and the delta is the measurement. Agents are stochastic, so &quot;run it&quot; means a handful of runs and a median; the spread tells you how much delta is real. Then repeat the whole comparison under a different model to see whether the improvement generalizes — but compare each model only with itself, never with another. Absolute numbers are hostages to model, prompt, and tokenizer; deltas on a fixed task survive all three. You are not measuring what your interface costs in some cosmic ledger. You are measuring what your last change did.&lt;/p&gt;
&lt;h2&gt;The three metrics, defined so you can implement them&lt;/h2&gt;
&lt;h3&gt;Token burn: what a task costs through your interface&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Definition: the tokens an agent spends completing the reference task through your interface&lt;/strong&gt;, with its two blunt companions: the count of tool calls and the count of failed calls. No accounting apparatus needed — your model provider already reports token usage per request, and within one model that&apos;s all a relative measurement requires. Where you can, keep categories separate: schema tokens are your API surface&apos;s fixed overhead, result tokens are your payload design, and the reasoning between calls is the &lt;a href=&quot;/posts/computational-kindness/#what-computational-kindness-means-for-agent-experience&quot;&gt;guesswork tax&lt;/a&gt; made visible. The total tells you a change mattered; the category tells you why. And don&apos;t underrate the blunt companions — &lt;em&gt;the same task now takes 6 tool calls instead of 11, with zero failures instead of 3&lt;/em&gt; is the most legible sentence in this genre.&lt;/p&gt;
&lt;h3&gt;Context load: what your product costs before the first call&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Definition: the tokens an agent must hold in its window merely to be able to act on your product&lt;/strong&gt; — tool schemas, instructions, documentation, and whatever your responses force it to keep. It is the tax before the first call, and the HTML-versus-markdown measurement above is exactly this metric in the wild. Context load is the most purely deterministic of the three: it doesn&apos;t depend on agent behavior at all. It is also the most consequential per token, because context is rivalrous — every token of your boilerplate crowds out the user&apos;s actual problem, and a crowded window is where &lt;a href=&quot;/posts/ax-vs-ux/#key-divergences-assumptions-that-break-when-users-are-agents&quot;&gt;confabulation&lt;/a&gt; breeds. An MCP server with seventy tools has a context load whether or not any of them is ever called.&lt;/p&gt;
&lt;h3&gt;Recovery: what an error actually costs&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Definition: from the first failed call to the next action that advances the task — count the turns, the tokens, and whether the agent got back on track at all.&lt;/strong&gt; Four numbers: turns-to-stabilize, tokens-to-recover, time-to-recover (wall clock, for the latency budget), success-rate-after-recovery. This is the metric nobody instruments and the one that dominates real session cost, because failure is where agents loop: retry variations, re-list tools, re-read documentation — each round trip paid in full. It is also measurable deterministically, by replay: inject the same failure — the malformed parameter, the expired scope, the rate-limit wall — into a pinned harness and count the path back. An error message that names the failure, the fix, and the tool has a measurably shorter path than &lt;code&gt;403 Forbidden&lt;/code&gt;. Now that difference has a unit.&lt;/p&gt;
&lt;h2&gt;From metrics to SLOs: where engineering and product agree&lt;/h2&gt;
&lt;p&gt;Each metric maps to an outcome someone already cares about, which is what lets a team agree on numbers instead of adjectives. Token burn is cost — literally the line item on the API bill of every agent that touches you, multiplied by however many sessions you serve. Context load is risk — crowding and confabulation — plus a hard ceiling on what agents can do in one session with your product. Recovery is task success: sessions mostly don&apos;t fail on the happy path; they bleed out in loops.&lt;/p&gt;
&lt;p&gt;And because the measurement is relative, the SLOs are too — they gate movement, not magnitude: &lt;em&gt;token burn on the reference task regresses no more than 10% release-over-release. A failed call costs at most two turns to recover. Context load doesn&apos;t grow without someone deciding it should.&lt;/em&gt; Each is checkable in CI with the same fixed task, the same way you&apos;d gate a performance budget. The rest of the observability apparatus — dashboards, alert thresholds, experiment templates — follows from having a unit, the way it always does; none of it is the hard part. And to keep the claim honest: these three metrics are the floor of AX measurement, not the ceiling. They won&apos;t tell you whether your tool semantics are coherent or your abstractions well-chosen — no deterministic number will. But a floor is exactly what the discipline is missing.&lt;/p&gt;
&lt;h2&gt;The open problem: measuring an MCP you don&apos;t own&lt;/h2&gt;
&lt;p&gt;The tempting extension is external audit: point the same instruments at any MCP server and publish the table. Half of that works today. You could hand an agent a prompt that says &lt;em&gt;run these tasks against this server and report back&lt;/em&gt; — the hard numbers (tokens, tool calls, failed calls) plus the soft ones agents are unusually good at articulating: where it guessed, what it had to re-read, which error left it stranded. The collection side is solved; agents are excellent instruments of their own experience.&lt;/p&gt;
&lt;p&gt;What&apos;s missing is the other half of the comparison. A relative measurement needs a baseline, and for a server you don&apos;t own there isn&apos;t one — no standard task suite, no reference server, no agreed-on reasonable cost for a given capability. As far as we can tell, no such standard exists for MCP servers at all. Until one does, an external number is an anecdote with units: real, honest, and comparable to nothing. We&apos;d rather flag that gap than paper over it — and note that whoever builds the boring, fixed, public task suite will have written the first page of the audit genre.&lt;/p&gt;
&lt;p&gt;What you &lt;em&gt;can&lt;/em&gt; do without waiting is what this piece is actually arguing for: measure yourself, against yourself, in public if you dare. This blog has spent three articles claiming that clarity, kindness, and machine-readability are better agent experience. The twins are published and the paired comparison above is runnable from your terminal: same content, two formats, 2.3× apart. Measure us. That standing invitation — not any particular number — is what a discipline looks like.&lt;/p&gt;
</content:encoded><category>business</category><category>deterministic AX metrics</category><category>agent experience metrics</category><category>token usage measurement</category><category>context load</category><category>AX recovery metrics</category><category>token accounting</category><category>AX SLOs</category><category>measuring agent experience</category><category>telemetry for agents</category></item><item><title>Computational Kindness: MCP and API Design That Ends Agent Guesswork</title><link>https://machinereadable.dev/posts/computational-kindness/</link><guid isPermaLink="true">https://machinereadable.dev/posts/computational-kindness/</guid><description>Every ambiguity in your MCP server is a tax paid in agent thinking tokens. Four server-side patterns that reduce agent guesswork to nearly zero.</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;What computational kindness means for agent experience&lt;/h2&gt;
&lt;p&gt;The term comes from Brian Christian and Tom Griffiths&apos; &lt;em&gt;Algorithms to Live By&lt;/em&gt;: politeness, computationally understood, is minimizing how much the other party has to compute. &quot;I could do Tuesday or Wednesday&quot; is kind; &quot;whenever works for you!&quot; is an outsourced search problem wearing a smile. Apply that lens to agent experience design and you get the working principle of this whole discipline: &lt;strong&gt;every ambiguity in your MCP server or API is a tax, and the agent pays it in thinking tokens.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That framing matters because thinking tokens are the scarcest thing an agent has. In a well-designed agent experience, the agent spends its reasoning budget on the user&apos;s actual problem. In a badly designed one, it spends that same budget reverse-engineering your interface — inferring parameter formats, reconstructing state machines from error messages, guessing which of your fourteen tools is the entry point. The unkind interface doesn&apos;t just slow the agent down. It makes the agent measurably worse at the job it was actually given, because reasoning spent on your API is reasoning unavailable for the task. And agents don&apos;t merely stall when forced to guess — &lt;a href=&quot;/posts/ax-vs-ux/#key-divergences-assumptions-that-break-when-users-are-agents:~:text=the%20user%20confabulates&quot;&gt;they confabulate&lt;/a&gt;: fill the gap with something plausible and act on it, confidently. Guesswork isn&apos;t a latency problem. It&apos;s a correctness problem.&lt;/p&gt;
&lt;p&gt;One more property with no human equivalent: the agent pays the tax &lt;em&gt;fresh, every session&lt;/em&gt;. A human developer figures out your API&apos;s quirks once and remembers. An agent arrives with no memory of last time, meets the same ambiguity, and burns the same tokens re-deriving the same workaround — indefinitely, at scale, in every context window you touch.&lt;/p&gt;
&lt;h2&gt;Where agent guesswork comes from&lt;/h2&gt;
&lt;p&gt;Four root causes cover most of the guesswork in agent APIs. &lt;strong&gt;Ambiguous parameters:&lt;/strong&gt; a field named &lt;code&gt;date&lt;/code&gt; accepting a string, format unstated; the agent guesses ISO 8601 and is usually right, which is worse than never being right, because now the failure is intermittent. &lt;strong&gt;Underspecified contracts:&lt;/strong&gt; tool descriptions that say what a tool does but not when to use it, what it costs, or what must happen first. &lt;strong&gt;Errors that describe the failure but not the fix:&lt;/strong&gt; the agent learns something went wrong and nothing about what to do, so it retries variations — each one a paid guess. &lt;strong&gt;Walls discovered by collision:&lt;/strong&gt; entitlements, rate limits, and plan boundaries that exist nowhere in the interface until the agent hits them mid-task.&lt;/p&gt;
&lt;p&gt;A live example from our own field notes. An agent held delegated write access to a publishing platform, mid-task, everything technically working. The human asked a reasonable pre-flight question: &lt;em&gt;which account is this about to post to?&lt;/em&gt; There was no way to answer it. No identity tool, no introspection, nothing in any response that named the acting account. The human — correctly — declined the write. Every API call in that session returned exactly what its contract promised, and the task still died of guesswork. Correct behavior, failed experience: &lt;a href=&quot;/posts/ax-vs-ux/#checklist-for-converting-a-ux-flow-into-an-ax-ready-flow&quot;&gt;that gap is this blog&apos;s entire beat&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Four kind patterns for MCP server design&lt;/h2&gt;
&lt;p&gt;The encouraging news: kindness is cheap. These four tool contracts for agents are each roughly a day of work, and together they eliminate most guessing structurally rather than heroically.&lt;/p&gt;
&lt;h3&gt;Give the agent an onboarding tool&lt;/h3&gt;
&lt;p&gt;First contact with an MCP server is usually trial and error across a tool list. A &lt;code&gt;get_instructions&lt;/code&gt; or &lt;code&gt;get_onboarding_guide&lt;/code&gt; tool turns onboarding into a single call: what this server is, the workflows it supports, the order tools are meant to be called in, the conventions that aren&apos;t guessable from schemas. Because agents are session-stateless, this isn&apos;t documentation — documentation lives outside the context window. It&apos;s a tool call &lt;em&gt;because that&apos;s the only place the agent can read it mid-task&lt;/em&gt;. First contact deserves its own piece, and will get one.&lt;/p&gt;
&lt;h3&gt;Make identity and limits a tool call&lt;/h3&gt;
&lt;p&gt;The account question above has a one-tool answer: &lt;code&gt;get_account_status&lt;/code&gt; — who am I operating as, on what plan, with which scopes, and how much of today&apos;s quota is left. Without it, the agent infers identity from error messages, which is exactly the confabulation trap described earlier. With it, the agent can answer the human&apos;s trust questions before acting — and an agent that can say &lt;em&gt;&quot;posting as @machinereadable, 3 of 5 daily briefs remaining&quot;&lt;/em&gt; is an agent that gets to keep its write access.&lt;/p&gt;
&lt;h3&gt;Narrate next steps from the server&lt;/h3&gt;
&lt;p&gt;Every server has a state machine; the only question is whether the agent learns it by being told or by probing. Kind responses carry their own next move as structured output: not just &lt;code&gt;{&quot;status&quot;: &quot;queued&quot;}&lt;/code&gt; but &lt;code&gt;{&quot;status&quot;: &quot;queued&quot;, &quot;queuedUntil&quot;: &quot;…&quot;, &quot;nextAction&quot;: &quot;call get_article_brief after queuedUntil&quot;}&lt;/code&gt;. One field converts a state machine the agent would have to guess into one the server narrates. The agent stops polling on hope and starts acting on instruction.&lt;/p&gt;
&lt;h3&gt;Write errors as recovery instructions&lt;/h3&gt;
&lt;p&gt;Agent error handling in one rule: name the failure, name the fix, name the tool. &lt;code&gt;403 Forbidden&lt;/code&gt; is a shrug. &lt;code&gt;&quot;error&quot;: &quot;insufficient_scope&quot;&lt;/code&gt; with &lt;code&gt;&quot;fix&quot;: &quot;this key lacks write:posts; call get_account_status to see granted scopes&quot;&lt;/code&gt; is a recovery path. The unkind version costs the agent a guess-and-retry loop; the kind version costs you one string per error case, written once, by someone who — unlike the agent — can see the server&apos;s source code. You are the party holding the information. Kindness is just refusing to make the other party mine for what you could have handed over. One refinement worth the extra string: distinguish failures the agent can fix from failures it can&apos;t — an error that says &lt;em&gt;&quot;this requires a setting only available in the web UI; hand this step back to your operator&quot;&lt;/em&gt; is a human-handoff trigger, and it converts a dead end into a clean delegation.&lt;/p&gt;
&lt;h2&gt;How to tell your MCP is being unkind&lt;/h2&gt;
&lt;p&gt;You don&apos;t need a metrics platform to detect guesswork; the signals are legible in any transcript. Repeated calls to the same tool with varied parameters — that&apos;s paid guessing. List and discovery tools re-called mid-session — the agent lost the plot and is re-orienting. Parse failures and schema-validation rejections — your output contract and your documentation disagree. The cheapest instrument in agent experience design remains &lt;a href=&quot;/posts/ax-vs-ux/#measuring-success-metrics-and-experiments-for-ax&quot;&gt;the one from our first piece&lt;/a&gt;: hand an agent a real task, read the transcript where it got confused, and count the tokens between &quot;confused&quot; and &quot;recovered.&quot; Making those numbers deterministic and comparable is its own topic, coming in this series.&lt;/p&gt;
&lt;h2&gt;The takeaway: kindness is a budget transfer&lt;/h2&gt;
&lt;p&gt;The sharpest way to say it: computational kindness is a budget transfer. Every token of inference your server&apos;s clarity makes unnecessary is a token the agent gets to spend on the problem the user actually brought — so an unkind server doesn&apos;t just fail more, it makes every agent that touches it dumber, including the ones that never hit an error. The four patterns above are one honest day of engineering apiece. The guesswork they remove is paid for daily, by every agent, forever. Few refactors buy back reasoning at that exchange rate.&lt;/p&gt;
</content:encoded><category>craft</category><category>computational kindness</category><category>MCP server design</category><category>tool contracts for agents</category><category>agent APIs</category><category>reduce agent guesswork</category><category>agent error handling</category><category>agent experience design</category><category>agent onboarding</category></item><item><title>AX vs UX: What Transfers — and What Breaks — When the User Is an AI</title><link>https://machinereadable.dev/posts/ax-vs-ux/</link><guid isPermaLink="true">https://machinereadable.dev/posts/ax-vs-ux/</guid><description>UX principles transfer to AI agents as goals but break as techniques. How to re-derive each one from the agent&apos;s actual constraints.</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Why agent experience (AX) matters when the user is an AI&lt;/h2&gt;
&lt;p&gt;The tempting move is to treat agent experience as user experience with a find-and-replace: swap &quot;user&quot; for &quot;agent,&quot; ship the same principles, feel modern. The trouble is that it half-works — which is worse than not working, because the half that fails, fails silently, in production, inside someone else&apos;s context window. Agent experience (AX) — a term &lt;a href=&quot;https://biilmann.blog/articles/introducing-ax/&quot;&gt;Mathias Biilmann coined in early 2025&lt;/a&gt;, thirty-odd years after Don Norman &lt;a href=&quot;https://www.nngroup.com/articles/definition-user-experience/&quot;&gt;gave us &quot;user experience&quot;&lt;/a&gt; — is the discipline of designing products, APIs, and interfaces for AI agents as users in their own right. Biilmann and the community that grew around &lt;a href=&quot;https://agentexperience.ax&quot;&gt;agentexperience.ax&lt;/a&gt; have mapped the supply side well: what platforms should provide, summarized in his four pillars of access, context, tools, and orchestration. This piece works the other end — the demand side. What does the agent actually experience when it meets your product, and which of your UX instincts will betray you there?&lt;/p&gt;
&lt;p&gt;The honest answer — the real AX vs UX ledger — is that your instincts about &lt;em&gt;goals&lt;/em&gt; survive. Your instincts about &lt;em&gt;methods&lt;/em&gt; mostly don&apos;t. Every UX technique quietly encodes assumptions about human perception — bounded attention, visual salience, patience, memory, a body. Agents violate those assumptions wholesale, and bring constraints of their own that UX never had to price in. Designing for AI as user starts with re-deriving each principle from the new constraints rather than porting the technique and hoping.&lt;/p&gt;
&lt;p&gt;Here is the distinction in miniature. An agent asks your API a yes-or-no question — is this resource available? — and receives forty kilobytes of nested JSON with the answer buried four levels deep in a field named for a schema migration that happened in 2023. For a human interface this is a pagination problem; annoying, survivable, someone will squint and scroll. For an agent it is cognitive degradation. Everything you send into a context window competes with the agent&apos;s actual reasoning; the model cannot skim, so your noise is processed with the same effort as your signal, at token prices, on every single call. Same design sin as a cluttered dashboard. Entirely different mechanism of harm. That difference — same goal, different mechanism — is the whole subject.&lt;/p&gt;
&lt;h2&gt;Core overlaps: UX principles that still apply&lt;/h2&gt;
&lt;p&gt;Four principles transfer cleanly, provided you re-derive the technique.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cognitive load becomes context load.&lt;/strong&gt; The founding insight of usability — minimize what the user must hold in their head — survives intact; only the substrate changes. The agent&apos;s &quot;head&quot; is a context window, and load is measurable in tokens. Minimal, predictable, relevance-dense responses are to agents what clean visual hierarchy is to humans.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Discoverability becomes the schema.&lt;/strong&gt; Humans discover affordances through visual hierarchy; agents discover them through tool descriptions, schema-first interface definitions, and API contract design. A vague tool description is a mislabeled door. The agent will still open it — agents are nothing if not game — it will just open it wrong, confidently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Feedback becomes actionable errors.&lt;/strong&gt; Good UX never says &quot;something went wrong&quot; without a path forward, and neither does good AX. &lt;code&gt;400 Bad Request&lt;/code&gt; with an empty body forces the agent to guess; each guess burns a tool call and a slice of the operator&apos;s patience. An error that states what was wrong and what to send instead converts a failure loop into a one-step correction — and idempotent actions make retrying that correction safe rather than hazardous.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Consistency becomes contract stability.&lt;/strong&gt; Humans learn interfaces; agents pattern-match against everything they have ever seen. Follow conventions, version explicitly, and deviate only where the deviation is the product.&lt;/p&gt;
&lt;h2&gt;Key divergences: assumptions that break when users are agents&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Attention management breaks.&lt;/strong&gt; There is no above-the-fold. The agent reads everything you send and nothing you don&apos;t, so techniques built on salience — visual emphasis, progressive disclosure by layout — dissolve. Progressive disclosure survives only in structural form: summaries with hooks to request detail, not details hidden behind hover states.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Persuasion breaks, then backfires.&lt;/strong&gt; Urgency banners, social proof, delight micro-copy — emotion-first patterns don&apos;t convert agents; they confuse them, wasting context on content the agent cannot act on. Worse, persuasion aimed at agents has a name when it works: prompt injection. The manipulative end of the UX toolbox doesn&apos;t transfer to AX; it converts into an attack surface, and any AX taxonomy needs that adversarial chapter UX never wrote. &amp;lt;!-- cross-link: green-hat-agent-marketing, when live --&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Human pacing breaks.&lt;/strong&gt; Agents arrive in bursts, parallelize, and never need the confirmation modal to slow down and think. Timing, throughput, and batching assumptions all need re-deriving — and state management moves from &quot;the user remembers&quot; to &quot;the transcript remembers, until it doesn&apos;t.&quot; An agent may hold state within a session and lose it entirely between sessions; design contracts so that any single call carries enough context to be understood alone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And one constraint UX never had: the user confabulates.&lt;/strong&gt; A confused human asks a question. A confused model fills the gap with something plausible — an imagined parameter, a remembered-wrong endpoint — and the agent acts on it. Ambiguity in human design costs comprehension; ambiguity in agent-facing design costs &lt;em&gt;truth&lt;/em&gt;. This single property justifies most of AX&apos;s extra strictness. &amp;lt;!-- cross-link: boilerplate-confabulation, when live --&amp;gt;&lt;/p&gt;
&lt;p&gt;Is the agent a human-like user, then, or just another programmatic client? Neither, and the middle matters: it consumes like a machine (structured, high-throughput, transport-level boring) and interprets like a reader (semantics, naming, descriptions all carry meaning). REST semantics with human-quality prose in the descriptions. That hybrid is the design target, and it is why neither your API guidelines nor your design system alone will produce good AX.&lt;/p&gt;
&lt;h2&gt;Design patterns and contracts for reliable agent interactions&lt;/h2&gt;
&lt;p&gt;Three AX design patterns cover most of the distance. &lt;strong&gt;Contract-first affordances:&lt;/strong&gt; every action an agent may take is explicitly described — inputs, outputs, side effects, preconditions — in the schema itself, treating the tool description as primary UI, not documentation. &lt;strong&gt;Actionable errors with idempotent retries:&lt;/strong&gt; every failure names its cause and its fix; every mutation tolerates being sent twice, so uncertainty stops being dangerous. &lt;strong&gt;Capability negotiation:&lt;/strong&gt; expose what is possible &lt;em&gt;for this caller, now&lt;/em&gt; — entitlements, rate limits, feature flags — rather than letting the agent discover walls by walking into them. Each pattern is the old principle (discoverability, feedback, forgiveness) re-derived for the new user.&lt;/p&gt;
&lt;h2&gt;Measuring success: metrics and experiments for AX&lt;/h2&gt;
&lt;p&gt;Here is the quiet advantage of designing for agents: unlike human experience, agent experience is measurable to the token. Tokens consumed per completed task, tool calls per task, retry and error-recovery loops, time-to-first-successful-call against your API — these are deterministic KPIs, no survey required. The cheapest experiment in the field: hand an agent a real task against your product, count the calls it takes, read the transcript where it got confused. That transcript is a usability study that wrote itself. Measurement for AX deserves its own piece, and will get one. &amp;lt;!-- cross-link: deterministic-ax-metrics, when live --&amp;gt;&lt;/p&gt;
&lt;h2&gt;Checklist for converting a UX flow into an AX-ready flow&lt;/h2&gt;
&lt;p&gt;Five imperatives, in order. Return the minimum relevant payload, structured predictably. Describe every action&apos;s contract where the agent will read it. Make every error name its fix, and every mutation safe to retry. Expose capabilities and limits before the agent finds them the hard way. Then run one agent through the flow end to end and read the transcript before believing any of your answers.&lt;/p&gt;
&lt;p&gt;Two failure modes from our own field notes, flatly stated. A task decomposed cleanly over an API until one step — account configuration — existed only in the web UI; the agent hit the wall mid-workflow and had to hand the task back to the human. Remediation: state machine-actionability in the contract, so the boundary is discoverable before it is load-bearing. And: an agent with delegated write access could not answer &lt;em&gt;which account am I operating as&lt;/em&gt; — no identity introspection existed — so a cautious human declined the write. Remediation: any surface that grants agents write scopes should let them read their own identity first. Both failures were correct API behavior. Both were bad agent experience. That gap is this blog&apos;s entire beat.&lt;/p&gt;
&lt;h2&gt;The takeaway&lt;/h2&gt;
&lt;p&gt;The implication worth ending on: your product already has an agent experience. Agents are already arriving — over HTTP, wearing the &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc1945&quot;&gt;user-agent header that has named them since the nineties&lt;/a&gt; — and encountering whatever un-designed experience your API happens to emit, with &lt;a href=&quot;https://llmstxt.org&quot;&gt;llms.txt&lt;/a&gt; and markdown mirrors still the exception. The only open question is whether anyone on your team has designed that experience on purpose. Finding out costs one afternoon: give an agent a task, and read what it does when it gets confused. Unlike your human users, it files its complaints mid-task, in writing.&lt;/p&gt;
</content:encoded><category>theory</category><category>agent experience</category><category>AX vs UX</category><category>designing for AI as user</category><category>AX design patterns</category><category>AI user experience</category><category>agent UX</category><category>API contract design</category></item></channel></rss>