# Agent Experience (AX) — complete field guide
> Agent Experience (AX) is the practical work of making products, documentation, tools, and workflows easier for AI agents to discover, understand, use, recover through, and act within on behalf of people.
Source: https://agentexperience.tech/
Guides: 21
Last updated: 2026-09-09
This file contains the full text of every published guide, followed by the editorial lifecycle crosswalk and synthetic worked examples.
---
# Start here
## What is Agent Experience?
> A practical definition of Agent Experience (AX): how to make products, documentation, tools, and workflows easier for AI agents to discover, understand, use, recover through, and act within.
Published: 2026-08-25
Updated: 2026-09-09
Canonical: https://agentexperience.tech/insights/what-is-agent-experience/
Tags: agent experience, foundations, definition, workflows
Agent Experience, or AX, is the quality of a product as experienced by an AI agent doing work on behalf of a person.
An agent does not encounter a product in the same way a person does. It works through the surfaces around the product: a website, help centre, API, tool description, form, permission boundary, and handoff to a person who can make the final decision.
> **Scope:** This guide uses Agent Experience (AX) for AI agents acting for people. In contact centres, the same term commonly describes the work environment of human support agents; [Genesys uses it in that sense](https://www.genesys.com/definitions/what-is-agent-experience-ax).
AX is the practical work of making those surfaces easier to discover, understand, use, and recover through. It starts with a simple question: **what must be true for an agent to help someone complete this job well?**
### The agent’s path through a product
A useful agent journey has more than a capable model behind it. The product needs to help the agent move from a person’s goal to a responsible next step.
1. **Orient:** understand the goal, relevant context, and boundaries of the job.
2. **Discover:** find the right page, documentation, capability, or route.
3. **Act:** select and use a tool or workflow with the context it needs.
4. **Collaborate:** ask for approval, preserve context, or hand work back when judgment matters.
5. **Learn:** make the outcome and failed attempts legible enough to improve the next run.
Any one of these steps can make an otherwise capable system feel unreliable. An agent can find a product but not know which tool applies. It can complete work but lose the reason for it at a handoff. It can retry a failure without making the next attempt safer. These are product-surface problems as much as they are model problems.
### What AX changes in practice
AX turns vague requests to “make it work with agents” into concrete design work. A team can inspect the workflow in front of it and ask:
- Is the task and its stopping point clear?
- Can the agent distinguish the right path from nearby but different ones?
- Does each capability say what it is for, when not to use it, and what it returns?
- Are constraints, permissions, and important state visible at the moment of choice?
- When something goes wrong, can the agent explain the situation and move to a safe next step?
- Can a person understand what happened, take over when needed, and improve the workflow later?
The answers reveal where to focus: a clearer tool description, better documentation, a narrower workflow, a more useful approval screen, or a recovery path that preserves the work already done.
### AX sits beside UX, DX, and GEO
User Experience focuses on how people use a product. Developer Experience focuses on how people build with it. GEO focuses on making useful information discoverable in AI-mediated search. AX is concerned with the product experience an AI agent has while acting for someone.
These disciplines overlap, but they are not interchangeable. A beautiful human interface can be hard for an agent to navigate. A capable API can still be difficult to select or use correctly. A discoverable page can still lead to an unclear workflow. Good AX connects the journey across those boundaries without removing the person from the loop. The vocabulary around all four moves quickly, so the [AX glossary](/glossary/) keeps a definition and an origin for each term this field guide uses.
### Start with one real workflow
Do not begin by asking how much autonomy a product can support. Begin with a job people actually want to delegate: reconcile an account, research a vendor, prepare a brief, resolve a support issue, or update a record. Give that job a clear start, observable outcome, and a reason to pause or return work to a person.
Then follow the agent’s path through the product. Notice where it cannot find a route, cannot tell two actions apart, lacks context, hits a consequential choice, or cannot recover. The most valuable improvement is usually the smallest change that makes the next attempt more useful and more understandable.
### AX is not a universal score
One number cannot describe every agent, model, product, or task. AX is a practical lens for making delegated work clearer, safer, and easier to improve. It earns its value when a team can point to a real workflow and say what changed for the better.
A checklist is still useful for a different purpose: taking inventory of what a product has actually made explicit. [The Open Agent-Readiness Rubric](/insights/agent-readiness-rubric/) does that, and says plainly that its score describes declared surfaces rather than predicting how any agent will behave.
Start with the workflow people want to delegate, then make the product around it easier to use well.
## A framework is a place to put what you find.
> A named, practical framework for Agent Experience work with AI agents: a five-part field map (orient, discover, act, collaborate, learn), a four-step method for applying it, and a rubric for taking inventory of what a product has declared.
Published: 2026-09-02
Updated: 2026-09-02
Canonical: https://agentexperience.tech/insights/agent-experience-framework/
Tags: agent experience, foundations, framework, method, evaluation
AX work goes wrong in a predictable way: a team collects observations about an agent failing, and has nowhere to put them. A framework is the shelf.
**The AX framework on this site is three connected pieces: a five-part [field map](/research/) of where agent work breaks, a four-step [method](/method/) for applying it to one real workflow, and the [Open Agent-Readiness Rubric](/insights/agent-readiness-rubric/) as an inventory of what a product has already declared.** The map says where to look. The method says how to look. The rubric says what is on the record.
This page is a synthesis, not a new proposal. Every component below already exists on this site and has for some time; what has been missing is one page that names them together, says how they connect, and says what they do not do.
A note before any of it, because the acronym is crowded: if you arrived here looking for **Ax, the open-source DSPy-style LLM framework for TypeScript**, that is a different thing entirely, and there is a [short section about it below](#is-this-the-ax-framework-on-github).
### What is a framework for, in AX work?
Not prediction. A framework here does one modest thing: it gives a team a shared place to put what they find.
The characteristic failure of early AX work is not that teams observe nothing. It is that they observe plenty — the agent picked the wrong tool, the docs were fine but the agent never reached them, the approval screen was answered without being read — and then have no structure that says which of those is the same kind of problem as which. Findings arrive as anecdotes, get argued about as anecdotes, and are forgotten as anecdotes.
The three components below are chosen for that job. Each answers a different question, and the answers compose:
| Component | The question it answers | What it produces |
|---|---|---|
| **[The field map](/research/)** | Where in the agent's path does this break? | A named part of the system to inspect |
| **[The method](/method/)** | How do we look at it without boiling the ocean? | One workflow, walked end to end |
| **[The rubric](/insights/agent-readiness-rubric/)** | What have we actually declared? | An inventory of inspectable surfaces |
None of the three is a score of how well an agent will do. That distinction matters enough that it gets [its own section](#what-this-framework-does-not-claim).
### What are the five parts of the field map?
The map follows an agent from a person's goal to a next attempt that is better than the last. Five parts, in the order work moves through them:
1. **Orient** — goal, context, and boundaries. Can the agent tell what it is trying to do, what information is trustworthy, and where a capability begins and ends? This is where an under-specified task and an over-broad permission both live.
2. **Discover** — paths, docs, and capabilities. Can the agent find the right page, the right documentation, the right route? [Make documentation legible](/insights/make-documentation-legible/) and [build websites agents can understand](/insights/agent-friendly-websites/) sit here, as does the whole question of which discovery files are worth publishing.
3. **Act** — tools, workflows, and state. Can the agent connect an intention to a capability without guesswork? This is the home of [tool descriptions as product surfaces](/insights/tool-descriptions/) and of catalogues small enough to choose from well.
4. **Collaborate** — handoffs, approval, and recovery. Does the system know when to act, ask, pause, or return control? [Approval as a workflow](/insights/approval-is-a-workflow/), [context preserved through handoffs](/insights/preserve-context-through-handoffs/), and [recovery designed in](/insights/design-for-recovery/) are the three surfaces here.
5. **Learn** — evaluation and product improvement. Can the team see the decisions that shaped a result, not only the result? This is where [evaluating decisions rather than answers](/insights/evaluating-agent-workflows/) and [measuring agent experience](/insights/measure-agent-experience/) belong.
The parts are not a maturity ladder. Nobody graduates from orientation. They are locations, and the useful move is to find the one where your workflow is currently failing and go there.
Two properties of the map are worth stating explicitly, because they are what make it usable rather than decorative.
**It is ordered by dependency, not by importance.** A failure in *orient* will present as a failure in *act* — the agent picks a wrong tool because it never understood the job. Walking the parts in order is a way of catching that: if the first three parts are genuinely clean and the workflow still breaks, the problem is where it appears to be.
**Every part has a design move, not just a diagnosis.** A map that only tells you where you are is a map of a maze. The field-map page pairs each part with the specific product change that addresses it — give surfaces a clear purpose and next step, treat descriptions as decision surfaces, design around the moments where context goes missing, make approval and scope part of the workflow, connect each evaluation to a concrete change.
### How do you apply it to one workflow?
The [method](/method/) is four steps, and its main contribution is what it refuses to do. It does not start with an autonomy target.
1. **Choose a real workflow.** A task people already want to delegate, with a decision in it that needs to improve. Reconcile an account, research a vendor, prepare a brief, resolve a support ticket.
2. **Map the agent-facing surface.** The context, documentation, tools, interfaces, permissions, and handoffs the workflow actually depends on — which is usually a shorter and stranger list than the team expects.
3. **Find the decisive moments.** Selection, execution, recovery, and the points where uncertainty ought to change the path. These are the places where a small change moves the whole run.
4. **Turn the learning into product work.** Leave with a prioritised change, a testable question, and a way to keep learning as the system evolves.
Step four is the one teams skip, and skipping it is how AX work turns into a document nobody reads. The [AX review](/insights/run-an-ax-review/) is the method run as a single scoped exercise, and it takes the same position: a review that ends in a document has not finished; a review that ends in an edited tool description, an added approval step, a narrowed permission, or a new recovery route has.
The method and the map are meant to be used together in a specific way. The method picks the workflow and walks it; the map names what you hit. "The agent kept retrying the export" becomes "this is a *collaborate* failure — recovery is not designed, so retry is the only route" — and now it is filed next to every other recovery finding, and the team can see that it has four of them.
### Where does the rubric fit?
The map and the method are diagnostic. They tell you what is happening. Neither tells you what your product has already put on the record, and that is a separate and much more mechanical question.
[The Open Agent-Readiness Rubric](/insights/agent-readiness-rubric/) is the inventory layer: 36 checks across six dimensions — discovery, structure and semantics, machine-readable content, action safety, recovery, and policy signals — each with a concrete request or inspection that settles it, and a published weight. It can be run by hand with a browser and `curl`.
The rubric answers "what have we declared?" It does not answer "does it work?" A site can score well and still confuse an agent through unclear copy, and a site can score poorly and be perfectly usable by a capable model. The rubric's own framing is that a score describes declared, inspectable surfaces and predicts nothing about agent success — which is exactly why it composes cleanly with the map rather than competing with it. The map finds the break; the rubric tells you whether the relevant surface was ever declared in the first place.
Public readiness tooling exists alongside it and measures different objects. Cloudflare's Agent Readiness score, announced 17 April 2026, checks edge-observable signals — `robots.txt`, `sitemap.xml`, `Link` headers, Markdown content negotiation, bot rules, Content Signals, an MCP server card, an API catalogue — and publishes them through `isitagentready.com` and, from 12 May 2026, the URL Scanner in the Cloudflare dashboard. That is a scan of a live domain. This rubric is a self-assessment you can run against a staging environment. Neither number converts into the other, and there is no version of this page that ranks them.
### Is this the Ax framework on GitHub?
No. This is the collision worth clearing up in plain terms, because "ax framework" as a search string returns at least four unrelated things.
**Ax (`ax-llm/ax`, [axllm.dev](https://axllm.dev/))** is an open-source, Apache-2.0 framework for building LLM applications, built by the developer `@dosco` and described by the project as "the pretty much 'official' DSPy framework for TypeScript". Its central idea is the typed signature: you declare inputs and outputs on one line, and the framework generates the prompt, the parser, the validators, and the retry loop. It is TypeScript-first, ships as `@ax-llm/ax`, and mirrors the same signatures and agents into generated Python, Java, C++, Go and Rust libraries. It is a thing you `npm install`.
The other claimants to the name are further afield still: `attacksurge/ax` is a distributed scanning framework for penetration testers; `ax-framework.com` is a PHP/JavaScript application framework; and there is at least one independently published "AX Framework" for designing trustworthy AI in a UX tradition.
The AX framework on this page is none of those. It is a *design* framework for Agent Experience — a way of organising product decisions about the surfaces an AI agent works through on someone's behalf. There is nothing to install and no code to import. The two AXes are not competitors, and they are not even really in the same category: you could perfectly well build an agent with Ax the library and then use this framework to find out why the documentation it reads is unusable.
If you want the library, the link above is the right one. Nothing further on this site is about it.
The same care applies to the acronym itself. "AX" also means Agent Experience in a contact-centre sense — the experience of the human agent handling a customer — and inside developer-tooling companies it often means the experience a *coding* agent has inside a repository. [AX compared with UX, DX, and GEO](/insights/ax-vs-ux-dx-geo/) works through those meanings without collapsing them.
### What this framework does not claim
Stated plainly, so it does not have to be inferred:
- **It is not a standard.** No standards body is behind any of it. The map, the method and the rubric are this site's judgement calls, published so they can be argued with.
- **It is not a benchmark.** Nothing here produces a number comparable to anyone else's number, and the rubric says so about its own score.
- **It does not predict agent success.** Every component describes surfaces, decisions, and declarations. None of them models what a given model will do on a given day.
- **It is not exhaustive.** Five parts is a working decomposition, not a proof that agent work has exactly five parts. Where a finding does not fit, the honest move is to record that it does not fit.
What it does claim is narrower and more useful: that a team walking one workflow through five named parts, with a method that ends in a product change and a rubric that inventories what has been declared, will end up with findings that accumulate instead of scattering.
### Where to start
If you have never done this before, do the smallest version. Pick one workflow. Walk [the map](/research/) until you hit the part that visibly breaks. Stop there, make one change, and see whether the next run is better. Then run [the rubric](/insights/agent-readiness-rubric/) once, at leisure, to find out what you never declared.
If you want the whole thing as a single scoped exercise, [run an AX review](/insights/run-an-ax-review/) — that page is the method with the edges filled in.
### Frequently asked questions
**What is the AX framework?**
Three connected pieces: a five-part field map of where agent work breaks — orient, discover, act, collaborate, learn — a four-step method for applying it to one real workflow, and the Open Agent-Readiness Rubric as an inventory of what a product has actually declared. The map says where to look, the method says how to look, and the rubric says what is already on the record.
**Is this the Ax framework on GitHub?**
No. Ax (`ax-llm/ax`, axllm.dev) is an unrelated open-source project — an Apache-2.0 DSPy-style framework for building LLM applications from typed signatures, TypeScript-first, built by `@dosco`. It is software you install. The AX framework described here is a design framework for Agent Experience, with nothing to install. The letters collide; the subjects do not.
**How is an AX framework different from an agent framework?**
An agent framework is code that builds an agent — orchestration, tool calling, retries, state. An AX framework is a lens on the product the agent has to work through: the documentation it reads, the tool descriptions it chooses from, the approval it hits, the recovery route it needs. You can build an excellent agent on a good agent framework and still ship poor Agent Experience, because those failures live in surfaces the agent framework does not own.
**Where should a team start?**
With one workflow people already want to delegate, not with the whole map. Walk the five parts in order until you reach the one that visibly breaks, and stop there. The point is to leave with one product change, not with a completed matrix.
A framework is not a promise about outcomes. It is a shared place to put what you learn, so the next person can find it.
---
# Discovery and documentation
## Build websites agents can understand.
> A practical guide to building an agent-friendly website: semantic structure, stable journeys, crawler policy, and the content AI agents need to finish a task.
Published: 2026-08-25
Updated: 2026-09-01
Canonical: https://agentexperience.tech/insights/agent-friendly-websites/
Tags: discovery, websites, accessibility, semantic html, crawlers
A website is no longer only a visual experience. It is also a system of signals an agent may use to find information and complete a task.
**In short.** An agent-friendly website is a crawlable, server-rendered, semantically honest version of the site people already need. Agents encounter your pages through HTML and the accessibility tree, not through the visual composition, so real links, real buttons, labelled fields, and descriptive headings are the foundation. Put the decision-critical facts — eligibility, price, requirements, what happens next — in the page text rather than in visual convention. Keep important actions stable across visits. Make your crawler policy a deliberate choice rather than an accident. Then review one real journey end to end through the structure, not just the screenshot.
Agents may encounter a site through a rendered screen, its HTML, or the accessibility tree that describes the page’s meaningful controls and content. When those views disagree, a task that looks simple to a person can become fragile for an agent. Google’s practitioner guidance on web.dev covers the accessibility tree and agent-facing site UX for exactly this reason: it is the structured representation that assistive technology, and increasingly agents, rely on.
This guide is the starting point for that work. It covers what agents actually read, the structural choices that matter, what belongs in the page text, how to set a crawler policy, where `llms.txt` fits, and how to review a journey without buying a tool.
### What does an AI agent actually see on your website?
An agent working on someone’s behalf reaches your site in one of three modes, and each mode reads something different.
A **retrieval agent** or answer engine reads your indexed text. Google Search Central documents that its generative AI features are rooted in core Search ranking and quality systems, using retrieval-augmented generation and query fan-out to gather supporting pages. Its “AI Features and Your Website” guidance (2026) states there are no additional requirements to appear in AI Overviews or AI Mode beyond foundational SEO, and that a page must already be indexed and eligible to show a snippet. Microsoft’s Copilot Studio documentation similarly describes web search over Bing-indexed public websites, with citations returned by URL. If a page is not retrievable, nothing downstream matters.
A **browser agent** reads the DOM and the accessibility tree, and sometimes a screenshot. It needs to identify what is interactive, what each control does, and what state the page is in. A `
` with a click handler is invisible to that reasoning in a way a `
` is not.
A **task agent with tools** may skip your pages entirely and use an API, an MCP server, or documentation. That path is covered in [Make documentation legible to agents](/insights/make-documentation-legible/) and [Tool descriptions are product surfaces](/insights/tool-descriptions/). The website still matters, because it is often where the agent orients before it acts.
A practical consequence follows, offered as reasoning rather than a finding: design for the least-privileged reader. A page that works for a text-only retrieval pass usually works for the other two.
### Use real structure for real actions
Links should be links. Buttons should be buttons. Form fields should have clear labels. Headings should describe the content beneath them. These choices make a site more accessible to people and give an agent a clearer map of what is interactive and why it matters.
A short checklist that covers most of the ground:
- **Navigation is crawlable HTML.** Google’s link best-practice documentation is explicit that links need a resolvable `href` to be followed. A menu built purely from JavaScript event handlers is a dead end.
- **Critical content is server-rendered.** If the answer only exists after a client-side fetch, a retrieval pass may never see it.
- **One ``, then honest heading levels.** Headings are the outline an agent chunks against.
- **Every input has a ``.** Placeholder text is not a label; it disappears at the moment of typing and is unreliable in the accessibility tree.
- **State is announced, not implied.** Disabled, selected, expanded, invalid, and loading states belong in ARIA attributes or native elements, not only in colour.
- **No ghost overlays or fake controls.** Invisible layers that intercept clicks, and elements styled as buttons that are not, are among the most common ways an agent gets stuck on a page a person finds trivial.
None of this is exotic. It is the accessibility baseline, applied with the knowledge that a second class of reader now depends on it.
### Keep the journey stable
Important actions should not move unpredictably, hide behind invisible layers, or depend on hover-only behavior. A stable page helps an agent connect an instruction, a visible control, and the outcome that follows.
Instability is the failure mode that costs the most and shows up the least in analytics. A person who meets an unexpected interstitial adapts in half a second. An agent may retry, take a wrong branch, or abandon the task — and if your product hides that history, you will read the eventual success as a clean run. That is the argument in [Retries are product history, not a clean slate](/insights/retries-are-product-history/).
Concretely, stability means: consistent URLs for the same resource, actions that stay in the same region of the page across sessions, no randomised A/B variants on the critical path of a delegated task, and modals that can be reached and dismissed through the DOM rather than only by pointer gesture.
### Make essential information available in the page
Put the decision-critical details close to the action: what the visitor can do, who it is for, what is required, and what happens next. An agent cannot rely on the same background assumptions as a returning human user.
A returning customer knows your shipping cut-off, knows the plan they are on, and knows that “Contact sales” means something different from “Start free”. An agent knows none of that. It knows what the page says.
So write the constraint down. Not “Fast delivery” but “Orders placed before 16:00 GMT ship the same working day.” Not “Flexible pricing” but “Billed monthly; cancel any time; no refunds for the current period.” Not a bare “Submit” but a button whose label and adjacent text say what submitting does.
Research on how answer engines cite pages is still young, and it is worth reading with caution rather than as a recipe. A 2026 critical survey of the generative-engine-optimisation literature by Martinez concludes that terminology and metrics remain heterogeneous across studies, and that generic on-page heuristics transfer poorly across engines and dates. Treat any published list of “signals” — including the suggestions in this guide — as a direction to check against your own pages rather than a rule to apply.
What survives that caution is unglamorous and durable. Writing that states definitions, numbers, comparisons, and procedures plainly is easier to quote accurately than atmosphere is. That is a good reason to write them clearly, and a bad reason to stuff a page with statistics it does not need.
### Decide your crawler policy on purpose
Most sites inherit a crawler policy by accident. Make it a decision.
Different crawlers exist for different purposes, and the vendors document them. OpenAI’s publisher and developer FAQ (2026) states that any public website can appear in ChatGPT search, and recommends not blocking `OAI-SearchBot` if you want summaries and snippets included; OpenAI documents `GPTBot` and `ChatGPT-User` separately, for training and user-triggered fetches respectively. Google documents its own crawler controls in Search Central. Write down which purposes you allow, then encode it.
The file below is an illustration of what a written-down decision looks like, not a recommended configuration. The `Disallow` line is there to show a deliberate carve-out being made explicit; copy the shape, not the choice.
```
# robots.txt — allow search and answer surfaces, decide training separately
User-agent: *
Allow: /
User-agent: OAI-SearchBot
Allow: /
User-agent: GPTBot
Disallow: /internal/
Sitemap: https://example.com/sitemap-index.xml
```
Two rules keep this honest. First, `robots.txt` is a request, not an access control; anything that must not be read needs authentication. Second, publish the reasoning somewhere a human can find it. A policy nobody can explain gets reverted by the next person who touches the file.
### Where does llms.txt fit?
`llms.txt` is a public convention proposed at llmstxt.org — the v2 page was published in 2024 and carries a 2026-08-10 modification date — for giving agents a concise, linked index of a site’s most useful documentation. It is a proposal and community convention, not a standards-body specification, and Google’s guidance is clear that no special AI file is required for its Search features.
That makes it a reasonable low-cost addition and a poor primary strategy. A useful `llms.txt` is thin:
```
# Example Docs
> One-sentence description of what this product does.
## Start here
- [Quickstart](https://example.com/docs/quickstart/): Install, authenticate, first call.
- [Authentication](https://example.com/docs/auth/): Token types, scopes, expiry.
## Reference
- [API reference](https://example.com/docs/api/): All endpoints and schemas.
```
Keep it an index into richer documentation, not a second source of truth about behaviour. A stale `llms.txt` is worse than none, because it invites an agent to trust it.
The same caution applies to structured data. Google’s structured-data policies require markup to match the visible content of the page; markup that describes things a reader cannot see is a spam risk, not an optimisation.
### Review the useful path
Choose one important journey—finding a product detail, completing a form, requesting help, or comparing options—and inspect it through the page structure as well as the visual experience. The gaps are often practical and fixable.
A repeatable half-day version of that review:
1. **Name the job and its success condition.** “Find the enterprise SSO requirements and request a trial” is a job. “Improve AX” is not.
2. **Fetch each page with JavaScript disabled.** Note every fact that vanishes.
3. **Walk the accessibility tree** for the pages carrying the action. Note every control that has no accessible name, and every state that is only visual.
4. **Read the page as a stranger.** List every fact required to make the decision that is not written on the page.
5. **Run the journey with a browser agent** and record where it hesitates, backtracks, or asks a question.
6. **Fix the smallest thing** that removes the biggest hesitation, then repeat.
That loop is the website-shaped instance of the wider method in [Run an Agent Experience review](/insights/run-an-ax-review/). If the failures you find are about which action to take rather than how to take it, the next move is usually [Start with workflows, not autonomy](/insights/start-with-workflows/), and the discipline boundaries are set out in [AX, UX, DX, and GEO](/insights/ax-vs-ux-dx-geo/).
### What agent-friendly does not mean
It does not mean building a separate machine-only site. Two versions of the truth drift apart, and the machine copy is always the one nobody checks.
It does not mean stripping the design. Nothing in this guide argues against visual craft; it argues that the visual layer should sit on top of an honest structural layer rather than replace it.
It does not mean chasing a score. There is no stable, cross-engine number that certifies a site as agent-ready, and the current research literature does not support one. The defensible claim is narrower and more useful: this journey now works, through the structure, for a reader who cannot see.
### Frequently asked questions
**What makes a website agent-friendly?**
An agent-friendly website is crawlable, server-rendered where it matters, semantically marked up, stable across visits, and explicit about the facts a visitor needs before acting. Agents read the HTML and the accessibility tree, not the visual impression, so real links, real buttons, labelled inputs, and honest headings do most of the work.
**Do I need an llms.txt file for AI agents to use my site?**
No. `llms.txt` is a public proposal hosted at llmstxt.org, not a standards-track specification, and Google’s Search Central documentation says no special file is required to appear in its AI features. Treat it as an optional index into your documentation and fix crawlability, semantics, and content quality first.
**Should I block AI crawlers in robots.txt?**
That is a policy decision, not a default. OpenAI’s publisher documentation says any public website can appear in ChatGPT search and recommends not blocking `OAI-SearchBot` if you want your pages summarised there. Decide per crawler and per purpose, write the decision down, and make `robots.txt` reflect it deliberately.
**Is building for agents different from accessibility work?**
They overlap heavily but they are not the same. Both depend on the accessibility tree and semantic structure, so accessibility work usually improves agent legibility for free. Agent Experience adds concerns accessibility does not cover: whether the page states the constraints and consequences an agent needs to choose an action, and whether the journey is stable enough to complete without a person watching.
An agent-friendly website is not a special version of the web. It is a clearer, more stable version of the site people already need.
## Make documentation legible to agents.
> Practical guidance for making product documentation, tool instructions, and workflows easier for AI agents to understand and use.
Published: 2026-08-25
Updated: 2026-08-25
Canonical: https://agentexperience.tech/insights/make-documentation-legible/
Tags: documentation, discovery, tools
Documentation is not only an explanation for a person. It is part of the working context an agent uses to decide what to do next.
An agent needs more than a catalogue of endpoints or features. It needs enough context to choose the right path: what a capability is for, what it needs, what it returns, what can go wrong, and when another route is better.
### Write for the decision
Begin with the job the capability helps complete. Name the situation in which it is useful, the conditions that make it a poor fit, and the outcome a successful use should produce. That is often more useful than mirroring the shape of an internal implementation.
### Keep important context close
Split documentation makes a workflow harder to assemble. Place the constraints, required inputs, related tools, and common failure modes near the action they affect. A person can infer missing connections from experience; an agent may not have the same context.
### Show the route back
A complete guide includes what happens when an input is missing, a request is ambiguous, or a step needs approval. Recovery is not an edge case when an agent is working across real product boundaries.
### Review it as part of the product
When the product changes, revisit the language around it. Old names, stale examples, and overlapping descriptions create the same kind of friction as a broken interface.
The question is simple: does the documentation help an agent make the next decision with less guesswork?
## AX is related to UX, DX, and GEO. It is not a replacement for them.
> AX vs UX vs DX vs GEO, compared side by side: who the user is, what the interface is, how feedback arrives, and what success looks like in each discipline—plus the two competing meanings of Agent Experience.
Published: 2026-08-25
Updated: 2026-09-09
Canonical: https://agentexperience.tech/insights/ax-vs-ux-dx-geo/
Tags: foundations, discovery, definition, ax vs ux, agent experience design
Agent Experience becomes clearer when teams keep neighbouring disciplines connected without collapsing them into one label.
**In short:** UX is about the person using the product. DX is about the person building with it. GEO is about whether useful information can be found in AI-mediated search. AX—Agent Experience—is about the product experience an AI agent has while acting on someone's behalf. They overlap heavily and they are not interchangeable, because each one has a different user, a different interface, and a different definition of success.
### AX vs UX vs DX vs GEO at a glance
| | **UX** | **DX** | **GEO** | **AX** |
|---|---|---|---|---|
| **Who the user is** | A person using the product | A person building with the product | A person or system looking for an answer | An AI agent acting for a person |
| **What the interface is** | Screens, flows, copy, interaction | APIs, SDKs, docs, errors, local tooling | Public pages, structure, and the retrieval layer above them | Entry points, tool and capability descriptions, state, permissions, handoffs |
| **Primary unit of work** | A task in a session | An integration over days or weeks | A query and its answer | A delegated workflow from goal to responsible outcome |
| **How feedback arrives** | Observation, interviews, analytics, support contacts | Issues, support tickets, time-to-first-call, abandoned integrations | Impressions, citations, referrals in answer surfaces | Traces, tool-call logs, retries, approval events, escalations to a person |
| **Typical failure** | The person cannot understand or complete the task | The builder cannot get it working or gets it wrong quietly | The right page exists but is never retrieved | The agent picks the wrong capability, loses context, or cannot recover |
| **What success looks like** | The person understands, decides, and finishes | The builder ships correctly on the first attempt | A substantive answer is found and correctly attributed | The delegated job completes, the person can see what happened, and the next attempt is better |
| **Who is accountable when it breaks** | Product and design | Platform and developer relations | Content and search | Whoever owns the workflow end to end—usually nobody yet |
The final row is the honest one. Most organisations already have a UX owner, a DX owner, and someone responsible for search. Very few have anyone accountable for whether a delegated task actually completes. That gap, more than the vocabulary, is why the label exists.
Agent Experience sits where a person delegates work to an AI system and that system has to move through a real product. It inherits concerns from user experience, developer experience, information architecture, and search visibility. But it has its own practical unit of analysis: the agent’s path from a person’s goal to a useful, responsible outcome.
The distinction matters because products often solve one part of that path well and leave the rest ambiguous. A page can be discoverable yet not explain which action to take. An API can be powerful yet give an agent no reliable basis for selecting the right operation. An agent can complete work yet leave the person unable to see what happened or decide what to do next.
### UX asks how people use the product
User Experience focuses on the person’s understanding, control, accessibility, and confidence while using a product. That remains essential when agents enter the picture. Delegation does not remove the person’s need to understand a consequential action, review an outcome, or take work back.
AX adds a related question: can the agent itself understand the product well enough to support the person’s goal? A clear human interface may still depend on visual convention, implied context, or dense interaction patterns that are hard for an agent to interpret. Good AX makes the underlying task, state, and next decision legible without weakening the human experience.
The relationship is additive rather than competitive. Accessibility work is the clearest precedent: a site built with real headings, labelled controls, and semantic buttons is easier for a screen reader and easier for an agent reading the accessibility tree, for the same underlying reason. Nothing about that work asks you to degrade the visual product. Conversely, a design that hides meaning inside hover states, icon-only controls, or a canvas element is harder for both audiences at once.
Where AX genuinely diverges from UX is in what it can assume. A returning human user carries months of implicit context: they know what the product is for, which button they pressed last time, and what the company is likely to mean by a word. An agent arriving mid-task carries only what the surface tells it. UX can rely on recognition; AX has to rely on statement.
### DX asks how builders work with the product
Developer Experience covers the APIs, tools, documentation, examples, and workflows that help people build with a platform. AX overlaps with all of these surfaces. An agent will often rely on the same reference material and capabilities that a developer does.
The difference is the moment of choice. A developer can browse, ask a teammate, and apply judgment across a long session. An agent needs the product to make purpose, distinctions, inputs, constraints, and outcomes clear enough to choose and operate a capability during a task. The best tool catalog is not merely complete. It helps an agent avoid the wrong action as reliably as it finds the right one.
There is a second difference worth naming: the cost of ambiguity is asymmetric. When documentation is unclear, a developer usually stops and asks. An agent frequently proceeds, because proceeding is what it was asked to do. Ambiguity that produces a delay in DX can produce a wrong action in AX. This is why so much practical AX work concentrates on the description layer—tool names, parameter meanings, "when not to use this" notes, and error text that says what to do next rather than only what went wrong.
The overlap is real enough that some teams treat AX as a subset of DX. That works while the only agents in scope are coding agents inside an engineering org. It stops working the moment the agent is acting for a customer rather than a colleague.
### GEO asks whether useful information can be found
GEO concerns how useful information is discovered in AI-mediated search and answer systems. It starts outside the product: can a person or agent find a clear, substantive answer to a question? Clear structure, direct definitions, and useful pages help make a site easier to understand and retrieve.
AX includes discoverability but goes further. Being found does not guarantee that an agent can complete the work after arrival. A product can be easy to locate and still have ambiguous actions, hidden constraints, missing context, or no recovery path. GEO opens a door; AX helps make the work beyond that door usable.
It is also worth keeping the vocabulary straight here, because the marketing layer around GEO is noisy. GEO ("generative engine optimisation") is the term with the cleanest technical lineage, from the 2024 academic work of the same name. AEO ("answer engine optimisation") is a near-synonym used mostly by practitioners. LLMO is a marketing coinage with no standardised definition. Google's own position is that, from Search's perspective, all of this remains SEO: its generative features are rooted in the same core ranking and quality systems, and it says there are no additional requirements to appear in them ([Google Search Central, "Optimizing your website for generative AI features"](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide), last updated 2026-07-10).
That guidance is useful precisely because it narrows the claim. Discoverability work is worth doing; it is not the same work as making a workflow completable, and no file you add to your web root converts one into the other.
### AX follows the delegated journey
AX connects the concerns across a workflow:
- **Discovery:** Can the agent find a trustworthy route into the task?
- **Context:** Can it understand the goal, relevant state, and boundaries?
- **Action:** Can it choose and use the right capability?
- **Control:** Does it pause, explain, and return work at the right moments?
- **Improvement:** Can the team learn from the path and make the next attempt better?
This is why AX is not a new name for interface polish, APIs, or search visibility. It is a product lens for the full path an agent takes while acting for someone.
### "Agent experience" already means two different things in the AI world
Before comparing AX to anything else, it helps to know that the term is used in two distinct AI senses, by two distinct camps, and that neither camp usually acknowledges the other.
**Sense one: outward-facing product AX.** This is the original coinage. Mathias Biilmann, Netlify's CEO, published "Introducing AX: Why Agent Experience Matters" on 28 January 2025, defining AX as "the holistic experience AI agents will have as the user of a product or platform" ([biilmann.blog](https://biilmann.blog/articles/introducing-ax/), 2025-01-28). In this sense, the agent is an external visitor: it arrives at your site, docs, or API on behalf of somebody who is not on your payroll, and AX is the quality of what it finds. Netlify's own [agent experience page](https://www.netlify.com/agent-experience/) and the community hub at [agentexperience.ax](https://agentexperience.ax/) both work from this definition.
**Sense two: inward-facing coding-agent AX.** In April 2026, the developer-productivity vendor DX launched a product it also calls Agent Experience, which scores individual coding-agent sessions across Claude Code, GitHub Copilot, and Cursor on Requirements, Steering, and Scope ([getdx.com](https://getdx.com/blog/introducing-agent-experience/), 2026-04-10). Here the agent is an internal tool used by your own engineers, and AX is a measure of how well your codebase, documentation, and prompting practices set that tool up to succeed. It is, in effect, a branch of DX.
Both senses are legitimate and both are in active commercial use. They are not the same discipline. The outward sense is a product question—what does a stranger's agent encounter? The inward sense is an engineering-effectiveness question—how well does our own agent perform inside our repository? A team that adopts an "AX programme" without saying which sense it means will end up with an internal tooling metric and an unimproved public product, or the reverse.
The practical rule: say which agent you mean, and whose goal it is serving. If the agent belongs to your customer, you are doing product AX. If the agent belongs to your engineer, you are doing a specialised form of DX. This site uses AX in the first sense throughout.
### And "agent experience" means something else entirely in contact centres
There is a third meaning that predates both AI senses and still holds ground in search results. In customer-service and contact-centre software, agent experience (AX) refers to the quality of a *human* support agent's working life. Genesys defines it as "the quality of an agent's day-to-day work environment, including the tools, processes and support systems that shape how effectively they serve customers" ([genesys.com](https://www.genesys.com/definitions/what-is-agent-experience-ax)). Zendesk and eGain publish comparable explainers.
This is not a stale usage being displaced. It is an established discipline with its own conferences, vendors, and metrics, and the acronym collision is unlikely to resolve soon—partly because contact centres are now among the heaviest deployers of AI agents, which means both senses of "AX" can be live in the same room and the same budget conversation.
The consequence for anyone writing or searching in this space is practical. Spell out **Agent Experience (AX) for AI agents** on first mention. Do not assume a linked article shares your definition. And when a vendor claims to "improve AX", check whether they mean your customers' agents, your engineers' agents, or your staff.
### Agent experience design is the practice, not the score
If AX is the quality of what an agent encounters, agent experience design is the work of shaping it. The phrase is still settling—it appears variously as AX design, AXD, and "designing for agents"—but the practice it names is recognisable enough to describe.
Agent experience design mostly consists of five moves:
1. **Choose the workflow, not the autonomy level.** Design begins with one job a person actually wants to delegate—reconcile an account, prepare a brief, resolve a support case—with a defined start, an observable outcome, and a reason to stop.
2. **Make entry points explicit.** An agent should be able to establish what the product is for, who it is for, and what it can do here, without inference from layout.
3. **Write the capability layer for selection, not just for execution.** Every tool, endpoint, or action needs a statement of purpose, its inputs, its constraints, what it returns, and when *not* to use it. Distinguishing near-neighbour actions is the hardest and highest-value part of the job.
4. **Design the pause.** Consequential and irreversible actions need a moment where the agent stops, explains the situation in terms the person can evaluate, and hands the decision back with enough context to make it quickly.
5. **Design the recovery.** Failure is the normal case. The question is whether a failed attempt leaves behind enough state and explanation for the next attempt—by the agent or by a person—to be better than the last.
Two things agent experience design is *not*. It is not a single readiness score: no one number describes every model, product, and task, and the current crop of scoring frameworks disagree with each other about what to count. And it is not the removal of the human. The best version of this work makes delegated activity more inspectable, not less—more visible state, clearer approval moments, better records of what was attempted and why.
### Use the distinctions to choose the right improvement
When a workflow goes wrong, name the failure before choosing a solution. If a person cannot understand a result, begin with UX. If a platform is difficult to implement against, begin with DX. If no one can find the right information, begin with GEO. If an agent cannot find, interpret, use, recover through, or return work across the product, begin with AX.
In practice, the answer may touch more than one discipline. The value of the distinctions is not to create separate teams or jargon. It is to see the next useful design move clearly.
### A five-question triage
Run these in order on any workflow that is not working. The first "no" tells you which discipline you are actually in.
1. **Could a person find the right route to this task?** No → GEO.
2. **Once there, does the page or endpoint state what it does and who it is for?** No → GEO and AX overlap; fix the statement.
3. **Can a builder integrate it correctly on the first attempt?** No → DX.
4. **Can an agent tell this capability apart from its nearest neighbour, and know when not to use it?** No → AX, at the description layer.
5. **When it fails or hits a consequential choice, can the person see what happened and act?** No → AX and UX together, at the handoff.
Most teams find their answer at step four or five. Those are also the two steps nobody currently owns.
### Frequently asked questions
**Is AX just UX for machines?**
Not quite, and the shorthand causes real mistakes. UX designs for a user who recognises patterns and carries context between sessions. AX designs for a user that must be told, in the surface itself, what a human would infer. The methods overlap; the assumptions do not.
**Is AX replacing UX or DX?**
No. Every consequential delegated action still ends at a person who has to understand and approve it, which is UX work, and agents still consume the same APIs and docs that developers do, which is DX work. AX is a lens across the delegated path, not a successor discipline.
**Who coined "Agent Experience"?**
In the AI sense, Mathias Biilmann, in a post published 28 January 2025. The contact-centre sense of "agent experience" is older and unrelated. There is no standards body that owns either definition.
**Is it "agent experience" or "agentic experience"?**
Both appear in the wild. The originator's framing is "Agent Experience", and that is the more widely used form. Prefer it unless you are quoting a source that says otherwise.
**Does GEO work belong to the AX team?**
Usually not, and it is worth keeping the budgets separate. Discovery work is measured in retrieval and citation; AX work is measured in whether delegated tasks complete. Conflating them tends to produce a lot of published files and no improvement in task completion.
**Where does MCP fit in this picture?**
MCP is one implementation layer beneath AX—a protocol for exposing tools and resources to agent hosts. Adopting it does not by itself constitute good AX, in the same way that having an API does not by itself constitute good DX. The descriptions, constraints, and error text you put inside it are where the experience lives.
The disciplines meet at the person’s goal. AX makes the delegated path to that goal a product concern.
## Does llms.txt actually work?
> A sceptical review of the public evidence on llms.txt as of September 2026: what adoption studies actually measured, which bots fetch the file, what Google and Chrome each say, and whether you should ship one.
Published: 2026-09-01
Updated: 2026-09-01
Canonical: https://agentexperience.tech/insights/state-of-llms-txt/
Tags: discovery, standards, evidence, llms.txt, geo
Two years after the proposal, the public evidence points one way for search visibility and a different way for coding agents. The distinction is the whole story.
**Short answer, September 2026.** There is no public evidence that `llms.txt` improves how often a site is retrieved or cited by AI search systems, and Google states plainly that Google Search ignores the file. There *is* modest evidence that coding agents fetch it. Publish one because it costs an hour and forces you to decide what your twenty most important pages are—not because you expect to be found more often. Anyone selling it as an AI-visibility tactic is ahead of the evidence.
What follows is a review of what the public studies actually measured, where they disagree, and which claims survive contact with their own methodology.
### What llms.txt is, precisely
`llms.txt` is a Markdown file at a site's root that gives an LLM a short description of the site and a curated set of links to its most useful documentation. Jeremy Howard proposed it on 3 September 2024; the current v2 page at [llmstxt.org](https://llmstxt.org/) shows a last-modified date of 10 August 2026. The stated problem is real: web pages are built for people, wrapped in navigation and advertising, and expensive to extract from. The proposed fix is a hand-curated index in a format that costs few tokens to read.
Two things are worth fixing in place before looking at any data. First, it is a **community proposal**, not a standards-track document—there is no working group, no registry, and no conformance requirement. Second, it is a **hint about where to look**, not an instruction about what to do. It grants nothing, blocks nothing, and asserts nothing about permissions. That distinction gets lost regularly in marketing copy that positions `llms.txt` as the "robots.txt of AI".
### Adoption: the numbers disagree by a factor of five
Everyone cites an adoption figure. Almost nobody notes that the published figures are mutually incompatible.
| Study | Published | Sample | Adoption reported |
|---|---|---|---|
| [Casey Burridge, HTTP Archive/CrUX analysis](https://caseyrb.com/blog/state-of-llms-txt-adoption/) | 2026-06-20 | Millions of CrUX-origin sites, 12 months of crawls | 6.28% of top 1,000; **5.61% of top 10,000**; 5.07% of top 1M |
| [SE Ranking](https://seranking.com/blog/llms-txt/) | reported 2025-11-20 | ~300,000 domains | 10.13% |
| [Ahrefs](https://ahrefs.com/blog/llmstxt-study/) | 2026-06-15 | 137,210 domains with traffic in May 2026 | **28%** (38,360 domains) |
| [Originality.AI tracker](https://originality.ai/blog/llms-txt-tracking-study) | 2026-07-03 | 3M+ site tracker | 36,120 instances in May 2026, up from 4,088 in June 2025 |
A five-fold spread is not noise; it is a denominator problem. Ahrefs measured domains in *its own Web Analytics product*—a population of sites that installed an SEO analytics tool, and therefore a population unusually likely to have read an SEO blog post about `llms.txt`. Burridge measured the HTTP Archive's CrUX-based crawl, which is closer to "sites real Chrome users visit". Those are different universes, and the honest reading is that the low-single-digit-to-low-double-digit range is the general-web estimate and the 28% figure describes SEO-tool customers.
The growth trend is more consistent than the level. Burridge's series moves from 1.04% of the top 10,000 in July 2025 to 5.61% in June 2026; Originality's tracker shows roughly an 8.8x rise in absolute instances over a similar window. But a large share of that growth is not decisions—it is platform defaults. Burridge found 78.1% of Shopify sites in the top 10,000 carried the file following an automatic platform rollout, against 8.7% of WordPress sites. When one hosting platform can move the global adoption curve in a quarter, adoption stops being a proxy for belief.
### Consumption: the file is published far more than it is read
Adoption is the easy number. The harder and more decisive question is whether anything fetches the file.
The best public dataset is Ahrefs' server-log study of 137,210 domains, published 15 June 2026. Its headline: **97% of `llms.txt` files received zero requests in May 2026**. Of the 3% that received any traffic, 96% of requests came from bots—and roughly 77% of those bots were not AI tools at all, with SEO audit crawlers among the largest single categories. Named AI user agents were a minority of a minority: GPTBot at 4.51% of AI requests, ClaudeBot at 0.80%, DeepSeek at 0.02%.
There is a widely circulated companion statistic: "over 500 million AI bot visits monitored across a 90-day window; only 408 targeted `llms.txt` directly." It appears in [Limy's 2026 guide](https://limy.ai/blog/llms-txt-in-2026-the-full-guide), attributed to the vendor's own internal monitoring, with no published methodology, no sampling description, no date range, and no external link. It is directionally consistent with the Ahrefs log data, which is presumably why it spreads. But it is a vendor-internal figure that cannot be checked, and it should be cited as such or not cited at all. Treat it as an anecdote that agrees with better evidence, not as evidence.
One result in the Ahrefs data cuts against the general picture and deserves more attention than it got: among AI user agents, **Claude Code—a coding agent—out-fetched the AI *retrieval* bots**. That is a small but genuine signal, and it points at exactly the use case the file was designed for.
### Effect: the one correlational study found nothing
Fetching is not the same as benefit. The most directly relevant attempt to measure effect is SE Ranking's analysis of roughly 300,000 domains, reported by [Search Engine Journal on 20 November 2025](https://www.searchenginejournal.com/llms-txt-shows-no-clear-effect-on-ai-citations-based-on-300k-domains/561542/). It found no significant correlation between the presence of `llms.txt` and how often a domain was cited in responses from major LLMs. In their gradient-boosted model of citation behaviour, *removing* the `llms.txt` variable improved predictive accuracy—the feature was contributing noise rather than signal.
The methodological caveats are the obvious ones and they cut both ways: this is observational, domain-level, correlational, and cannot separate "the file does nothing" from "the file does something too small to detect against the enormous confound of site authority". No published experiment—randomised, controlled, with a holdout—has been done at scale by anyone with the log access to do it properly. So the accurate statement is not "llms.txt has been proven useless for visibility". It is: **after two years, nobody has produced evidence that it helps, and the one large correlational attempt found nothing.** In a field this eager for a tactic, absence of evidence after this much motivated searching is itself informative.
### What the vendors actually say
This is where most write-ups get sloppy, because two arms of Google say things that sound contradictory and are not.
**Google Search says it ignores the file.** Google published its first official generative-AI optimisation guide in May 2026 and added a clarifying subsection on `llms.txt` the following month. The current text of [Optimizing your website for generative AI features on Google Search](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide) (last updated 2026-07-10) states: "You don't need to create new machine readable files, AI text files, markup, or Markdown to appear in Google Search (including its generative AI capabilities), as Google Search itself doesn't use them." And, more pointedly: "It's completely fine if you decide to create and maintain LLMS.txt files (or other similar files) for other services or systems that use these files. Doing so will neither harm nor help your site's visibility or rankings in Google Search, as Google Search ignores them." That is about as unambiguous as platform documentation gets.
**Chrome ships a Lighthouse audit for it.** Chrome's agentic-browsing audit set includes an [llms.txt check](https://developer.chrome.com/docs/lighthouse/agentic-browsing/llms-txt) (docs last updated 2026-05-05). The audit flags server errors when retrieving the file and is marked *Not Applicable* on a 404, because publishing one is "currently optional". Its stated rationale is efficiency, not ranking: "Without this file, agents may spend more time crawling the site to understand its high-level structure and primary content."
These are not in conflict. Search is answering "does this change what we retrieve or rank?"—no. Chrome is answering "does this help an agent orient itself once it is on the site?"—plausibly yes. The conflation of those two questions is the single largest source of confusion in the `llms.txt` discourse, and vendors on both sides of the argument benefit from leaving it conflated.
**Google spokespeople have been consistently dismissive on the search side.** John Mueller has publicly compared it to the keywords meta tag—"AFAIK none of the AI services have said they're using LLMs.TXT… it's comparable to the keywords meta tag"—and separately described it as a "temporary crutch, perhaps to save some tokens" for AI coding tools reading developer documentation, explicitly "not done for search". Gary Illyes is widely reported as saying at Search Central Live in July 2025 that Google does not support `llms.txt` and is not planning to. Both quotes reach us through secondary reporting ([Ahrefs](https://ahrefs.com/blog/what-is-llms-txt/), 2026-06-15, and search-industry press) rather than from an official Google document, so weight them accordingly—but note that Mueller's dismissal and Chrome's audit describe the *same* narrow use case.
**Other model vendors publish it without committing to reading it.** Anthropic, OpenAI, and Perplexity all serve `llms.txt` files for their own developer documentation. None of them, as far as public documentation shows, has committed to fetching or acting on the file in their production crawling or retrieval systems; Anthropic's own crawler-control guidance directs site owners to `robots.txt`. Publishing a file for the benefit of other people's agents is not the same as consuming it, and the two are frequently reported as though they were.
### What proponents claim, and what survives
**"AI search engines use it to understand your site."** Not supported. No major AI search vendor documents consuming it; Google explicitly disclaims it; the log data shows retrieval bots barely fetch it.
**"It improves your citation rate in AI answers."** Not supported. The one large correlational study found no relationship, and its model was more accurate without the variable.
**"It saves tokens and reduces the work of extracting content from HTML."** Supported in principle, and this is the original argument. A curated Markdown index is genuinely cheaper to read than a rendered page tree. The catch is that the saving accrues only to a consumer that actually fetches it.
**"Coding agents use it."** Modestly supported, and the most interesting live claim. Claude Code out-fetching the AI retrieval bots in Ahrefs' data is a real observation from real logs, consistent with Mueller's own characterisation of what the file is for. If you run a documentation site that developers point coding agents at, this is your use case.
**"It's the robots.txt of AI."** Wrong in a way worth correcting. `robots.txt` expresses access preferences and is near-universally supported—Cloudflare's April 2026 scan of 200,000 major domains found 78% publish one. `llms.txt` expresses nothing about permissions and is supported by nobody in particular. If you want to state how your content may be used, that is `robots.txt` and the Content Signals extension, not this file.
### So should you ship one?
Yes, with the right expectations and a small budget.
**Ship it if** you run documentation, a developer platform, a knowledge base, or any site whose content is genuinely worth reading in bulk. The file is a dozen lines. It is trivially reversible. It costs nothing to serve. And the exercise of writing it is the actual benefit: to produce a good `llms.txt` you must decide which twenty pages matter, describe each in one line, and confront the pages you cannot justify. Teams routinely discover their information architecture is worse than they thought at exactly this moment. That is worth an hour regardless of whether a single bot ever fetches the result.
**Do not ship it if** you are expecting it to move visibility, and do not let it be sold to you on that basis. Budget it as documentation hygiene, not as a growth tactic. If a vendor's proposal line-items `llms.txt` under AI visibility with a projected outcome, that is a good moment to ask which study they are relying on.
**Get the boring parts right first.** Nothing in the evidence displaces the ordinary work: be crawlable and indexable, use real semantic structure, put decision-critical information in the page rather than behind interaction, publish dates, and keep `robots.txt` accurate. Those are prerequisites for every retrieval path that demonstrably exists. `llms.txt` is a rounding error on top of them.
**And keep it honest if you keep it.** A stale index is worse than none: it will confidently point an agent at pages you deleted six months ago. If you cannot commit to regenerating it when your docs change, do not publish it. That maintenance obligation, not the file itself, is the real cost.
### What would change this assessment
Three things would move the analysis, and it is worth naming them in advance rather than reacting to the next blog post:
1. **A major retrieval vendor documenting consumption.** Not publishing a file—documenting that their crawler fetches and uses one. That has not happened.
2. **A controlled experiment with holdouts.** Matched sites, randomised assignment, measured citation and referral outcomes over a quarter. Everything published so far is observational or vendor-internal.
3. **Agent frameworks fetching it by default.** The Claude Code signal in the Ahrefs logs is the seed of this. If mainstream agent harnesses started checking `/llms.txt` as a standard orientation step, the file's value would come from the client side rather than from search, and Chrome's rationale would be the one that matters.
Until one of those lands, the position that survives the evidence is narrow and slightly boring: `llms.txt` is a cheap, harmless, occasionally useful documentation index with one demonstrated audience and no demonstrated effect on visibility. Publish it as such.
---
*Sources reviewed for this page were checked on 1 September 2026. Adoption and server-log figures come from third-party studies whose methodologies differ substantially; where studies disagree, both figures are shown rather than reconciled.*
Ship one if your documentation deserves a good index. Do not ship one expecting to be found more often.
## Ten standards. Very different amounts of evidence.
> A maintained, vendor-neutral comparison of the files and protocols that claim to make a website legible to AI agents — what each one is, who is behind it, who actually reads it, and what we recommend.
Published: 2026-09-01
Updated: 2026-09-02
Canonical: https://agentexperience.tech/insights/agent-web-standards/
Tags: standards, discovery, llms.txt, mcp, comparison
Most of the agent-web stack is younger than a year, and the gap between what a standard specifies and what any agent actually reads is the most important thing about it.
**As of September 2026, public documentation identifies consumers for four of these ten standards; for the other six, we found only early, self-reported, or no consumption evidence.** That distinction should drive an adoption decision, and it is the one most coverage of this space omits.
This page is a maintained comparison. It states, for each standard, who is behind it, what its current status actually is, and what public evidence exists that anything reads it. Where the evidence is vendor self-reported or absent, we say so.
*As of 1 September 2026. See the [changelog](#changelog).*
### The matrix
| Standard | What it is | Steward | Status (Sept 2026) | Who demonstrably reads it | Our recommendation |
|---|---|---|---|---|---|
| **[llms.txt](https://llmstxt.org/)** | A Markdown index of a site's documentation, at a site or section root | Jeremy Howard (individual proposal) | v2, published 3 Sep 2024, modified 10 Aug 2026 | No major assistant confirmed. Lighthouse checks for it; Google Search does not use it | Optional. Publish only if you will keep it accurate |
| **llms-full.txt** | A single file concatenating full documentation text | Convention; not in the llmstxt.org spec | Informal | No confirmed consumer | Skip unless a specific partner asks for it |
| **[AGENTS.md](https://agents.md/)** | Durable repository instructions for coding agents; nearest file wins | Open format, multi-vendor | Stable, widely implemented | Coding-agent harnesses across several vendors | **Adopt** if you have a repository agents work in |
| **[agents.txt](https://datatracker.ietf.org/doc/draft-car-agents-txt-wellknown/)** | Proposed capability declaration at a well-known path | Contested — one individual I-D plus several unrelated projects | `draft-car-agents-txt-wellknown-00`, submitted 12 Jun 2026, expires 14 Dec 2026 | Nothing | **Avoid.** The name is not settled |
| **[ARD / ard.json](https://agenticresourcediscovery.org/spec/)** | A manifest inventorying invocable resources on a domain | ards-project (authors at Google, Microsoft, Hugging Face); Apache-2.0 | v0.91, "Proposal", 26 Aug 2026 | Publicly announced discovery services; small publisher evidence | Optional, low cost. Publish if you expose tools or agents |
| **[MCP](https://modelcontextprotocol.io/specification/2026-07-28)** | Protocol for exposing tools, resources and prompts to AI clients | Model Context Protocol project | Spec revision 2026-07-28 | Documented support across widely used agent hosts | **Adopt** if you expose tools |
| **MCP server cards / `.well-known/mcp*`** | HTTP discovery document for an MCP server | MCP project | SEP-2127, open and unmerged as of late Aug 2026; path unsettled | Cloudflare's scanner; early adopters | Wait, or publish knowing the path may move |
| **[WebMCP](https://webmachinelearning.github.io/webmcp/)** | JavaScript API letting a web page offer tools to an agent in the browser | W3C Web Machine Learning Community Group | Draft Community Group Report, 26 Aug 2026; Chrome origin trial | Chrome behind an origin trial; audited by Lighthouse | Experiment only. Not a W3C standard |
| **[A2A](https://github.com/a2aproject/A2A)** | Agent-to-agent protocol, with an agent card at `/.well-known/agent-card.json` | Linux Foundation (donated by Google, 23 Jun 2025) | v1.0.1, released 28 May 2026 | A2A clients and registries | **Adopt** if you expose an agent to other agents |
| **[Content Signals](https://blog.cloudflare.com/content-signals-policy/)** | `Content-Signal:` directives in robots.txt separating search, AI input and AI training | Cloudflare; policy text CC0 | Published 24 Sep 2025 | Honoured by Cloudflare's network; declared by ~4% of top domains | **Adopt** if you have a view on AI use of your content |
Everything below expands a row. Skip to the one you are deciding about.
---
### llms.txt — the most published, least read
**What it is.** A Markdown file listing a site's documentation in a curated, link-annotated form, so an agent can orient without crawling. Version 2 of the proposal, modified 10 August 2026, loosened the format considerably: the file may now live at any path and cover the pages beneath it (`/docs/llms.txt`), Markdown twins may be served at `page.md` or `page.html.md`, and discovery may go through `rel="alternate" type="text/markdown"` or `rel="describedby"`. The v2 text describes itself as "updated based on what I learned from two years of adoption."
**Who is behind it.** Jeremy Howard, as an individual proposal. It is not a standards-body document and has never claimed to be.
**Who reads it — the honest answer.** No major assistant has been shown to. The evidence:
- **Google says you do not need it.** Search Central's optimization guide states plainly that "You don't need to create new machine readable files, AI text files, markup, or Markdown to appear in Google Search", and that creating them will neither harm nor help visibility or rankings ([Optimizing your website for generative AI features on Google Search](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide), announced [15 May 2026](https://developers.google.com/search/blog/2026/05/a-new-resource-for-optimizing)).
- **Google's John Mueller called it a crutch.** On 20 May 2026, asked why Google itself hosts llms.txt files, he wrote: "OF COURSE they can read HTML just fine, so this is imo more of a temporary crutch, perhaps to save some tokens" ([Bluesky, 20 May 2026](https://bsky.app/profile/johnmu.com/post/3mmb6if3g5s2n)). A year earlier: "FWIW no AI system currently uses llms.txt" ([17 June 2025](https://bsky.app/profile/johnmu.com/post/3lrshm4gggs2v)).
- **Google's Gary Illyes compared it to the meta keywords tag.** On 31 July 2025: "it's very easy to draw a parallel between 1990's keywords meta tag and this, and we all know how… useful the keywords meta tag became, very fast" ([Bluesky](https://bsky.app/profile/methode.bsky.social/post/3lv7zva6alk2h)).
- **The measurement.** Ahrefs checked 137,210 domains that received traffic in May 2026: 28% published an `llms.txt`, and **97% of those files received zero traffic that month**; of the requests that did arrive, 96% were bots and 19.5% came from named AI tools ([Ahrefs, 15 June 2026](https://ahrefs.com/blog/llmstxt-study/)). Ahrefs' own caveat applies — its analytics customers skew SEO-aware, so 28% is an upper bound on publication, not a web-wide rate.
- **An earlier, larger, lower number.** SE Ranking checked roughly 300,000 domains and found 10.13% had an `llms.txt` ([SE Ranking, 7 November 2025](https://seranking.com/blog/llms-txt/)). The same study reported that removing the `llms.txt` variable from its model of AI citations *improved* the model's accuracy. Do not blend this with the Ahrefs figure — different populations, ten months apart.
**One widely repeated number to avoid.** The claim that "only 408 of 500 million" crawled pages or sites targeted `llms.txt` is not an Ahrefs finding and is not about sites. It comes from [Limy.ai's own blog](https://limy.ai/blog/llms-txt-in-2026-the-full-guide), which reports monitoring "over 500M AI bot visits across a 90-day window - only 408 targeted llms.txt directly" — vendor telemetry over bot *visits*, self-reported, with no published methodology and no independent replication. If you cite it, attribute it exactly that way.
**The counterweight.** Chrome's Lighthouse added an `llms.txt` audit in its agentic-browsing category ([documentation, last updated 5 May 2026](https://developer.chrome.com/docs/lighthouse/agentic-browsing/llms-txt)). This is regularly reported as Google contradicting itself, which overstates it: the audit **returns Not Applicable on a 404**, because the docs say "providing the file is optional at the moment." A missing `llms.txt` is not a failure in Lighthouse.
**Our recommendation.** Optional. If you publish one, treat it as an index you maintain in the same release as the docs it points at. A stale `llms.txt` costs an agent budget and gives you nothing. Do not build a content strategy on it, and do not let a vendor sell you one.
### llms-full.txt — a convention, not a spec
A single file containing full documentation text rather than links. It is not defined in the llmstxt.org proposal; it emerged from documentation platforms that wanted a one-fetch corpus. We have found no confirmed consumer and no measurement study. It is also the surface most likely to grow past a useful context budget.
**Our recommendation.** Skip it unless a named partner has asked for it. If you do publish one, cap its size and date it.
### AGENTS.md — the one that plainly works
**What it is.** A Markdown file of durable instructions for coding agents working in a repository: build commands, test commands, conventions, hazards. Nearest file wins, so subdirectories can override.
**Who reads it.** Coding-agent harnesses across multiple vendors, as a matter of documented product behaviour rather than aspiration. This is the standard on this page with the least ambiguity about consumption.
**Our recommendation.** Adopt, if agents touch your repository. Keep it short and operational — build, test, lint, conventions, things that will break. It is not a wiki, and length is a cost paid on every task.
### agents.txt — a contested name, not a standard
**What it is, or claims to be.** A well-known file declaring what a site's agents *may do*, positioned against `robots.txt`: as the Internet-Draft puts it, "Where 'robots.txt' expresses prohibition, 'agents.txt' expresses capability."
**Status.** There is a genuine IETF submission — `draft-car-agents-txt-wellknown-00`, "AGENTS.TXT: Capability Declarations for Web Agents", submitted 12 June 2026 by Kayla Cardillo as an independent individual submission, intended status Informational, expiring 14 December 2026. An expiring individual draft with no working group is a registration request, not a standard.
Separately, at least four unrelated projects use the same filename with incompatible formats. One of them renamed itself to `agent-manifest.txt` on the explicit grounds that the `agents.txt` namespace had become crowded. Cloudflare's 22-check readiness scanner does not check for it.
**Our recommendation.** Avoid. Publishing an `agents.txt` today means picking one of several incompatible interpretations, and the ambiguity is the whole problem.
### ARD / ard.json — the newest, with the clearest scope
**What it is.** A manifest at `/.well-known/ard.json` inventorying the invocable resources on a domain — MCP servers, A2A agents, APIs — with each entry pointing at that resource's real description. The spec calls itself an envelope, not an execution mechanism.
**Who is behind it.** Three named authors, at Google, Microsoft and Hugging Face, with a wider acknowledgements list including GitHub, Cisco, Databricks, Nvidia, Salesforce, Snowflake and Amazon. Announced 17 June 2026. Apache-2.0. No W3C, IETF or foundation stewardship yet.
**Status.** v0.91, marked "Proposal", dated 26 August 2026. There is no 1.0. The path changed: `/.well-known/ai-catalog.json` is designated the predecessor, and consumers MUST fetch `ard.json` while they MAY also consult the old path.
**Who reads it.** The project and adjacent vendors publicly announce discovery services, but we have not found independent usage telemetry for them. Publisher-side adoption is very small: an independent probe by API Evangelist dated 31 July 2026 found manifests from 9 distinct publishers across 37,751 reachable domains, none fully conformant.
**Our recommendation.** Cheap and coherent. Publish it if you expose tools, agents or an API — it is the only standard here that inventories *invocable* resources from your own domain. Do not expect discovery traffic from it in 2026. Full walkthrough: [Agentic Resource Discovery: a practical implementation guide](/insights/agentic-resource-discovery/).
### MCP — the settled layer
**What it is.** A protocol standardising how AI clients discover and call tools, read resources, and use prompts, with OAuth 2.1 based authorization on HTTP transports. Current specification revision: 2026-07-28.
**Who reads it.** Widely used agent hosts and client SDKs document MCP support. This is established infrastructure rather than a proposal, but support is not the same as proof that every agent host or workflow will use every MCP feature.
**One design note that belongs on this page.** MCP treats tool annotations — `readOnlyHint`, `destructiveHint`, `openWorldHint` — as **untrusted unless the server itself is trusted**. They are selection and UX hints. They are not a security boundary, and enforcement has to live in your service.
**Our recommendation.** Adopt if you expose tools. Keep the tool catalogue small and the descriptions written for a decision, not for an implementation.
### MCP server cards — a real proposal at an unsettled path
**What it is.** An HTTP discovery document describing an MCP server, so a client can find it without out-of-band configuration.
**Status.** A specification enhancement proposal, SEP-2127 ("MCP Server Cards — HTTP Server Discovery"), opened 21 January 2026 and still open and unmerged as of late August 2026. An earlier proposal, SEP-1649, was closed in January 2026.
**The path is genuinely unsettled.** Cloudflare's post describes a card "currently in draft" at `/.well-known/mcp/server-card.json`; `isitagentready.com` serves its own at `/.well-known/mcp.json`; later drafts discuss an endpoint-relative `server-card` plus a site catalogue. Anyone publishing one canonical path today is guessing.
**Who reads it.** Cloudflare's scanner counts it. As of April 2026, MCP server cards and API catalogues together appeared on fewer than 15 sites in Cloudflare's filtered top-200,000 dataset.
**Our recommendation.** Wait, or publish knowing you will move it. If you want your MCP server found today, an ARD entry pointing at it is the lower-regret option. That is what this site does: its read-only MCP server is listed in [its own ARD manifest](/.well-known/ard.json), with no server card at any path.
### WebMCP — the interesting one, behind a flag
**What it is.** A JavaScript API that lets a web page register tools an in-browser agent can call, so an agent can invoke a page's own functions instead of simulating clicks. Abstract, verbatim: "The WebMCP API enables web applications to provide JavaScript-based tools to AI agents."
**Who is behind it.** The W3C **Web Machine Learning Community Group**, with editors at Microsoft and Google. The status text is explicit and worth quoting to anyone who describes it as a W3C standard: "This specification was published by the Web Machine Learning Community Group. It is not a W3C Standard nor is it on the W3C Standards Track." Latest Draft Community Group Report: 26 August 2026.
**Who reads it.** Chrome, behind an origin trial. Lighthouse's agentic-browsing category audits it — "Registered WebMCP tools", "Forms missing declarative WebMCP", "WebMCP schema validity" — and Chrome's own toolkit post described the category as "informational and unbenchmarked" at publication ([Chrome, 22 June 2026](https://developer.chrome.com/blog/agent-ready-toolkit)).
**Our recommendation.** Experiment, in a branch, if in-browser agents matter to your product. Do not ship it as your only path to an action, and do not let it substitute for semantic HTML — the same Lighthouse category audits accessibility for agents for a reason.
### A2A — stewarded, versioned, boring in the good way
**What it is.** A protocol for agents to discover and delegate to one another, with a capability document published at `/.well-known/agent-card.json`.
**Who is behind it.** Donated by Google to the **Linux Foundation** on 23 June 2025 as the Agent2Agent Protocol Project. Current release v1.0.1, 28 May 2026, following v1.0.0 on 12 March 2026.
**One correction.** Some guides still show `/.well-known/agent.json`. That is pre-v0.3 naming. The current path is `/.well-known/agent-card.json`, and the spec includes an IANA well-known URI registration template.
**Our recommendation.** Adopt if you expose an agent that other agents should be able to find and call. Of everything on this page, A2A has the most conventional governance story: a neutral steward, semantic versioning, and dated releases.
### Content Signals — policy, with real deployment
**What it is.** A vocabulary for robots.txt that separates three uses which a single `Disallow` collapses into one. From Cloudflare's own description: "whether your content can be used for AI training (`ai-train`), whether it can be used as AI input for inference and grounding (`ai-input`), and whether it should appear in search results (`search`)". In practice:
```
User-agent: *
Content-Signal: ai-train=no, search=yes, ai-input=yes
```
**Who is behind it.** Cloudflare, published 24 September 2025, with the policy text released CC0.
**Who reads it.** It is honoured within Cloudflare's own network and included in Cloudflare's managed robots.txt defaults. As of April 2026, 4% of domains in Cloudflare's filtered top-200,000 scan had declared AI usage preferences in robots.txt. Whether any given crawler honours it remains a matter of that operator's policy, not of enforcement — this is a preference expression, like robots.txt has always been.
**Our recommendation.** Adopt if you have a view. It costs one line, it is CC0, and it lets you say yes to search and answers while saying no to training — which is what most publishers actually want and cannot express with a `Disallow`.
### What should we actually do in September 2026?
A short ordering, with no outcome claims attached.
1. **Fix the boring layer first.** A correct `robots.txt`, a real `sitemap.xml`, dates on pages, semantic HTML. Every study cited above still points back here, and Google's guidance is explicit that no new file replaces it.
2. **Adopt what has readers.** `AGENTS.md` for repositories, MCP for tools, A2A for agents, Content Signals for policy.
3. **Publish the cheap manifests, correctly maintained.** ARD if you have anything invocable. `llms.txt` only if you will keep it accurate.
4. **Experiment behind a flag.** WebMCP, MCP server cards.
5. **Skip the contested name.** `agents.txt`.
6. **Re-read this page in a quarter.** Four of the ten entries above changed version, path, or status within the last six months.
### Changelog
- **2026-09-01 — first published.** Ten standards. Status checked against primary sources on this date: llmstxt.org v2 (modified 2026-08-10), ARD v0.91 (2026-08-26), MCP 2026-07-28, A2A v1.0.1 (2026-05-28), WebMCP CG draft (2026-08-26), SEP-2127 open, `draft-car-agents-txt-wellknown-00` expiring 2026-12-14.
Corrections and additions are welcome. Where we have marked something unverified, we would rather be sent the primary source than a summary of it.
### Frequently asked questions
**Does `llms.txt` actually work?**
There is no public evidence that major assistants read it, and the best available study reports that almost none of the files that exist are ever fetched: Ahrefs examined 137,210 domains in June 2026 and found 28% published an `llms.txt` while 97% of those files received no traffic in May 2026. Google's documentation states you do not need such files to appear in Google Search.
**Which standards are worth adopting in 2026?**
`AGENTS.md` if you have a repository coding agents work in, MCP if you expose tools, A2A if you expose an agent to other agents, and Content Signals if you have a view on how your content may be used. These have identifiable consumers. The rest are cheap experiments with thin or no evidence of readership.
**Is `agents.txt` a real standard?**
No. At least four unrelated projects claim the name, and the one IETF submission is an individual Internet-Draft with no working group, expiring in December 2026. No browser, search engine, or agent vendor has adopted it.
**Why does Chrome's Lighthouse check for `llms.txt` if Google says it does not use it?**
Because they are different systems answering different questions. Lighthouse audits a page against emerging conventions; Google Search states its own ranking does not require the file. The Lighthouse audit also returns Not Applicable rather than a failure when the file is missing, which is a weaker position than the coverage suggests.
**How is this page maintained?**
It carries a dated changelog and is reviewed when a listed specification changes version, changes steward, or publishes new adoption evidence. Every status claim is dated so you can judge how stale it has become.
Publish the ones with readers. Publish the cheap ones with plausible readers. Do not confuse either with a strategy.
## Publish one file that tells agents what you offer.
> How the Agentic Resource Discovery specification works, why ai-catalog.json has been superseded by /.well-known/ard.json, and a worked example for publishing a manifest on a docs or content site.
Published: 2026-09-01
Updated: 2026-09-02
Canonical: https://agentexperience.tech/insights/agentic-resource-discovery/
Tags: discovery, standards, ard, well-known, mcp
Agentic Resource Discovery is an envelope, not an execution protocol. It tells an agent that a resource exists and where to fetch its real description.
**Agentic Resource Discovery (ARD) is a way to publish, on your own domain, a machine-readable list of the agents, tools and servers you offer.** An agent fetches one file, reads the entries, and follows each entry's URL to the resource's real description — an MCP server card, an A2A agent card, an OpenAPI document. The specification calls itself an envelope, not an execution mechanism.
Three facts to get right before you build anything:
1. **The path changed.** ARD v0.91, dated 26 August 2026, specifies `/.well-known/ard.json`. `/.well-known/ai-catalog.json` is named in the spec as the *predecessor* path. Nearly every explainer published between June and August 2026 describes the old path.
2. **It is a proposal, not a ratified standard.** The spec header reads "Status: Proposal". There is no v1.0, and no W3C, IETF or foundation stewardship as of this writing.
3. **Adoption is negligible so far.** See [the adoption section](#what-is-the-real-adoption-picture) below for the one public measurement we could find.
*Reviewed 1 September 2026 against ARD v0.91 in [`github.com/ards-project/ard-spec`](https://github.com/ards-project/ard-spec).*
### What is Agentic Resource Discovery?
ARD is an open specification for resource discovery, announced on 17 June 2026 in coordinated posts from Google, Microsoft, Hugging Face, Snowflake and Cisco. The spec names three authors: Junjie Bu (Google), R.V. Guha (Microsoft) and Shaun Smith (Hugging Face). A longer list of companies — GitHub, Cisco, Databricks, GoDaddy, Nvidia, Salesforce, Snowflake, Amazon among them — appears under Acknowledgements and on the project's logo wall, as contributors rather than co-authors.
- Announcement: [Google Developers Blog, "Announcing the Agentic Resource Discovery specification", 17 June 2026](https://developers.googleblog.com/announcing-the-agentic-resource-discovery-specification/)
- Announcement: [Microsoft, "Introducing the Agentic Resource Discovery specification", 17 June 2026](https://commandline.microsoft.com/agentic-resource-discovery-specification-ard/)
- Announcement: [Hugging Face, "Agentic Resource Discovery: Let agents search for tools, skills, and other agents", 17 June 2026](https://huggingface.co/blog/agentic-resource-discovery-launch)
- Later coverage: [AWS, "Agentic Resource Discovery (ARD): An open specification for agent discovery", 24 August 2026](https://aws.amazon.com/blogs/machine-learning/agentic-resource-discovery-ard-an-open-specification-for-agent-discovery/); [InfoQ, 14 July 2026](https://www.infoq.com/news/2026/07/agentic-resource-discovery-spec/)
- Canonical spec: [agenticresourcediscovery.org/spec/](https://agenticresourcediscovery.org/spec/), rendered from [`ards-project/ard-spec`](https://github.com/ards-project/ard-spec) (Apache-2.0), which the docs site names as the single source of truth.
The problem it addresses is inversion of the registry. Today, if you build an MCP server or an agent, you publish it *into* someone's catalogue — a marketplace, a registry, a directory — once per catalogue. ARD's framing, in the spec's own words, is that a publisher "describes a resource once on its own domain", and existing collections "become ARD discovery services" that crawl those descriptions rather than acting as the place of record.
That is the same architectural move `robots.txt` and `sitemap.xml` made for search: the site owner publishes the assertion, and consumers come and read it.
### Why does the well-known path say ard.json now?
Because the project renamed and decoupled itself. The repository's git history shows it began as "Agent Finder" and was rebranded to Agentic Resource Discovery on 11 June 2026, days before the public launch. Version 0.9 of the spec (28 May 2026) defined a manifest called `ai-catalog.json`; v0.91 (26 August 2026) defines an ARD entry that, per the spec's own Appendix D, "does not derive from any catalog schema; the two evolve independently."
The spec's consumer rule is explicit and worth quoting, because it tells you how long the old path stays useful:
> **Consumer resolution (normative).** A consumer resolving a domain's entries MUST fetch `/.well-known/ard.json`, and MUST honour a `rel="ard"` link. ARD's predecessor specified the path `/.well-known/ai-catalog.json` and the link relation `ai-catalog`; a consumer MAY additionally consult these […] a publisher on the predecessor path SHOULD move to `ard.json`.
So: consumers *must* read the new path and *may* read the old one. If you are starting today, publish `ard.json`. If you published `ai-catalog.json` in June, keep it and add the new path.
One trap for anyone reading older manifests: the v0.9 catalog format carried a top-level `"specVersion": "1.0"`. That string is the *catalog format* version. It is not the ARD specification version, which is 0.91. Do not read it as evidence that ARD has reached 1.0.
### How does ARD relate to llms.txt, AGENTS.md and MCP?
Carefully, and less than the commentary suggests.
**Against MCP, A2A and OpenAPI: it wraps them.** The spec's interoperability document is direct on this — asked whether ARD replaces those protocols, it answers: "**No.** ARD is a **discovery protocol (an envelope)**, not an execution mechanism. It wraps existing execution standards (like MCP, A2A, and OpenAPI) using standard and proposed IANA media types." An ARD entry carries a `type` that is a media type — `application/mcp-server-card+json`, `application/a2a-agent-card+json` — and a `url` pointing at that document. The entry is a pointer with enough metadata to decide whether to follow it.
The spec also flags that those two media types are not yet formally registered: they are described as "de-facto community standards tracking towards formal registration", with the caveat that "the format may change."
**Against A2A's `/.well-known/agent-card.json`: it points at it, not over it.** If you already publish an A2A agent card, an ARD entry references it. The two are complementary; ARD adds the inventory layer that lets a domain declare more than one resource.
**Against `llms.txt` and `AGENTS.md`: the specification does not mention them.** We grepped the spec and docs repositories; `llms.txt` appears once, incidentally, and `AGENTS.md` not at all. Any claim that ARD "supersedes llms.txt" is commentary, not spec text. Functionally they solve different problems: `llms.txt` indexes *documentation* for reading, `AGENTS.md` gives *a coding agent working in a repository* durable local instructions, and ARD inventories *invocable resources*. A site can reasonably publish all three.
| | ARD (`ard.json`) | `llms.txt` | `AGENTS.md` | MCP server card |
|---|---|---|---|---|
| Object | Invocable resources on a domain | Documentation pages | Repository conventions | One tool server |
| Location | `/.well-known/ard.json` | Site root | Repository, nearest file wins | Server-defined URL |
| Read by | ARD discovery services | Retrieval agents, unevenly | Coding-agent harnesses | MCP clients |
| Says | "This exists, fetch it here" | "Read these docs" | "Build and test like this" | "Call these tools like this" |
### How do I publish an ARD manifest?
### Step 1 — Inventory what you actually expose
List the resources on your domain that an agent could invoke or search: an MCP server, an A2A agent, a public API with an OpenAPI document, a search endpoint, a skill bundle. If the answer is "none", ARD has little to offer you yet — publish a sitemap and an accurate documentation index first.
### Step 2 — Write one entry per resource
Four members are required by the spec (§4.2), and one pair is exclusive:
| Term | Requirement | Notes |
|---|---|---|
| `identifier` | MUST | URN of the form `urn:air:::`. Schema pattern: `^urn:air:[a-zA-Z0-9.-]+(:[a-zA-Z0-9._-]+)+$` |
| `displayName` | MUST | Human-readable name |
| `type` | MUST | An IANA media type describing the *target* document |
| `url` **or** `data` | MUST (exactly one) | Point at the description, or inline it |
| `representativeQueries` | SHOULD | The spec says it "SHOULD contain 2–5 examples"; failing this is a conformance **warning**, not an error |
| `capabilities` | MAY | Named capabilities |
| `description`, `tags`, `version`, `updatedAt`, `metadata`, `trustManifest` | Optional | `@context` and `@id` are also available for JSON-LD |
The specification's own example entry, verbatim from §4.4:
```json
{
"identifier": "urn:air:acme.com:server:weather",
"displayName": "Weather Data Node",
"type": "application/mcp-server-card+json",
"url": "https://api.acme.com/mcp/weather.json",
"capabilities": ["WeatherTool", "ForecastTool"],
"description": "Enterprise weather MCP server for live telemetry.",
"representativeQueries": [
"what is the current wind speed in Chicago",
"get the 5-day forecast for Seattle"
]
}
```
`representativeQueries` is the field most people skip and the one that does the most work. A discovery service matching a user's phrasing against your entries has nothing else to match on. Write the questions a person would actually ask, not a keyword list.
### Step 3 — Wrap the entries in a manifest
The manifest schema is deliberately thin. Its description in the repository reads: "The document published at `/.well-known/ard.json`… ARD requires only an `entries` array of ARD entries." `entries` is the only required member, and additional top-level members are permitted and ignored.
Here is a complete worked example for a documentation and content site — a hypothetical `docs.example.com` that publishes an MCP server for searching its own docs, a public API, and a Markdown documentation index.
```json
{
"entries": [
{
"identifier": "urn:air:example.com:mcp:docs-search",
"displayName": "Example Docs Search",
"type": "application/mcp-server-card+json",
"url": "https://docs.example.com/mcp/server-card.json",
"description": "Full-text and semantic search across Example's product documentation, changelog and API reference.",
"capabilities": ["SearchDocs", "GetPage", "ListSections"],
"tags": ["documentation", "search", "mcp-server"],
"representativeQueries": [
"how do I rotate an Example API key",
"what changed in the Example API in August 2026",
"which Example plan includes audit logs"
],
"version": "1.2.0",
"updatedAt": "2026-09-01T00:00:00Z"
},
{
"identifier": "urn:air:example.com:api:public",
"displayName": "Example Public API",
"type": "application/vnd.oai.openapi+json;version=3.1.0",
"url": "https://api.example.com/openapi.json",
"description": "REST API for projects, members and audit events. OAuth 2.1 with delegated scopes; write operations accept an idempotency key.",
"tags": ["api", "openapi", "rest"],
"representativeQueries": [
"create a project in Example",
"list the audit events for an Example workspace"
],
"updatedAt": "2026-08-14T00:00:00Z"
},
{
"identifier": "urn:air:example.com:docs:index",
"displayName": "Example Documentation Index",
"type": "text/markdown",
"url": "https://docs.example.com/llms.txt",
"description": "Curated Markdown index of Example's documentation, for agents that want to read rather than call.",
"tags": ["documentation", "index"],
"representativeQueries": [
"where is the Example getting started guide",
"show me Example's documentation table of contents"
],
"updatedAt": "2026-09-01T00:00:00Z"
}
]
}
```
That third entry is the pattern most content sites will care about: ARD does not require you to have an agent. It lets you point at whatever machine-readable representation you already have, including your documentation index. This site publishes its own manifest at [agentexperience.tech/.well-known/ard.json](/.well-known/ard.json), using both patterns: a first entry for the read-only MCP server it runs at `/api/mcp`, which is the invocable resource ARD was written for, and further entries pointing at the documentation index, the guides and the rubric.
### Step 4 — Serve it correctly
Serve the file at `https://your-domain/.well-known/ard.json` with `Content-Type: application/json`, a `200`, and permissive CORS if you want browser-based agents to read it. Serve it from the apex domain an agent would guess, not only from a subdomain.
### Step 5 — Add a secondary discovery route
The spec lists several mechanisms besides the well-known path (§5.1): in-page JSON-LD markup, an `Agentmap:` directive in `robots.txt`, a ` ` element, and DNS Service Binding records under `_entries._agents.example.com` and `_search._agents.example.com`. The link relation is the cheapest:
```html
```
Note that consumers **must** honour `rel="ard"`, per the same normative paragraph quoted earlier, so this is a real second route rather than decoration.
### Step 6 — Validate, then keep it honest
The specification repository ships a zero-dependency conformance CLI at `conformance/bin/conformance-test`, with modes for manifest validation, publisher resolution and registry validation. Run it in CI.
Then set a reminder to re-check the URLs in your entries every release. The failure mode for a manifest is not invalidity, it is drift: a `url` that 404s, a `version` that is two releases behind, an `updatedAt` from June.
### Optional — the registry side
If you want to *consume* ARD rather than publish it, the spec defines a registry API: `POST /search` is required, `POST /explore` and `GET /agents` are optional, with an OpenAPI 3.1.0 description and a CDDL schema in the repository, and federation modes `auto`, `referrals` and `none`. One line in that section deserves quoting to anyone tempted to build a ranking on top of it: the relevance `score` "reflects semantic relevance only and MUST NOT be interpreted as a trust, compliance, or safety judgment."
### What is the real adoption picture?
Thin, and worth stating plainly rather than glossing.
The only systematic public probe we have found is an independent audit repository, [`api-evangelist/agentic-resource-discovery`](https://github.com/api-evangelist/agentic-resource-discovery), whose adoption file dated **31 July 2026** records probing 43,838 domains, of which 37,751 were reachable, and finding **12 manifest responses across 9 distinct publishers, with zero fully conformant**. That is six weeks after launch, against the older `ai-catalog.json` path. It is one measurement by one party, so treat it as an indication rather than a census — but it is the only number in public, and it is small.
Early publisher examples and reference links can drift quickly, so treat the API Evangelist audit as a dated adoption snapshot rather than as durable implementation guidance. Before citing a live publisher, fetch its current manifest and validate it against the current spec.
**What this means for you.** Publishing an ARD manifest today is a low-cost, low-risk bet on a specification with credible backing and almost no installed base of readers. That is a reasonable bet — the file takes an hour and it is the only standard in this space that inventories *invocable* resources. It is not a reasonable basis for expecting traffic, discovery, or agent usage in the near term, and we would treat any claim that it produces those outcomes as unsupported.
### Should we adopt it?
A short decision guide, with no promises attached.
- **You run an MCP server, an A2A agent, or a public API.** Publish `ard.json`. This is exactly the case the spec was written for, and the manifest is the cheapest way to make the resource findable from your own domain rather than from someone's catalogue.
- **You run a documentation or content site with no invocable surface.** Publish a sitemap, dates, and an accurate Markdown index first. Do not add an ARD manifest merely to claim a path: its scope is invocable resources, not a documentation index.
- **You already publish `ai-catalog.json`.** Add `ard.json`, keep the old file for now, and make them agree.
- **You are writing about ARD.** Check the version header before you cite anything. This spec changed its manifest path and decoupled its schema within ten weeks of launch.
### Frequently asked questions
**What is Agentic Resource Discovery?**
ARD is an open specification for publishing a machine-readable list of the agents, tools, servers and other resources a domain offers, at a well-known URL on that domain. Each entry says what a resource is and where to fetch its real description, rather than describing how to call it.
**Is the file called `ai-catalog.json` or `ard.json`?**
As of ARD v0.91, dated 26 August 2026, the path is `/.well-known/ard.json`. The spec designates `/.well-known/ai-catalog.json` as the predecessor path, says publishers on it should move, and says consumers may still consult it. Guides written between June and August 2026 describe the older path.
**Does ARD replace `llms.txt`, `AGENTS.md` or MCP?**
No. The spec describes ARD as an envelope that wraps execution standards such as MCP, A2A and OpenAPI. It does not discuss `llms.txt` or `AGENTS.md` at all, and those address different problems — a documentation index and repository instructions.
**Is anyone actually reading ARD manifests yet?**
Adoption is very early. The one systematic public probe we found, dated 31 July 2026, reported manifests from 9 distinct publishers across 37,751 reachable domains, none fully conformant. Publish it because it is cheap and correct, not because you expect traffic from it.
**Who governs the specification?**
The project publishes a governance page describing an oversight board and a maintainer group, and the repository names three code owners. There is no W3C, IETF or foundation stewardship as of 1 September 2026; the project's own governance page frames a decision about a neutral host as roughly a year away. The specification is licensed Apache-2.0.
ARD is worth publishing because it is cheap and honest about what it is. It is not worth over-claiming, because almost nobody is reading it yet.
---
# Tools and interfaces
## Tool descriptions are product surfaces.
> How to write tool names, descriptions, and JSON schemas that help an AI agent choose correctly, and why tool text deserves review like any other interface copy.
Published: 2026-08-25
Updated: 2026-09-01
Canonical: https://agentexperience.tech/insights/tool-descriptions/
Tags: tools, documentation, tool selection, json schema
A tool name, its description, and its inputs are part of the experience an agent uses to decide what happens next.
**In short.** A tool name, its description, and its input schema are the interface an agent uses to decide what happens next — which makes them product copy, not code comments. Write what the action is for, when it is the right choice, when it is not, what it needs, and what changes on success. Name the nearest neighbouring tool explicitly. Put constraints in the schema, not only in prose. Treat safety annotations as selection hints and enforce boundaries in the server. Then version and test the descriptions like any other part of the interface.
When an agent has several possible actions, vague language creates a familiar product problem: the right capability is present, but it is hard to recognise. The result can be the wrong tool, unnecessary steps, or a request for information the system already has.
### Why do tool descriptions matter so much?
Because for the agent, the description *is* the tool. It has no colleague to ask, no changelog to skim, and no memory of last quarter’s migration. It has the text in front of it at the moment of choice.
The research literature has converged on treating tool documentation as infrastructure rather than copywriting. Hsieh et al. (2023), in *Tool Documentation Enables Zero-Shot Tool-Usage with Large Language Models*, compare documentation-only prompting against few-shot demonstrations across several tasks and argue that tool documentation deserves first-class treatment in its own right. Gorilla (Patil et al., NeurIPS 2024) pairs API-document retrieval with fine-tuning specifically so models can adapt as documentation changes. Guo et al. (2026) go further and study *rewriting* tool descriptions as an optimisation target for reliable tool use in large candidate sets. And across the tool-use benchmarks, the recurring failure modes are the same short list: wrong-tool selection, malformed parameters, tool bypass, and documentation drift.
Every one of those is a writing problem before it is a modelling problem.
### Describe the decision, not just the endpoint
A useful tool description explains what the action is for, when it is the right choice, what it needs, and what changes when it succeeds. That gives an agent a clearer route than a label that only mirrors an internal API name.
Compare these two definitions of the same capability. Both are invented for illustration and describe no real product.
```json
{
"name": "post_v2_notify",
"description": "Calls the notification service.",
"inputSchema": {
"type": "object",
"properties": {
"uid": { "type": "string" },
"tpl": { "type": "string" },
"ch": { "type": "string" }
},
"required": ["uid", "tpl", "ch"]
}
}
```
```json
{
"name": "send_customer_notification",
"description": "Send a transactional notification to one customer about an order they placed — for example a shipping confirmation or a delivery delay. Use this only for order-related messages the customer expects. Do not use it for marketing, for internal alerts (use notify_team), or for bulk sends (use schedule_campaign). The message is delivered immediately and cannot be recalled.",
"inputSchema": {
"type": "object",
"properties": {
"customer_id": {
"type": "string",
"description": "The customer's stable ID, as returned by find_customer. Not an email address."
},
"template": {
"type": "string",
"enum": ["shipping_confirmation", "delivery_delay", "order_cancelled"],
"description": "Which transactional template to send. Each has a fixed set of required variables."
},
"channel": {
"type": "string",
"enum": ["email", "sms"],
"description": "SMS is only available for customers who have a verified mobile number."
}
},
"required": ["customer_id", "template", "channel"],
"additionalProperties": false
},
"annotations": { "readOnlyHint": false, "destructiveHint": false, "openWorldHint": true }
}
```
The second version costs about ninety extra words and removes most of the reasons an agent would get this wrong. It states the purpose, the exclusions, the neighbours by name, the irreversibility, the identifier format, and the constraint on SMS. Note that `enum` and `additionalProperties: false` are doing work that prose alone cannot: they are machine-checkable. JSON Schema’s 2020-12 meta-schema remains the compatibility anchor for this, and structured-output and function-calling guides across the major platforms are built on it.
A description worth shipping answers six questions:
1. **What does this do**, in task language?
2. **When is it the right choice?**
3. **When is it the wrong choice** — and what should be used instead?
4. **What does it need**, and where does that come from?
5. **What changes** when it succeeds?
6. **What does it return**, in a shape the agent can act on?
### Make boundaries legible
Say when a tool reads information, changes something, reaches an external system, or needs a person to approve the next step. Clear boundaries help teams design better handoffs and make it easier to spot when a workflow needs a safer route.
MCP defines annotations for this — read-only, destructive, and open-world hints — and OpenAI’s plugin and tool documentation describes similar safety metadata that guides selection. Use them. Then remember what they are.
The MCP specification (2026-07-28) states that tool annotations are untrusted unless they come from a trusted server. The practical rule holds across the stack: **the model reasons over metadata; the harness enforces execution.** A tool annotated read-only still needs server-side enforcement. A destructive tool still needs confirmation and guardrails even if the model appears to understand the risk. Mislabelling a hint is worse than omitting it, because auto-approval interfaces may act on it.
So write the boundary twice, deliberately. Once in the description, where it informs the agent’s choice and the approval screen a person will read — see [Human approval is a workflow, not a pop-up](/insights/approval-is-a-workflow/). Once in the server, where it is actually enforced.
### Write the parameters as carefully as the description
Most malformed-call failures come from parameters, not from the tool sentence.
Five habits remove most of them:
- **Name the source of every identifier.** “As returned by `find_customer`” saves an entire round trip of guessing.
- **Use `enum` when the set is closed.** A model cannot invent a value that the schema does not permit.
- **State units, formats, and timezones explicitly.** `amount_minor` (integer, minor units) is unambiguous; `amount` is not.
- **Say what happens when an optional field is omitted.** Defaults are invisible unless documented.
- **Set `additionalProperties: false`** so a hallucinated field fails loudly rather than being silently dropped.
Return values deserve the same care. If the output is a status the agent must branch on, describe the possible statuses. If failure is expressed as a structured error rather than an exception, say so and enumerate the codes — an agent that cannot distinguish “not found” from “not permitted” will retry the wrong thing. That distinction is what makes the difference between a retry and a recovery, as covered in [Retries are product history, not a clean slate](/insights/retries-are-product-history/).
### Keep the catalog intentional
More tools do not automatically create more capability. Start with the tools that matter for the workflow, remove overlap, and make the difference between neighbouring actions easy to understand.
Every tool in the catalog costs context and adds a chance to choose wrong. Selection difficulty tracks the number of plausible-looking neighbours more than the total count — twenty clearly distinct tools are easier to choose between than six that overlap.
Three pruning heuristics:
- **If two tools need a paragraph to distinguish, merge them or rename them.** The paragraph is evidence that the boundary is in your head, not in the product.
- **Remove tools no workflow uses.** A capability kept “in case” is a permanent tax on every decision.
- **Prefer one tool with a clear enum over five near-identical tools.** The schema can carry the distinction more reliably than five descriptions can.
[An agent’s tool catalog needs a pruning strategy](/insights/agent-tool-catalogs/) covers this in depth.
### Version and test the descriptions like code
Tool text drifts. The API changes, the enum grows, the neighbouring tool is renamed, and the description quietly becomes wrong — and a wrong description is more dangerous than a missing one, because it is confidently followed.
Public evaluation infrastructure has had to engineer around exactly this: StableToolBench (ACL 2024 Findings) introduced simulated APIs and caching because real APIs drift constantly, and Wu et al. (ACL 2026 Findings) argue that static toolsets are unrealistic and that continual documentation adaptation is needed as APIs version, deprecate, and reappear.
[Use the MCP tool-description test-case fixture](/resources/mcp-tool-description-test-cases/) to review a complete public example with target intent, nearest tool, valid and schema-invalid inputs, result shape, and a changed retry path. It is a fixture for interface review, not a benchmark or a prediction of tool-use behaviour.
Four practices that make this manageable:
1. **Keep descriptions in version control**, next to the implementation, and review them in the same pull request that changes behaviour.
2. **Keep a regression case for every selection mistake you have fixed.** When an agent once confused two tools, that pair becomes a permanent check. See [Build an evaluation loop that improves the product](/insights/build-a-reliable-agent-evaluation-loop/).
3. **Diff descriptions in review.** A one-word change to a description can change which tool gets chosen; treat it with the seriousness of a behaviour change.
4. **Date the catalog.** Knowing when the descriptions were last verified against the API is worth more than most metadata you could add.
### A one-question review
Before shipping a tool definition, hand it to someone who does not work on your system.
If they would need to already know it to choose correctly, the description is not finished. If they would need to ask which of two tools you meant, the catalog is not finished. If they would choose correctly but could not tell whether the action is reversible, the boundary is not finished.
That check is also the fastest first pass in a broader review — see [Run an Agent Experience review](/insights/run-an-ax-review/).
### Frequently asked questions
**What makes a good tool description for an AI agent?**
A good tool description states what the action is for, when it is the right choice, when it is not, what it needs, and what changes when it succeeds. It uses the language of the task rather than the internal API, and it names its nearest neighbour explicitly so the agent can tell two similar tools apart.
**How long should a tool description be?**
Long enough to make the choice unambiguous and short enough to stay in context alongside every other tool. A common rule of thumb — practitioner guidance rather than a measured figure — is a few sentences for the tool plus one clear sentence per parameter. Descriptions compete for the same context window, so a bloated catalog makes every description less useful.
**Do tool annotations like `readOnlyHint` keep an agent safe?**
No. The MCP specification (2026-07-28) states that tool annotations are untrusted unless they come from a trusted server, and OpenAI’s tool documentation describes them as hints. They improve selection and interface design; the server and harness must still validate schemas, authorise the caller, and enforce side-effect boundaries.
**Should tool descriptions be versioned and tested?**
Yes. Treat them as code: review them in pull requests, diff them, and keep a regression case for each selection mistake you have fixed. Research on evolving tool ecosystems argues that static toolsets are unrealistic and that agents need continual documentation adaptation as APIs version and deprecate (Wu et al., ACL 2026 Findings).
A practical review starts with one question: could a capable new teammate choose this tool correctly from what is written here?
## An agent’s tool catalog needs a pruning strategy.
> Why a smaller, clearer tool catalog can make agent-facing workflows easier to select, understand, and operate.
Published: 2026-08-25
Updated: 2026-08-25
Canonical: https://agentexperience.tech/insights/agent-tool-catalogs/
Tags: tools, tool selection, workflows
Giving an agent every possible capability can make the right one harder to choose.
Product teams often add tools one at a time. Over time, the catalog grows into a collection of near-duplicates, legacy actions, and options that differ only in details hidden behind an internal name. The agent sees the same ambiguity a new teammate would see—only without the benefit of years of organisational context.
### Start with the workflow
List the capabilities a particular task actually needs. Then ask whether each one has a clear role in that path. If two actions seem interchangeable, the difference should be obvious from what is written around them or one should be removed from the moment.
### Prefer clear seams over broad tools
A large tool that does many different things can conceal important choices. Smaller actions can be easier to reason about when their boundaries match a meaningful product decision. The goal is not to maximise the number of tools; it is to make the available choices legible.
### Load detail when it becomes relevant
Not every workflow needs the full catalog at the start. Give the agent the capabilities that are relevant to the task, then introduce deeper options when the workflow reaches the decision they support.
### Test the seam
A catalog decision is easier to review with an explicit near-miss. The [MCP tool-description test-case fixture](/resources/mcp-tool-description-test-cases/) pairs a target task with its nearest tool, valid and schema-invalid inputs, result shape, and recovery path. Use that format to test a documented distinction; it does not certify a catalog or predict how every agent will choose.
### Retire ambiguity
Tool catalogs need the same housekeeping as a product navigation system. Remove expired paths, rename vague actions, and watch for choices that produce the same outcome by different routes.
A smaller catalog is not less capable when it makes the right capability easier to find.
## A good agent dashboard shows the next decision.
> How to design agent-facing dashboards around decisions, status, and meaningful next steps.
Published: 2026-08-25
Updated: 2026-08-25
Canonical: https://agentexperience.tech/insights/show-the-next-decision/
Tags: interfaces, delegated action, reliability
Activity is not insight. A useful interface helps a person understand what needs attention, why it matters, and what they can do next.
Agent systems create a lot of visible activity: tool calls, events, messages, scores, retries, and intermediate outputs. None of that is automatically useful. The interface earns its place when it turns activity into a decision.
### Make status unambiguous
Every piece of work should have a clear state. Is it running, waiting, finished, partially complete, blocked, or ready for review? Use words as well as visual signals. A person should not need to infer whether the system is progressing or whether they are needed.
### Put the exception before the inventory
The default view should surface work that needs attention, not simply list everything in chronological order. A blocked approval, a repeated failure, or a workflow that finished with an important gap is more useful than a long stream of successful events.
### Translate the signal
Raw counts and technical details are essential for investigation, but they are a poor first layer. Lead with a short explanation of the change, its likely consequence, and the available action. Let people go deeper when they need the evidence behind the summary.
### Keep the action proportional
Offer the action that matches the situation: clarify an input, review a proposal, retry one bounded step, compare an earlier attempt, or stop the workflow. A vague “manage” button makes a person reconstruct the system before they can help.
The best operational surface does not make the system look busy. It makes the next responsible decision obvious.
---
# Workflows, trust, and recovery
## Start with workflows, not autonomy.
> A practical way to decide where agentic behavior belongs in a product workflow.
Published: 2026-08-25
Updated: 2026-08-25
Canonical: https://agentexperience.tech/insights/start-with-workflows/
Tags: workflows, strategy, autonomy
The fastest way to make agent work useful is often to begin with a bounded task and learn where judgment, context, or control actually matter.
It is tempting to begin with the most autonomous version of an idea. That usually makes the work harder to understand: the team is changing the product surface, the workflow, the permissions, and the evaluation approach all at once.
### Choose a task with a real boundary
Pick a useful job with a clear starting point, an observable outcome, and a reason to stop or hand work back. The boundary makes it easier to see whether the agent is helping, where it struggles, and what should stay under human control.
### Let the workflow teach you
Run the work through the product as it exists. Notice which context is missing, which choices feel ambiguous, and which actions carry more consequence than they first appear to. Those are product signals, not just model behavior.
### Add autonomy with a reason
Autonomy earns its place when it makes a workflow more useful without making the result harder to understand, correct, or recover from. If a simple, explicit workflow does the job, that is often the better design.
The goal is not to make every product agentic. It is to make the right work easier to delegate.
## Every handoff should preserve the reason for the work.
> Why agent workflows need durable context at every handoff, review, and recovery point.
Published: 2026-08-25
Updated: 2026-08-25
Canonical: https://agentexperience.tech/insights/preserve-context-through-handoffs/
Tags: workflows, delegated action, recovery
When context disappears at a handoff, the next person—or the next agent—has to reconstruct the task before they can make a good decision.
A workflow can technically pass work from one step to another and still feel broken. The usual problem is not transport. It is loss of meaning: the goal, the relevant constraints, the decision already made, and the uncertainty that triggered the handoff disappear behind a new screen or a generic notification.
### Carry the task, not just the output
A handoff should include the original objective, the material that shaped the current result, the choices already taken, and the exact reason a review or next action is needed. An output without its task context forces needless rediscovery.
### Make the parent visible
As someone drills into a tool call, a failed step, or a proposed action, they should still be able to see where it belongs. Keep the workflow name, current state, and relevant boundary in view. Detail is useful only when it remains connected to purpose.
### Turn a pause into a useful question
A good handoff is specific. Instead of “needs review,” say what is uncertain and what choice will move the work forward. The question may be about scope, authority, missing information, or an irreversible consequence. Name that distinction.
### Design for resumption
Work rarely moves in a straight line. Preserve enough state that a paused workflow can resume without repeating prior steps or silently changing course. The saved context should make the next action understandable to a person who was not present at the start.
A handoff is part of the experience, not an interruption to it.
## Human approval is a workflow, not a pop-up.
> How to design meaningful human-in-the-loop approvals for AI agents: name the action and its consequence, offer more than allow or deny, and keep the task resumable.
Published: 2026-08-25
Updated: 2026-09-01
Canonical: https://agentexperience.tech/insights/approval-is-a-workflow/
Tags: delegated action, workflows, recovery, permissions
When an agent reaches a consequential action, a generic confirmation button is rarely enough context for someone to make a good decision.
**In short.** An approval is where a workflow changes hands, and it deserves the same design attention as any other handoff. A useful approval names the action, its scope, and its consequence; shows what information the agent used; offers more than allow or deny; keeps the task resumable afterwards; and records what happened without over-collecting. A confirmation dialog does none of that. Encode which actions require a gate in the system rather than trusting the model to decide, because descriptive metadata is not a security boundary.
Approval is the moment where a workflow changes hands. A person needs to understand what the agent proposes to do, what will change, what information it used, and which choices remain available. The agent needs a clear way to pause, receive a response, and continue without losing the thread.
### Why does the pop-up fail?
A modal that says “The agent wants to run `send_invoice`. Allow / Deny?” fails for four separable reasons.
**It shows a decision without its basis.** The person cannot see which customer, which amount, which source document, or which prior step produced the proposal. They are being asked to underwrite a conclusion whose evidence is hidden.
**It offers the wrong choices.** Real work rarely reduces to yes or no. The correct answer is often “yes, but to a narrower scope”, “not until you check X”, or “no, use the other path”.
**It trains dismissal.** A gate that appears for every action, consequential or not, becomes a keystroke. This is the familiar usability argument about alert and consent fatigue, applied to delegated work; it is design reasoning here rather than a claim from a specific study.
**It costs the workflow its state.** If denying means the agent starts over, people learn to approve rather than pay the restart cost. That is the opposite of the intended effect.
The security guidance makes a compatible point structurally. Explicit user confirmation for tool calls blocks silent escalation, while broad “allow all” permissions reduce prompts and magnify damage. The design goal is not maximum friction; it is friction placed where consequence is.
### Make the decision visible
A useful approval names the action, its scope, and its consequence. It should distinguish a harmless read from an action that changes data, reaches an external system, or commits a customer-facing result.
Five elements make an approval readable:
1. **The action, in the user’s language.** “Email the September invoice to Acme Ltd” — not `POST /v2/invoices/send`.
2. **The exact scope.** Which record, which recipient, which amount, which time window. Specificity is what makes the difference between reviewing and rubber-stamping.
3. **The consequence and its reversibility.** “This sends an email immediately. It cannot be recalled.” A person’s threshold for care is set by this sentence.
4. **The basis.** The two or three inputs the agent used to reach this proposal, with links to them.
5. **The alternatives.** What the agent will do if refused, and what other paths exist.
An approval payload with that shape is easy to specify. The example below is illustrative, and the API it describes is invented:
```json
{
"action": "send_invoice",
"summary": "Email invoice INV-2291 (£4,320.00) to billing@acme.example",
"effect": "external",
"reversible": false,
"scope": { "invoice_id": "INV-2291", "recipient": "billing@acme.example" },
"basis": [
{ "label": "Ledger entry", "ref": "ledger/2026-08/acme" },
{ "label": "Approved quote", "ref": "quotes/Q-1180" }
],
"options": ["approve", "approve_with_changes", "request_info", "reject"],
"expires_at": "2026-09-02T09:00:00Z"
}
```
Note that `effect` and `reversible` are structural fields, not decorations. They determine whether this action needs a gate at all — which is a decision your system should make, not the model.
### Decide what needs a gate — in the system
The most common design error is leaving “is this consequential?” to the agent’s judgment.
Metadata is not enforcement. The Model Context Protocol specification (2026-07-28) is explicit that tool annotations — read-only, destructive, open-world hints — are untrusted unless the server providing them is trusted, and that the client and server must still validate and authorise. Those hints are excellent for selection and for shaping the interface. They are not a boundary. The rule is worth stating plainly: **the model reasons over metadata; the harness enforces execution.**
So classify actions server-side, by effect. The table below is a suggested default treatment rather than a standard or a compliance requirement:
| Effect class | Examples | Default treatment |
| --- | --- | --- |
| Read, contained | Search, fetch a record, summarise | No gate; sample in review |
| Write, internal, reversible | Draft, tag, create a private note | No gate; visible in history |
| Write, internal, irreversible | Delete, overwrite, close | Gate, with an undo window where possible |
| External or customer-visible | Send, publish, pay, provision | Gate, always |
| Scope escalation | New permission, wider access, new system | Gate, with step-up authentication |
That last row has a standards answer. OAuth’s step-up authentication challenge (RFC 9470) exists precisely for the case where an in-progress session’s authentication level is insufficient for what is now being requested, and Rich Authorization Requests (RFC 9396) allow a grant to carry fine-grained `authorization_details` rather than a coarse scope. The broader OAuth 2.0 Security Best Current Practice (RFC 9700) is the baseline. Where a delegated grant is involved, it should answer four questions plainly: who, for which resource, for what scope, and for how long.
There is a further case that deserves an automatic gate: any consequential action taken *after* the agent has ingested untrusted content. Indirect prompt injection is a demonstrated attack (Greshake et al., 2023), a 2026 in-the-wild study documented injections that were hidden across many models and page representations, and design-pattern work by Beurer-Kellner et al. (2025) argues the reliable mitigation is to narrow the consequential actions available once untrusted input has entered. In approval terms: reading a stranger’s document should change what the agent is allowed to do next without asking.
### Give people more than “allow” or “deny”
Real work often needs a third option: revise the request, choose a narrower scope, supply missing information, or send the task back for a different path. These options make the handoff part of the workflow rather than an interruption around it.
Four responses cover most situations:
- **Approve** — proceed as proposed.
- **Approve with changes** — the reviewer edits the scope or the parameters, and the agent proceeds with the edited version. This is the option most systems omit and most reviewers want.
- **Request information** — the reviewer asks a bounded question; the agent answers and re-proposes. The MCP tools specification supports multi-round-trip flows for exactly this shape, where a tool needs more input before it can complete.
- **Reject with a reason** — and the reason is the valuable part. A rejection reason is a product signal about a workflow that proposed the wrong thing.
One further property is worth considering, argued from the design rather than from a source: an expiry. An approval request that sits unanswered for two days can lapse cleanly rather than execute later against stale state.
### Keep the path resumable
After someone responds, the system should know what was approved, what changed, and what still needs to happen. A good approval step avoids forcing either the person or the agent to reconstruct the whole task from scratch.
Resumability requires three things. The agent’s working state must survive the pause — the goal, the steps already completed, the artefacts produced. The reviewer’s decision must be attached to the specific proposal, including any edits they made. And the resumed run must be able to detect that the world moved while it waited: an approval granted against a record that has since changed should re-verify rather than proceed.
This is the same discipline as any handoff between actors. [Every handoff should preserve the reason for the work](/insights/preserve-context-through-handoffs/) covers the general case; approvals are the version where the receiving actor is a person with limited time and no context.
When the answer is “no”, resumability matters just as much. A rejection should leave the agent with a usable next state — a narrower plan, a question to ask, or a clean stop — rather than an abandoned run. That is the recovery argument in [Design for recovery, not perfect runs](/insights/design-for-recovery/).
### Design the record with care
Teams should be able to understand what happened later without exposing more information than the task requires. The aim is practical accountability, not a surveillance trail.
A defensible record answers: what was proposed, on what basis, who decided, what they changed, when, and what happened next. NIST’s AI Risk Management Framework frames trustworthy AI as balancing accountability and transparency with security and privacy in context, rather than maximising any one of them — which is a useful reminder that more logging is not automatically better governance. Provenance work in adjacent fields makes the same trade explicit: too little provenance is useless, and too much leaks internals.
Two practical rules. Redact by default at write time, not at read time, because a log that contains a customer’s payment details is a liability regardless of who can currently see it. And keep the approval record legible to the person who will read it under pressure — usually a support engineer at an awkward hour, not an auditor with a week.
### Approvals are also a measurement surface
A well-designed approval queue tells you where your workflow is weakest. Approvals granted almost every time suggest the gate is not earning its interruption and the action could be scoped smaller and automated. Frequent rejections suggest the agent is proposing the wrong thing, which is a description or context problem upstream. Long response times suggest the request is not readable enough to answer quickly.
Feed those patterns back through [Evaluate decisions, not just answers](/insights/evaluating-agent-workflows/) rather than treating the queue as pure operational overhead.
### Frequently asked questions
**When should an AI agent ask a human for approval?**
When the action is hard to reverse, externally visible, or outside the scope the person originally delegated. Reads, drafts, and searches rarely need a gate. Payments, deletions, outbound messages, published content, and permission escalations do. Encode the rule in the system rather than leaving it to the model’s judgment.
**Why is a confirmation dialog not a real approval?**
Because it usually shows a decision without its context. A person needs to know what will change, what information the agent used, what scope is being granted, and what alternatives exist. A dialog offering only allow or deny converts a design problem into a habit — people click through it, and the gate stops functioning as a control.
**Do tool safety annotations make an approval unnecessary?**
No. The MCP specification (2026-07-28) states that tool annotations such as read-only or destructive hints are untrusted unless they come from a trusted server, and that the client and server must still validate. Annotations help selection and interface design. They are not enforcement.
**How do we keep an approval from blocking the whole workflow?**
Make the pause resumable and the request specific. The MCP tools specification supports multi-round-trip flows for when a tool needs more human input, and OAuth step-up authentication (RFC 9470) exists for tasks that become sensitive partway through. Design the pause so the agent keeps its state and the person answers one bounded question, rather than restarting the task.
A well-designed approval gives people control without turning every useful workflow into a dead end.
## Design for recovery, not perfect runs.
> How recovery paths, uncertainty, and clear handoffs improve agent-facing product workflows.
Published: 2026-08-25
Updated: 2026-08-25
Canonical: https://agentexperience.tech/insights/design-for-recovery/
Tags: recovery, reliability, workflows
Every useful agent-facing workflow needs a safe response to missing context, a failed step, or a moment where the system should stop.
Products often treat recovery as an exception path. For agent-facing work, it is part of the main experience. Agents encounter incomplete information, changing state, conflicting instructions, and actions that need a person’s judgment.
### Name the uncertainty
A system should make it possible to say what is missing or ambiguous. That can mean requesting a specific input, showing the conflicting condition, or explaining why an action cannot proceed. Vague failure language creates more work for the person who must untangle it.
### Make the next safe step clear
Recovery is easiest when the agent has a bounded alternative: try a read-only path, ask a targeted question, use a different capability, or pause for approval. The best next step depends on the consequence of the action, not just whether the previous call returned an error.
### Preserve useful state
When a workflow pauses or fails, retain the context that helps it resume without repeating work. That includes the task’s goal, the information already gathered, and the decision that caused the pause.
### Use failure to improve the surface
Repeated recovery patterns reveal product opportunities. If agents repeatedly need the same clarification or choose the same wrong path, the context, tool language, or interface may need work.
A reliable experience is not one that never pauses. It is one that makes the pause useful.
## Retries are product history, not a clean slate.
> Why hiding an AI agent's retry history creates false confidence, and how to record attempts so a team can tell recovery from clean success.
Published: 2026-08-25
Updated: 2026-09-01
Canonical: https://agentexperience.tech/insights/retries-are-product-history/
Tags: reliability, recovery, evaluation, observability
A workflow that succeeds after several attempts has told you something important. Hiding that history makes the product look more reliable than it is.
**In short.** A workflow that succeeds on the fourth attempt has told you something the fourth attempt alone will not. Keep every attempt in the record, show the latest result first with earlier ones one click away, and label recovery differently from clean success. Group failures by the decision point that broke — selection, input formation, permissions, missing context, or an external dependency — so the pattern becomes a product change rather than a support anecdote.
Retries are normal in agent-facing work. Context changes, an external service is unavailable, a tool input is incomplete, or a step simply takes a wrong turn. The problem is not that retries exist. The problem is treating the last outcome as if it were the whole story.
### Why does hiding retries create false confidence?
Because a last-write-wins record turns a distribution into a single point.
Evaluation practice has already learned this lesson in public. The τ-bench work (Yao et al., ICLR 2025) evaluates reliability with `pass^k` — a task counts as a success only if the agent succeeds on *all* k attempts — precisely because a single lucky run is not evidence of a dependable workflow. Reliability-focused work in 2026 goes further, varying task perturbations and injecting tool and API failures to report a reliability surface rather than one scalar. Meanwhile, benchmark methodology papers keep making the same warning: a score reflects a model plus a harness plus a retry policy plus a step budget, so retries are part of what is being measured whether or not anyone says so.
Your product has a retry policy too. If it is invisible, you are reporting a best-run number to yourself.
There is a second cost, less obvious than the first. If a person cannot see that a task took four attempts, they cannot tell the difference between a system that is working and a system that is being carried by its retry loop. That is a trust problem as much as a metrics problem — and trust in delegated work is built on being able to reconstruct what happened.
### Keep each attempt visible
Show the latest result first, then make earlier attempts easy to find. A person should be able to see what changed, whether the retry was automatic or deliberate, and whether the same problem is recurring. This creates a more honest picture of reliability.
The interface pattern that works is *summary in front, history one click behind*. A result line reads: “Completed — 4 attempts, 1 human intervention.” The detail behind it holds each attempt with what was tried and what came back.
An attempt record needs a handful of fields to be useful. The shape below is illustrative:
```json
{
"attempt": 3,
"at": "2026-08-30T14:22:10Z",
"trigger": "automatic",
"changed_since_previous": "narrowed date range to a single month",
"step": "call_tool:export_ledger",
"failure_class": "external_dependency_timeout",
"outcome": "failed"
}
```
`trigger` and `changed_since_previous` are the two fields most often omitted and most often needed. Without `trigger`, you cannot tell an automatic backoff from a person clicking the button again. Without `changed_since_previous`, you cannot tell a recovery from a repetition.
Apply the same care to the record as to any other trace. Redact at write time, keep only what a support engineer would actually need at an awkward hour, and remember that a fuller log is not automatically better governance — NIST’s AI Risk Management Framework frames trustworthy AI as balancing accountability and transparency against security and privacy in context, not maximising any one of them.
### Distinguish recovery from clean success
When work succeeds only after intervention or repetition, label it accordingly. That does not make the workflow a failure. It identifies an opportunity: improve the context, strengthen a preflight check, refine the tool contract, or create a better route for recovery.
Four outcome labels are usually enough. The names below are a working vocabulary offered here, not an industry standard:
| Label | Meaning | What it suggests |
| --- | --- | --- |
| **Clean** | Succeeded on the first attempt | Nothing to fix here |
| **Self-recovered** | Succeeded after the agent changed something | The first attempt lacked information the product could supply |
| **Assisted** | Succeeded after a person intervened | A missing handoff, boundary, or context surface |
| **Failed** | Did not succeed | Recovery path or stopping condition to design |
The distinction between *self-recovered* and *repeated* is the one worth enforcing in code. A retry that reissues the identical call with identical arguments is unlikely to succeed for a different reason unless the world changed underneath it. Blocking it and asking for a change instead — a narrower scope, a refreshed credential, a different tool — turns a loop into a decision. That is a design recommendation argued from the mechanism, not an established practice.
The standards ecosystem provides the shape for some of these changes. When a tool needs more human input mid-task, the MCP tools specification (2026-07-28) supports multi-round-trip flows rather than a bare failure. When a task becomes sensitive partway through, OAuth step-up authentication (RFC 9470) is the designed answer, and short-lived tokens with rotation reduce the blast radius when one leaks. A retry that refreshes an expired token is a recovery; a retry that hammers an expired token is a bug.
### Look for repeatable failure patterns
One failed attempt can be noise. The same failure across similar tasks is a product signal. Group attempts by the decision point that went wrong—selection, input formation, permissions, missing context, or an external dependency—rather than treating every error as unique.
Those five classes are not arbitrary. They mirror how the tool-use literature decomposes failure: API-Bank (Li et al., EMNLP 2023) scores planning, retrieval, and calling as separate tasks over 73 runnable APIs on the basis that they fail independently, and the recurring failure modes named across the tool-learning literature are wrong-tool selection, malformed parameters, tool bypass, and documentation drift.
Each class points somewhere different:
- **Selection** — the agent chose a neighbouring capability. Fix the wording. See [Tool descriptions are product surfaces](/insights/tool-descriptions/) and [An agent’s tool catalog needs a pruning strategy](/insights/agent-tool-catalogs/).
- **Input formation** — arguments malformed or incomplete. Fix the schema: enums, formats, identifier sources, required fields.
- **Permissions** — blocked, or escalated silently. Fix the boundary and the approval. See [Human approval is a workflow, not a pop-up](/insights/approval-is-a-workflow/).
- **Missing context** — the agent guessed at something the product knew. Fix the page, the documentation, or the handoff. See [Every handoff should preserve the reason for the work](/insights/preserve-context-through-handoffs/).
- **External dependency** — a timeout, a rate limit, a partial response, a changed contract. Fix the backoff, the preflight check, or the fallback path.
Tag at the *first* failing step, not the last. A run that fails at the end because it selected the wrong tool at the start is a selection failure, and filing it under the final error is how the same problem stays open for months.
### Let history guide the next design change
Retry history is most useful when it feeds a small improvement loop. Choose the recurring pattern, change the surface around it, and watch whether the next set of attempts becomes clearer and more stable.
Four numbers make that loop legible without inviting a dashboard nobody reads:
1. **Attempts per completed task**, as a distribution rather than a mean. The tail is the product problem.
2. **Share of completions that were assisted.** This is your true human-in-the-loop cost.
3. **Top failure class at the first failing step.** This is your next piece of work.
4. **Repeat rate for a fixed pattern after you changed it.** This is the only number that tells you whether the change worked.
Then close the loop properly: turn the recurring case into a standing check so a fixed problem cannot quietly return. That is the mechanism described in [Build an evaluation loop that improves the product](/insights/build-a-reliable-agent-evaluation-loop/), and the diagnostic pass that finds these patterns is in [Run an Agent Experience review](/insights/run-an-ax-review/).
### What not to do with retry data
**Do not turn retry count into a target.** Optimising the number directly produces silent swallowing — failures that stop being recorded rather than stop happening.
**Do not treat every retry as a defect.** External services fail; a workflow that recovers from a transient timeout is working as designed. The signal is in the pattern, not the event.
**Do not compare your attempt counts to a public benchmark’s.** Retry policy, step budget, and harness are part of what those numbers measure, and benchmark releases are frequently not comparable even with their own earlier versions.
**Do not keep the history where nobody looks.** A trace store that requires an engineer and a query language is not product history; it is archaeology. The people who need this are the ones deciding what to build next.
### Frequently asked questions
**Should an AI agent’s retries be shown to users?**
Show the outcome first and make the attempts reachable. Most users do not need every attempt in the foreground, but they do need to know whether a result came on the first try or the fourth, whether a person intervened, and whether the same problem is recurring. Hiding attempts entirely makes a product look more reliable than it is.
**How many retries are too many?**
There is no universal number, and a fixed cap is the wrong control on its own. A more useful design rule is that each retry should carry new information — a different input, a refreshed token, a narrower scope. A retry that repeats the same call with the same arguments is unlikely to succeed for a different reason, so it is a reasonable candidate to block.
**What is the difference between a retry and a recovery?**
A retry repeats an attempt. A recovery changes something first: the input, the scope, the credential, the tool, or the path. Recording them identically is what produces false confidence, because a workflow that only succeeds after intervention is a different product from one that succeeds directly.
**How should retries be measured?**
Measure the distribution, not the final state. Public evaluation practice uses `pass^k` — success on all k attempts rather than any one — for exactly this reason (Yao et al., ICLR 2025), and reliability work varies perturbations and injected tool failures rather than reporting a single score. Track attempts per completed task, the share of tasks needing intervention, and the failure class at the first failing step.
Reliability is not the absence of retries. It is the ability to understand and reduce the work they create.
---
# Evaluation and improvement
## Score what an agent can actually see.
> A vendor-neutral, versioned checklist and weighted scoring model for how ready a website or product is for AI agents, across discovery, structure, machine-readable content, action safety, recovery, and policy signals.
Published: 2026-09-01
Updated: 2026-09-02
Canonical: https://agentexperience.tech/insights/agent-readiness-rubric/
Tags: agent readiness, evaluation, discovery, standards, checklist
Agent readiness is not a feeling about a site. It is a set of surfaces that are either declared or not, and the declarations can be checked one at a time.
**Agent readiness is checkable.** Every criterion below resolves to a specific request, a specific piece of markup, or a specific response payload — something you can point at and settle in under a minute. This is version 0.1 of an open rubric: 36 criteria across six dimensions, weighted to a total of 100, published with its weights visible so you can disagree with them in the open.
The rubric is vendor-neutral and deliberately structural. It scores what a site or product **declares**. It does not score how well an agent performs, because that depends on the model, the harness, the task, and the day.
- **Machine-readable version:** [`/agent-readiness-rubric.json`](/agent-readiness-rubric.json) — same criteria as `id`, `dimension`, `criterion`, `check`, `weight`.
- **Version:** 0.1 (draft), 2026-09-01. Licence: CC BY 4.0.
### What the rubric measures, and what it does not
The rubric has six dimensions. They follow the order in which an agent meets a product: it has to find you, parse you, read you, act, fail safely, and know what it is allowed to do.
| # | Dimension | Weight | The question it answers |
|---|---|---|---|
| 1 | Discovery | 20 | Can an agent find what exists here without guessing? |
| 2 | Structure and semantics | 18 | Does the machine-readable structure match what a person sees? |
| 3 | Machine-readable content | 17 | Is the substance available in a form a machine can consume exactly? |
| 4 | Action safety | 18 | Are consequences declared and guardrails enforced by the system, not the prompt? |
| 5 | Recovery | 15 | When something fails, is there a basis for a different second attempt? |
| 6 | Policy signals | 12 | Has the organisation said, machine-readably, what AI systems may do? |
Three things this rubric deliberately does not do. It does not rank vendors or tools. It does not claim that a higher score produces more traffic, more citations, better rankings, or more completed agent tasks — no public dataset we are aware of supports that link, and we will not assert it. And it does not treat the presence of a file as a success; several criteria explicitly test whether the file is *current*, because a stale index is worse than no index.
### How the scoring model works
Each criterion is scored on a three-point scale and multiplied by its weight.
- **0 — absent.** The criterion is not met.
- **0.5 — partial.** Met for part of the surface, or met in a way an agent cannot rely on.
- **1 — met.** Met across the surfaces an agent would reasonably encounter.
`criterion score = value × weight`. The total is the sum; weights add to 100. Report the six dimension subscores alongside the total — a site with everything in Discovery and nothing in Action safety is a different site from one scoring the same total evenly, and the total alone hides that.
**Not applicable.** Mark a criterion N/A only when the surface genuinely does not exist — action-safety criteria on a read-only reference site, for instance. Renormalise the remaining weights to 100 and publish which criteria you excluded.
**Descriptive bands.** These name what an agent can do with the site. They are descriptions, not grades, and they carry no claim about outcomes.
| Score | Band | What it describes |
|---|---|---|
| 0–24 | Unmapped | An agent has little to work with beyond rendered HTML. |
| 25–49 | Readable | Content is findable and parseable; actions and policy are undeclared. |
| 50–74 | Navigable | Discovery, structure, and content are deliberate; action and recovery are partial. |
| 75–100 | Actionable | Agents can find, read, act, fail safely, and be told what is permitted. |
Always publish the assessment date and method with the score. Readiness drifts.
---
### Dimension 1 — Discovery (weight 20)
*Can an agent find the content and capabilities that exist here, without guessing?*
### DIS-01 — A parseable robots.txt exists · weight 3
**Check:** `GET /robots.txt`. Expect `200` and `text/plain`. Confirm it is not an HTML error page served with a 200 status.
**Why it matters:** robots.txt is the oldest and most widely honoured machine-readable statement a site makes. A soft-404 returned as a 200 is worse than a clean 404, because parsers treat the HTML as a rule set and get nonsense.
### DIS-02 — An XML sitemap exists and is referenced from robots.txt · weight 3
**Check:** `GET /sitemap.xml`, or the path named on the `Sitemap:` line. Confirm the line exists in robots.txt and that a sample of listed URLs return 200.
**Why it matters:** a sitemap is the cheapest complete inventory a site can publish, and both crawlers and retrieval agents use it to avoid walking the link graph. It is also the single most commonly missing file on otherwise well-built sites.
### DIS-03 — Directives for AI and agent user-agents are explicit and intentional · weight 3
**Check:** read robots.txt for named AI user-agents — `GPTBot`, `OAI-SearchBot`, `ClaudeBot`, `Google-Extended`, `PerplexityBot` and their peers. Confirm the allow/deny pattern matches what the organisation actually intends.
**Why it matters:** training crawlers and answer-engine fetchers are different user-agents with different consequences, and sites frequently block the second while intending only to block the first. OpenAI's publisher documentation is explicit that `OAI-SearchBot` should not be blocked if you want your pages to be summarised in ChatGPT search ([OpenAI Publishers and Developers FAQ](https://help.openai.com/en/articles/12627856-publishers-and-developers-faq)).
### DIS-04 — A site-level agent index exists and is current · weight 3
**Check:** `GET /llms.txt`, or whichever index the site has chosen. Confirm 200, confirm the listed URLs resolve, and confirm the file was updated in the same release cycle as the content it points at.
**Why it matters:** the value here is a maintained, correct inventory — not the filename. Consumption of `llms.txt` by major assistants is contested, and Ahrefs' June 2026 study of 137,210 domains reported that 97% of the `llms.txt` files it found received no traffic at all in May 2026 ([Ahrefs, 15 June 2026](https://ahrefs.com/blog/llmstxt-study/)). Score this criterion on correctness and maintenance rather than presence — a file listing URLs you deleted six months ago actively wastes an agent's budget. See [the standards matrix](/insights/agent-web-standards/) for the fuller evidence picture.
### DIS-05 — Capabilities are declared in a machine-readable manifest at a well-known path · weight 4
**Check:** look under `/.well-known/` for a capability manifest — an ARD `ard.json`, an A2A agent card, or an MCP server description. Validate it against its published schema and confirm the endpoints it names are live.
**Why it matters:** a content index tells an agent what to read; a capability manifest tells it what it can *do*. This is the rubric's single heaviest criterion because it is the least substitutable: nothing else on a site answers the question "what actions does this product expose to me?"
### DIS-06 — URLs are canonical, stable, and predictable · weight 2
**Check:** confirm `rel=canonical` on templated pages, no session identifiers in URLs, consistent trailing-slash behaviour, and `301` rather than soft redirects on moves.
**Why it matters:** an agent that revisits a URL from an earlier step must land on the same resource. Unstable URLs break multi-step tasks and invalidate every cached plan.
### DIS-07 — Discovery surfaces cross-reference each other · weight 2
**Check:** confirm the sitemap, the agent index, the capability manifest, and the API reference each link to the others.
**Why it matters:** agents arrive at one entry point, not all of them. Cross-links mean any single entry point leads to the rest.
---
### Dimension 2 — Structure and semantics (weight 18)
*Does the page's machine-readable structure match what a person sees?*
### STR-01 — Interactive controls use native semantic elements · weight 4
**Check:** inspect the accessibility tree along the primary task path. Every control that navigates should be a link; every control that acts should be a button; form fields should be real form fields.
**Why it matters:** browser agents read the accessibility tree. A `div` with a click handler has no role, no accessible name, and no keyboard contract — so for that reading, the control is not there. This is also why accessibility work and agent-readiness work overlap so heavily: they consume the same tree. Google's own guidance for developers builds on exactly this point ([web.dev, "Build agent-friendly websites"](https://web.dev/articles/ai-agent-site-ux)).
### STR-02 — Every control has a meaningful accessible name · weight 3
**Check:** enumerate controls on the primary path. Confirm none resolve to an empty name, a bare icon glyph, or a generic label such as "Submit" repeated across different actions.
**Why it matters:** an agent selects an action by its name. Duplicate or empty names force selection by position, which breaks on the next layout change.
### STR-03 — Heading hierarchy describes the content beneath it · weight 2
**Check:** extract the heading outline. Confirm a single `h1`, no levels skipped for styling reasons, and headings that name their section's subject rather than carrying a slogan.
**Why it matters:** heading outlines are the cheapest chunking signal available to a retrieval system, and they are how an agent decides which part of a long page to read.
### STR-04 — Decision-critical content is present without client-side interaction · weight 3
**Check:** fetch the page without JavaScript, or read the initial HTML payload. Confirm pricing, requirements, eligibility, and next steps are present rather than behind a tab, an accordion, or a hydration step.
**Why it matters:** many agents read a fetched document rather than driving a browser. Content that only exists after an interaction does not exist for them.
### STR-05 — Key actions have stable identifiers · weight 2
**Check:** confirm primary controls carry stable `id`s, data attributes, or ARIA labels that survive a design change and a CSS rebuild.
**Why it matters:** agents and their operators cache selectors. Hash-generated class names invalidate every cached path on each deploy.
### STR-06 — Structured data is present and matches visible content · weight 2
**Check:** validate JSON-LD against schema.org and confirm each asserted value appears in the rendered page — dates, prices, and availability especially.
**Why it matters:** structured data that contradicts the page is worse than none, because it hands a machine a confident wrong answer. Google's guidance is explicit that structured data should match the visible content ([Google Search Central, AI features and your website](https://developers.google.com/search/docs/appearance/ai-features)).
### STR-07 — Application state is legible in the document · weight 2
**Check:** after a state-changing interaction, confirm the new state appears in text or in ARIA state attributes, not only in colour, position, or animation.
**Why it matters:** an agent verifies its own work by re-reading the page. State expressed only visually leaves it unable to confirm whether its step succeeded — and an unverifiable step is one it will often repeat.
---
### Dimension 3 — Machine-readable content (weight 17)
*Is the substance of the site available in a form a machine can consume cheaply and exactly?*
### MRC-01 — Key pages have a clean text or Markdown representation · weight 4
**Check:** request the `.md` twin of a content URL, or request the canonical URL with `Accept: text/markdown`. Confirm the returned document carries the same substance as the HTML page rather than a stub.
**Why it matters:** a Markdown twin strips navigation chrome, cuts token cost, and removes the extraction step where meaning is most often lost.
### MRC-02 — The machine-readable representation is advertised, not hidden · weight 3
**Check:** confirm content negotiation on the canonical URL, or a `Link: <...>; rel="alternate"; type="text/markdown"` header, or an in-page ` `.
**Why it matters:** a twin nobody can discover is not a discovery surface. Vercel's engineering write-up makes the case for negotiation over separate URLs specifically because "content negotiation requires no site-specific knowledge" ([Vercel, "Making agent-friendly pages with content negotiation", 3 February 2026](https://vercel.com/blog/making-agent-friendly-pages-with-content-negotiation)).
### MRC-03 — Programmatic surfaces publish a machine-checkable contract · weight 3
**Check:** confirm a current OpenAPI document or JSON Schema for each public API, served at a discoverable URL, with a version matching the deployed service.
**Why it matters:** a schema is the only part of an API description a runtime can validate against. Prose describing an endpoint cannot catch a malformed call before it is sent.
### MRC-04 — Publication and modification dates are visible and in metadata · weight 2
**Check:** confirm a visible date on the page and a matching `datePublished` / `dateModified` in structured data or HTTP headers.
**Why it matters:** answer engines weigh freshness. A page with no date forces a consumer either to discard it or to trust it blindly.
### MRC-05 — Pages open with a self-contained answer · weight 2
**Check:** read the first 60 words under the `h1` and under each `h2`. Confirm each is extractable as a standalone answer without the paragraph above it.
**Why it matters:** retrieval systems lift passages, not pages. A passage that depends on its predecessor becomes wrong the moment it is quoted alone.
### MRC-06 — No decision-critical content is locked in images or unstructured PDFs · weight 3
**Check:** inventory diagrams, pricing tables, and specification sheets. Confirm each has a text equivalent in the page or in a linked structured document.
**Why it matters:** image-only content requires a vision pass, costs more, and is read less reliably than the same content in text.
---
### Dimension 4 — Action safety (weight 18)
*When an agent acts, are the consequences declared and the guardrails enforced by the system rather than by the prompt?*
### ACT-01 — Irreversible and high-consequence actions are labelled as such · weight 4
**Check:** for each write operation, confirm the tool description, API reference, or UI copy states whether the action is reversible, who can see it, and what it costs.
**Why it matters:** an agent cannot infer irreversibility. If the consequence is not stated, it gets discovered by being caused.
### ACT-02 — Approval for consequential actions is enforced server-side · weight 4
**Check:** attempt the consequential action with a valid credential and no approval token. Confirm the *server* refuses, rather than relying on a client-side prompt or an instruction inside a tool description.
**Why it matters:** safety hints in tool metadata are advisory. The Model Context Protocol specification treats tool annotations as untrusted unless the server itself is trusted ([MCP specification, 2026-07-28](https://modelcontextprotocol.io/specification/2026-07-28)). Enforcement has to live in the service.
### ACT-03 — Write operations are safely retryable · weight 3
**Check:** send the same write twice with the same idempotency key and confirm one effect. Confirm the mechanism is documented.
**Why it matters:** agents retry on timeout by default. Without idempotency, a network blip becomes a duplicate order.
### ACT-04 — Agent identity is distinguishable from human identity · weight 3
**Check:** confirm the system can tell that a request came from an agent acting for a person — through delegated OAuth scopes, a distinct client identity, or a declared agent header — and that this is recorded.
**Why it matters:** attribution is the precondition for every other control. Rate limiting, audit, revocation, and honest analytics all depend on knowing who acted.
### ACT-05 — Credentials are scoped to the task · weight 2
**Check:** confirm agent-facing access can be issued more narrowly than a full user session, and revoked independently.
**Why it matters:** a long-lived full-privilege key handed to an agent makes every downstream mistake maximally expensive.
### ACT-06 — Rate limits and quotas are documented and expressed in responses · weight 2
**Check:** confirm published limits, machine-readable limit headers, and `Retry-After` on `429` responses.
**Why it matters:** an agent that cannot read its remaining budget will either back off far too much or keep going until it is blocked.
---
### Dimension 5 — Recovery (weight 15)
*When something goes wrong, can the agent work out what to do next — and can a person see what happened?*
### REC-01 — Errors are typed and named, not only prose · weight 4
**Check:** trigger the common failure modes and confirm each returns a stable machine-readable code alongside the human message.
**Why it matters:** a stable code is what lets an agent branch. A sentence whose wording changes between releases cannot be matched on.
### REC-02 — Errors name the next viable step · weight 3
**Check:** read the error payloads. Confirm each says what would make the request succeed, or which alternative route exists.
**Why it matters:** most agent loops fail not because a call errored, but because the error gave no basis for a *different* second attempt.
### REC-03 — Validation failures identify the specific field and constraint · weight 2
**Check:** submit a partially invalid payload. Confirm the response names the field, the rule it violated, and the accepted range or format.
**Why it matters:** a generic "invalid request" turns a one-shot correction into a guessing loop across every field.
### REC-04 — Partial progress is resumable · weight 3
**Check:** interrupt a multi-step flow. Confirm the state can be queried and continued rather than restarted from the beginning.
**Why it matters:** long agent tasks are interrupted routinely. A non-resumable flow converts every interruption into repeated side effects.
### REC-05 — Agent actions are inspectable by the person responsible · weight 3
**Check:** confirm a person can see what an agent did on their behalf — timestamps, inputs, outcomes — and can reverse or escalate from that view.
**Why it matters:** delegation without an audit view moves work out of the person's sight. Recovery is a product surface, not only a log file.
---
### Dimension 6 — Policy signals (weight 12)
*Has the organisation said, in machine-readable terms, what AI systems may do with this content and these capabilities?*
### POL-01 — A usage preference for AI systems is stated in machine-readable form · weight 3
**Check:** confirm a declaration in robots.txt, in HTTP headers, or in a well-known document — not only in prose terms of service.
**Why it matters:** a policy only a lawyer can read is not a policy a crawler can honour.
### POL-02 — Distinct uses are distinguished, not collapsed · weight 3
**Check:** confirm the declaration separates indexing for search, use as input to a generated answer, and use as training data — rather than issuing one blanket allow or deny. Cloudflare's Content Signals Policy is the most widely deployed vocabulary for exactly this split ([Cloudflare, Content Signals Policy](https://contentsignals.org/)).
**Why it matters:** most organisations want different answers for these three uses. A single directive forces one answer for all of them.
### POL-03 — Terms address agents acting on a user's behalf · weight 2
**Check:** read the terms of service for language covering automated access performed *for a logged-in user*, as distinct from scraping.
**Why it matters:** terms written against scrapers routinely prohibit, by accident, the assistant the customer is deliberately using.
### POL-04 — A contact route exists for agent and crawler operators · weight 2
**Check:** confirm a published contact address or endpoint for access problems, referenced from robots.txt or the capability manifest.
**Why it matters:** without a route, an operator whose agent is blocked has no option other than to work around the block.
### POL-05 — Policy signals agree across surfaces · weight 2
**Check:** compare robots.txt, the machine-readable preference declaration, the capability manifest, and the terms of service for contradictions.
**Why it matters:** contradictory signals get resolved by whoever is reading them — which means the organisation is no longer choosing its own policy.
---
### How does this relate to the readiness tools that already exist?
Several organisations published agent-readiness models between April and June 2026. They are not competing measurements of the same thing; they measure different objects, which is why their scores cannot be compared. We list them here without ranking them.
| Framework | Publisher | Object being scored | Shape |
|---|---|---|---|
| [Agent readiness score](https://blog.cloudflare.com/agent-readiness/) | Cloudflare | A public website, from edge-observable signals | Four dimensions — Discoverability, Content, Bot Access Control, Capabilities; public checker at `isitagentready.com` reporting a level 0–5 across 22 checks |
| [AXIS](https://axis.run/) | Netlify | A live agent run against a scenario | Four dimensions: goal achievement, environment, service, agent behaviour; 0–100 with an inspectable transcript |
| [Agent Readiness Model](https://docs.factory.ai/agent-readiness/overview) | Factory | A code repository | Nine technical pillars, five maturity levels (L1 Functional → L5 Autonomous) |
| [Agentic Readiness](https://aws.amazon.com/blogs/migration-and-modernization/agentic-readiness/) | AWS | An enterprise application, as tool and as resource | Five pillars: API and interface readiness, security and identity, data handling, operational resilience, observability |
| [Lighthouse agentic-browsing audits](https://developer.chrome.com/docs/lighthouse/agentic-browsing/) | Google Chrome | A single page, in an existing audit runner | Experimental category covering WebMCP integration, an `llms.txt` discoverability check, accessibility for agents, and layout stability; explicitly not a weighted 0–100 score |
| **This rubric** | agentexperience.tech | A public site or product's declared surfaces | 36 weighted criteria, six dimensions, hand-runnable |
Two structural distinctions are worth holding onto. First, **behavioural versus structural**: AXIS scores an observed run, this rubric scores declared surfaces. A behavioural score tells you what happened once; a structural score tells you what any agent can rely on. You want both, and neither substitutes for the other. Second, **repository versus public web**: Factory's model and AWS's model score things inside an organisation. Cloudflare's, Lighthouse's, and this one score what the outside world can see.
Where this rubric differs most from the edge-observable checkers is Dimensions 4 and 5. Action safety and recovery cannot be measured from outside without a credential and a willingness to break something, so automated public scanners largely skip them. They are also, in our experience of reviewing agent workflows, where most real failures live.
### What does the current baseline look like?
Honest answer: thinner than the discourse suggests, and the public evidence base is small.
The one large public measurement we have found is Cloudflare's, published on 17 April 2026 alongside its agent readiness score and the `isitagentready.com` checker ([Cloudflare, "Introducing the Agent Readiness score"](https://blog.cloudflare.com/agent-readiness/), André Jesus and Vance Morrison). Read the population carefully: Cloudflare took **the 200,000 most visited domains** on Cloudflare Radar and then **filtered out categories where agent readiness is not relevant** — redirects, ad servers, tunnelling services. The post does not state the post-filter count, so "200,000 domains scanned" is a slight overstatement of what was published.
Against that population, Cloudflare reported:
| Signal | Finding, as published 17 April 2026 |
|---|---|
| `robots.txt` | "nearly universal — 78% of sites have one — but the vast majority are written for traditional search engine crawlers, not AI agents" |
| Content Signals | "4% of sites have declared their AI usage preferences in robots.txt" |
| Markdown content negotiation | "passes on 3.9% of sites" |
| MCP Server Cards and API Catalogs (RFC 9727) | "together appear on fewer than 15 sites in the entire dataset" |
Note that the last figure is a **combined** count for the two surfaces, not fewer than 15 of each.
Two things follow from a baseline this low. Adopting even the Discovery dimension puts a site ahead of most of the web on those specific signals — which is a statement about scarcity, not about outcomes. And a rubric built only on the signals that an edge scanner can see would be measuring the easy half of the problem.
One correction worth carrying, since it circulates widely: `isitagentready.com` describes itself, in its own machine-readable server description, as reporting an "agent readiness level (0-5) across 22 checks". Several third-party write-ups describe it as producing a 0–100 score with named tiers. We found no support for that in either the Cloudflare post or the live tool.
### How to run the rubric in an afternoon
1. **Fetch the four files.** `robots.txt`, `sitemap.xml`, `llms.txt`, and anything under `/.well-known/`. Record the status code and the content type for each. That settles most of Dimension 1.
2. **Pick one real task.** Not the homepage — the task a person would actually delegate. Walk it as an agent would: fetch the page without JavaScript, read the accessibility tree, list the controls and their names. That settles Dimension 2.
3. **Ask for the machine-readable copy.** `curl -H "Accept: text/markdown"` on three content URLs, and look for the schema behind any API. Dimension 3.
4. **Try to break something safely.** In a staging environment, call a write endpoint twice, call it without approval, and submit an invalid payload. Dimensions 4 and 5 — this is the part most teams skip, and the part that finds the most.
5. **Read your own policy files against each other.** Dimension 6 usually takes ten minutes and usually turns up a contradiction.
6. **Publish the six subscores, the date, and the method.** Then re-run it when a discovery surface, an API contract, or an approval flow changes.
### Changelog
- **v0.1 — 2026-09-01.** First public draft. 36 criteria, six dimensions, weights totalling 100. Open for comment. Weights are a judgement call and are the part most likely to change in v0.2.
### Frequently asked questions
**What is agent readiness?**
Agent readiness is the degree to which a website or product makes its content, capabilities, consequences, and policies legible to a software agent working on a person's behalf. It is assessed by inspecting declared surfaces — files, headers, markup, schemas, error payloads — rather than by asking how the product feels to use.
**How is this rubric different from a vendor's agent-readiness score?**
This rubric is structural and open: it scores what a site declares, publishes its weights, and can be run by hand with a browser and `curl`. Vendor tools have different scopes — a code repository, a live agent transcript, an enterprise application, or edge-observable signals. They answer different questions and their scores are not comparable with each other or with this one.
**Does a high score mean agents will succeed on my site?**
No. The rubric measures declared surfaces, not outcomes. A site can score well and still confuse an agent through unclear copy; a site can score poorly and still be usable by a capable model. Treat the score as an inventory of what you have made explicit, and measure outcomes separately with real task runs.
**How often should we re-run it?**
Whenever a discovery surface, an API contract, or an approval flow changes, and on a fixed cadence otherwise. Several criteria fail through drift rather than absence — an index pointing at deleted URLs, or a manifest describing an endpoint that has since moved.
A readiness score is a description of what you have declared, not a promise about what agents will do with it.
## Evaluate decisions, not just answers.
> Why evaluating an AI agent workflow means scoring the decisions along the path — tool selection, input formation, stopping, and recovery — not only the final answer.
Published: 2026-08-25
Updated: 2026-09-02
Canonical: https://agentexperience.tech/insights/evaluating-agent-workflows/
Tags: evaluation, workflows, tool selection, reliability
A final answer can look convincing while the workflow that produced it chose the wrong tool, skipped a boundary, or made recovery harder than it needed to be.
**In short.** A final answer can be right for bad reasons. Agent-facing work is a chain of decisions — find the capability, choose between neighbours, form the input, know when to ask, know when to stop — and each link fails independently. Evaluate the path: score tool selection, input formation, boundary compliance, stopping behaviour, and recoverability separately from the outcome. Repeat runs rather than trusting one. Concentrate scrutiny on the steps that create side effects. The output of a good evaluation is not a number; it is a clear next change.
Agent-facing work is a chain of decisions. The outcome matters, but so do the moments that lead there: finding a capability, selecting a tool, forming the right input, knowing when to ask for help, and recognising when to stop.
### Why is final-answer accuracy not enough?
Because the same score covers very different products.
Consider two runs of the same task. In the first, the agent reads the right documentation, calls the right tool once with well-formed arguments, and returns. In the second, it calls a neighbouring tool, gets a partial result, retries twice, works around a permission it should have escalated, and arrives at the same output. An outcome-only check records two successes. Only one of them will survive a slow dependency, a stricter policy, or a slightly different phrasing of the request.
The evaluation literature has been moving away from outcome-only scoring for the same reason. AgentBoard (2024) reports progress rate and grounding accuracy alongside success rate. Mind2Web 2 (2025) uses an agent-as-a-judge rubric to score long-horizon search where the final answer is dynamic. API-Bank (Li et al., EMNLP 2023) scores API planning, retrieval, and calling as separate tasks over 73 runnable APIs, on the explicit basis that tool use is not one skill and its parts fail independently. Several web-agent studies collect step-level human feedback specifically to surface failure modes that success rates hide.
None of that means you need a benchmark. It means the decomposition those benchmarks use is the right shape for your own review.
### Watch the path
Start by observing a few real examples of the workflow. Look for repeated detours, uncertain handoffs, avoidable retries, and changes in behaviour when context is incomplete. The patterns often tell a team more than a single success rate.
Five decision points are worth naming explicitly, because each has a different fix.
**Discovery.** Did the agent find the capability at all? A capability that exists and cannot be found is functionally absent. The fix is usually a page, an index, or a catalog entry.
**Selection.** Did it choose the right capability among neighbours? Near-miss selection is easy to misdiagnose, because it looks like reasoning and is usually wording. The fix lives in [Tool descriptions are product surfaces](/insights/tool-descriptions/).
**Input formation.** Were the arguments well-formed and complete? Malformed parameters and missing required context are recurring failure modes across the tool-use literature. The fix is usually a schema with real descriptions and constraints, or a preflight check.
**Boundary and stopping.** Did the agent respect the permission model, and did it stop where it should? Both silent overreach and unnecessary escalation are failures, and only the second one is visible in a support queue.
**Recovery.** When something failed, did the next attempt have more information than the last? A retry that repeats the same call with the same inputs is not recovery; it is repetition. See [Retries are product history, not a clean slate](/insights/retries-are-product-history/).
Record these as plain sentences, not scores, on the first pass. “The agent could not tell `export_report` from `share_report`” is more actionable than “selection accuracy: 0.6”.
### Test the moments that carry risk
Not every step needs the same level of scrutiny. Focus on choices that create side effects, expose information, change a customer outcome, or become expensive to correct. Those are the places where good product boundaries matter most.
A simple way to allocate attention: for each step, ask whether an incorrect action is *reversible*, *visible*, and *contained*.
- Reversible, visible, contained — a read, a draft, a search. Let it run and sample the results.
- Irreversible or externally visible — a payment, an email to a customer, a deletion, a publish. Every one of these deserves a designed approval, not a confirmation dialog. See [Human approval is a workflow, not a pop-up](/insights/approval-is-a-workflow/).
- Uncontained — anything the agent can do after ingesting untrusted content. Prompt-injection research is consistent that retrieved text can steer behaviour into unintended calls (Greshake et al., 2023), and that the structural mitigation is narrowing the consequential actions available after untrusted input (Beurer-Kellner et al., 2025). Evaluate this deliberately: give the workflow a hostile document and see what it is still able to do.
The current MCP specification (2026-07-28) reinforces the same separation: tool annotations such as read-only or destructive hints are untrusted unless the server is trusted, and the harness must still validate and authorise. When you evaluate a boundary, evaluate the enforcement, not the label.
### Measure reliability, not one good run
One successful run tells you the workflow is possible. It does not tell you it is reliable.
Three techniques from public evaluation practice transfer well to product work:
**Repeat the same task.** The τ-bench work (Yao et al., ICLR 2025) introduced `pass^k` — a task counts as successful only if the agent succeeds on all k attempts — as a way to describe reliability in multi-turn, policy-constrained settings rather than best-run performance. Running each of your key tasks a handful of times and looking at the worst run is a cheap approximation of the same idea, not a reproduction of the metric.
**Perturb the inputs.** Vary the phrasing, omit a field, and change the order of information. ReliabilityBench (2026) formalises this as a reliability surface over perturbations and injected tool failures rather than a single scalar. You do not need the formalism; you need three variants of each task.
**Inject faults.** Simulate a timeout, a rate limit, a partial response, and a schema change. This is the only way to find out whether your recovery path exists or is aspirational.
Record cost, step count, and latency alongside correctness. A workflow that succeeds reliably in forty steps is a different product from one that succeeds reliably in four, and only one of them survives a pricing review.
### Keep deterministic and judgment checks separate
Some conditions are facts. Did the run use only allowed capabilities? Did the output match the required schema? Did it stay inside the permitted scope? Check these deterministically, in code, every time.
Other questions need judgment. Was the result appropriate? Was the path understandable? Did the handoff happen at the right moment? These need a rubric and a reviewer — human, or a model acting as judge with its limits acknowledged.
Do not blend them. A judge that also decides schema compliance becomes an unreliable linter, and a linter that also decides appropriateness becomes a false comfort. When a model is used as a judge, remember that the judge becomes part of the measurement and can drift; public benchmarks that use agent-as-a-judge rubrics treat judge quality as a stated validity threat, not an implementation detail.
### Do not compare yourself to a leaderboard
It is tempting to anchor on a published number. Resist it.
A public agent score is a systems result. It reflects a model, a harness, an environment version, a verifier, a step budget, and a retry policy, and 2026 work on harness sensitivity exists specifically because the scaffold can shape the score. Benchmark releases are frequently not comparable to their own earlier versions: the τ-bench repository notes that results before a given release are not comparable with later graded results in affected domains, and OSWorld 2.0 (2026) is explicitly not directly comparable to OSWorld 1.0 unless the release matrix matches.
The useful move is to borrow the *method* — decomposition, repeats, perturbation, fault injection, execution-based checks — and apply it to your own tasks, with your own versions recorded. What you can defensibly say is “this workflow, at these versions, behaves this way.” That is worth more to your team than a rank.
### Use the result to improve the system
The point of evaluation is not a decorative score. It is a better next decision: simplify the tool set, clarify the context, adjust a handoff, or define the condition that should pause the workflow.
Every finding should land in one of four places:
1. **A wording change** — a description, a schema field, a heading, a label.
2. **A structural change** — a split capability, a new page, a preflight check.
3. **A boundary change** — a narrower scope, an added approval, an encoded stopping condition.
4. **A standing check** — the failure becomes a permanent case so it cannot quietly return.
That last one is what turns a one-off evaluation into a loop. [Build an evaluation loop that improves the product](/insights/build-a-reliable-agent-evaluation-loop/) covers the mechanics; [Run an Agent Experience review](/insights/run-an-ax-review/) covers how to find the cases in the first place.
### Frequently asked questions
**Why is final-answer accuracy not enough for agent evaluation?**
Because a correct answer can come from a bad path. An agent can pick a near-miss tool, retry three times, skip a permission boundary, and still land on the right result — and an outcome-only check scores that identically to a clean run. Public benchmarks have moved the same way: AgentBoard reports progress rate and grounding accuracy alongside success rate, precisely because pass-or-fail hides how the result was reached.
**What should we measure in an agent workflow?**
Measure the decisions that carry consequence: whether the right capability was selected, whether inputs were well formed, whether boundaries were respected, whether the agent stopped when it should have, and whether recovery was possible. Then measure reliability across repeats rather than a single run, and record cost, steps, and latency alongside correctness.
**What is pass^k and why does it matter?**
`pass^k` scores a task as successful only if the agent succeeds on all k attempts, rather than any one of them. It was introduced in the τ-bench work (Yao et al., ICLR 2025) as a way to describe reliability in multi-turn, policy-constrained settings. It matters because production users experience the distribution of runs, not the best run.
**Can we compare our agent's score to a public benchmark number?**
Not directly. A published agent score reflects a model plus a harness plus an environment version plus a verifier, and benchmark releases are often not comparable across their own versions. Use public benchmarks to borrow evaluation design — decomposition, perturbation, repeats — rather than to position your product against a leaderboard.
A useful evaluation leaves the team with a sharper understanding of what to change next.
## Decide what you are measuring before you measure it.
> A practical guide to measuring Agent Experience: what construct you are actually measuring, the four families of AX measurement, the instrumentation a workflow needs before any number means anything, and the claims a measurement cannot support.
Published: 2026-09-02
Updated: 2026-09-02
Canonical: https://agentexperience.tech/insights/measure-agent-experience/
Tags: evaluation, measurement, instrumentation, reliability, workflows
Most arguments about agent metrics are really arguments about constructs. Two teams say “success rate” and mean different events, different denominators, and different runs.
**Measuring Agent Experience is a measurement-design problem before it is a data problem.** Name the construct, choose an instrument that matches it, write the run record that instrument depends on, and keep the claim inside what the construct can support. Skip the first step and every later argument becomes unresolvable, because the disagreement is about what the number means rather than about what it says.
This page covers the constructs and the instrumentation. It does not report scores, and it does not say which measurement is best — those would be claims this site does not make.
### Why does "how well is the agent doing?" fail as a question?
Because it names no object. There are at least four different things a team can mean by it, and they come apart immediately in practice.
Consider a workflow that reconciles an account. It succeeds. Did it succeed because the product was legible, or because the model was strong enough to work around an ambiguous tool catalogue? Did it succeed once, or does it succeed every time? Did it succeed in four steps or in forty, with two human rescues? Did it succeed by a route the team would endorse if they read it?
Those are four questions, four instruments, and four different denominators. "How well is the agent doing?" collapses them, and a single number that answers it is a number that answers none of them. The [decisions-not-answers](/insights/evaluating-agent-workflows/) position is the same argument made about a single run; this page is that argument made about a measurement programme.
### What are the four families of AX measurement?
Each family answers a different question, needs a different instrument, and supports a different kind of claim.
| Family | Question | Instrument | What it cannot tell you |
|---|---|---|---|
| **Declared surfaces** | What has the product made explicit? | Inspection, no agent run required | Whether any agent uses it well |
| **Path quality** | Which decisions did the agent make, and were they right? | Trace review and trajectory metrics | Whether the path repeats |
| **Reliability** | Does the same task succeed across repeats and perturbations? | Repeated runs, fault injection | Why a failure happened |
| **Cost of the path** | What did the run consume? | Step, token, latency and intervention counts | Whether the outcome was worth it |
### Declared surfaces
The cheapest family, and the only one that needs no agent. You inspect what the product has put on the record: discovery files, structure and semantics, machine-readable content, action safety, recovery routes, policy signals. [The Open Agent-Readiness Rubric](/insights/agent-readiness-rubric/) is this site's version — 36 checks across six dimensions, each with a concrete request or inspection that settles it and a published weight.
Public tooling measures related objects. Cloudflare's Agent Readiness score, announced 17 April 2026 and published through `isitagentready.com`, evaluates edge-observable signals — `robots.txt`, `sitemap.xml`, `Link` headers, Markdown content negotiation, AI bot rules, Content Signals, an MCP server card, an API catalogue, and agentic-commerce declarations — and was added to the URL Scanner in the Cloudflare dashboard on 12 May 2026. That is a scan of a live domain from the outside; a rubric run by hand is a self-assessment that can be run against staging. They measure overlapping surfaces from different vantage points and their numbers are not interchangeable.
The important property of this whole family is what it excludes. A declared-surface score is a precondition check. It does not predict agent success, and the rubric says so about itself.
### Path quality
The family that requires actually watching a run. The measurable events are decisions: was the right capability selected, were the inputs well formed, was a boundary respected, did the agent stop when it should have, was recovery possible.
Public evaluation work has moved the same way, which makes it a useful source of measurement design. AgentBoard reports progress rate and grounding accuracy alongside success rate, precisely because a pass/fail verdict hides how the result was reached. Mind2Web 2 scores citation-backed answer quality through an agent-as-a-judge rubric rather than string matching. Benchmarks in the MCP family measure the server rather than the agent — task completion, latency and token consumption held under matched agent settings — which is a reminder that "the agent" is rarely the only thing under test.
Borrow the decomposition. Do not borrow the numbers: a published score is a model plus a harness plus an environment version plus a verifier, and several of these suites state plainly that their own releases are not comparable across versions.
### Reliability
Path quality on one run tells you almost nothing about the run a user will get. Reliability is the family that repeats.
The construct worth knowing here is `pass^k`, introduced in the τ-bench work (Yao et al., ICLR 2025): a task counts as successful only if the agent succeeds on *all* `k` attempts, rather than on any one of them. It matters because production users experience the distribution of runs, not the best run — and because a workflow with an aggressive retry loop can post a strong "any attempt" number while being unpleasant to depend on.
The second construct is perturbation. ReliabilityBench varies task perturbations and injected tool or API failures and reports a reliability surface rather than a single scalar. The practical version for a product team is fault injection: simulate timeouts, rate limits, partial responses, and schema drift, and measure whether the workflow recovers or merely repeats. That measurement is only possible if the product [designs for recovery](/insights/design-for-recovery/) in the first place — you cannot measure a route that does not exist.
### Cost of the path
Steps, tokens, wall-clock time, price per task, and — the one most often left out — human interventions per completed task.
Intervention count is the AX-specific member of this family, and it is often the most honest single number a team has. A workflow that completes reliably but needs a person twice per run has not been delegated; it has been supervised. Counting interventions, and classifying what each one was *for* (missing context, ambiguous instruction, unsafe action, plain failure), turns a vague sense that "it still needs babysitting" into something a product decision can attach to.
### What has to be instrumented first?
Almost every metric above is a query over a single artefact: the run record. Write it badly and no amount of later analysis recovers the information.
A run record that supports AX measurement carries, at minimum:
- **A stable task identity** — the same job, recognisably the same across runs, so a denominator exists.
- **The tool calls in order**, with inputs and outcomes, so selection and input formation are inspectable rather than inferred.
- **Every attempt, with its trigger and what changed.** [Retries are product history](/insights/retries-are-product-history/): without `trigger` you cannot tell an automatic backoff from a person clicking the button again, and without a record of what changed since the previous attempt you cannot tell a recovery from a repetition.
- **Each human intervention**, with what it was for.
- **A terminal state that distinguishes four things**, not two: success, partial progress, refused, and unsafe. Collapsing refused into failure is the single most common way a run record destroys its own usefulness — a correct refusal and a broken workflow are not the same event, and a metric that cannot separate them will punish the safe behaviour.
Two disciplines apply to the record itself. Redact at write time rather than at analysis time, and keep only what someone debugging at an awkward hour would actually need; a fuller log is not automatically better governance. The [AX review](/insights/run-an-ax-review/) treats this record as its primary evidence, which is a good test of whether yours is adequate — if a review cannot be run from it, it is not instrumented yet.
### Can you measure the experience by asking the agent?
It is a real technique with a real limitation, and it is worth understanding both.
The approach evaluates a completed session's transcript and derives dimensions of the experience the agent encountered. DX's Agent Experience Score, documented publicly for coding-agent sessions, scores three constructs — Requirements ("whether the goal was clear and the initial context helped the agent begin"), Steering ("whether follow-up input helped guide progress"), and Scope ("whether the output stayed aligned to a useful task boundary") — each on a 1–5 scale, averaged into an overall figure. The evaluation is performed after the session by a separate model reading a scrubbed transcript, not by the coding agent itself, and sessions with insufficient evidence or unreadable transcripts can go unevaluated.
What this family measures is genuinely hard to get any other way: friction that only the thing doing the work can see. A human developer needs a survey to report that a repository was hard to navigate. The transcript already contains it.
The limitation is the same one that applies to every judge-based measurement, and it is structural rather than a flaw in any particular implementation: the judge becomes part of the instrument. A change in the judge model, the prompt, or the scrubbing rules moves the score without anything about the product changing. Treat a transcript-derived score as a signal that travels with its own version number, compare it only against itself over time, and expect it to answer "where did friction appear?" rather than "how good is this?"
Note also the scoping. This construct is defined over coding-agent sessions inside a repository — the inward, developer-tooling sense of AX. The outward sense, where an agent works through a product on behalf of a customer, is a different population and would need its own definition of what a session even is. [AX compared with UX, DX, and GEO](/insights/ax-vs-ux-dx-geo/) works through why those two senses of the term keep getting conflated.
### What claims can these measurements not support?
Worth writing down before anyone builds a slide:
- **Not a comparison to a public benchmark.** A benchmark number is model plus harness plus environment version plus verifier. Several suites state that their own releases are not comparable across versions.
- **Not a claim about a model.** If the harness changed, the measurement moved for reasons that have nothing to do with the model or the product.
- **Not a prediction from a readiness score.** Declared surfaces are a precondition, not a forecast.
- **Not a stable number across judge changes**, wherever a judge is in the loop.
- **Not a substitute for the qualitative review.** Metrics tell you that something regressed. They rarely tell you why, and the why is where the product change lives.
### Where to start
One workflow, one construct, one week. Choose the workflow people actually want delegated. Write the run record described above, even by hand, for ten runs. Count two things: how many terminal states were success versus partial versus refused versus unsafe, and how many human interventions each run needed.
That is a small measurement, and it will already do the thing measurement is for — it will make a disagreement resolvable. Then turn it into something that persists: the [evaluation loop](/insights/build-a-reliable-agent-evaluation-loop/) is the version of this that survives contact with a roadmap, because it converts a recurring failure into a durable check rather than a recurring conversation.
### Frequently asked questions
**How do you measure agent experience?**
By naming the construct first, then choosing an instrument that matches it. Four families cover most of it: declared surfaces (what the product has made explicit, checked by inspection), path quality (which decisions the agent made and whether they were right), reliability (whether the task succeeds across repeats and perturbations), and cost of the path (steps, tokens, latency, and human interventions). Each needs a different instrument, and none substitutes for another.
**What is the difference between an agent-readiness score and an agent-experience measurement?**
A readiness score describes what a product has declared — files, headers, markup, schemas, error payloads — and can be settled by inspection without running an agent at all. An agent-experience measurement describes what happened when an agent worked through the product. Readiness is a precondition you can check on a static site; experience requires runs, traces, and a definition of what counted as success.
**What should we instrument before we start measuring?**
The run record: stable task identity, tool calls in order with inputs and outcomes, every retry with its trigger and what changed since the previous attempt, each human intervention and what it was for, and a terminal state that separates success, partial progress, refused, and unsafe. Almost every AX metric worth having is a query over that record.
**Can we compare our agent's numbers to a public benchmark?**
Not directly. A published number reflects a model plus a harness plus an environment version plus a verifier, and benchmark releases are frequently not comparable across their own versions. Use public benchmarks to borrow measurement design — trajectory metrics, repeats, perturbation, cost reporting — not to position a product against a leaderboard.
A measurement is only as good as the decision it changes. Instrument the run record first; the numbers are downstream of it.
## Run an Agent Experience review around one real workflow.
> A step-by-step method for running an Agent Experience review: pick one workflow, map its surfaces, watch the decision points, and turn patterns into product changes.
Published: 2026-08-25
Updated: 2026-09-02
Canonical: https://agentexperience.tech/insights/run-an-ax-review/
Tags: evaluation, review, workflows, decision points
You do not need a large programme to learn something useful. Begin with one task that matters, then follow the decisions that shape it.
**In short.** An Agent Experience review is a bounded, repeatable inspection of one workflow an agent performs for a person. Choose a job with a clear outcome, map every surface the job touches, observe a handful of real runs, record each point where the agent hesitated or guessed, then ship the smallest product change that removes the largest hesitation. It is a product habit, not a launch gate, and it produces edits to descriptions, permissions, documentation, and handoffs — not a score.
The temptation with agent-facing work is to start with the model: swap it, prompt it harder, add a framework. That instinct hides the more tractable problem. Agent-facing failures decompose into distinct stages, and the tool-use literature has treated them separately for years — the API-Bank benchmark (Li et al., EMNLP 2023) was built around exactly this decomposition, with API planning, retrieval, and calling scored as separate tasks over 73 runnable APIs, because they fail independently. If planning, retrieval, and calling can fail independently in a benchmark, they can fail independently in your product, and a single success rate will not tell you which one did.
An AX review is how you find out which one did.
### What is an Agent Experience review?
An AX review is a structured observation of one agent-performed workflow across five surfaces: discovery, context, tool use, recovery, and delegated action. It asks a single question at each step — *what would have to be true for the agent to do this well?* — and records the answer in plain language.
It is not a benchmark. Public agent benchmarks measure a system, not your product, and a published number reflects a model plus a harness plus an environment version plus a verifier rather than a pure model score. It is not an audit either; nothing here produces a certificate. It is diagnostic work whose only output that matters is the next change you make.
### 1. Choose a job with a clear outcome
Pick a meaningful task a person would plausibly delegate. Define what success looks like, what information the agent starts with, and the point at which the workflow should stop or ask for help.
Three tests for a well-chosen job:
- **Someone would actually delegate it.** “Reconcile last month’s invoices against the ledger and flag mismatches” passes. “Use our API” does not.
- **Success is observable without arguing.** You can look at the end state and say yes or no. If the two of you cannot agree on the criterion before the review, you will not agree after it.
- **It has a stopping condition.** Name in advance the situation in which the agent should stop and ask rather than proceed. Reviews without a stated stopping point tend to rate confident overreach as success.
Write these three things down in four sentences. That artefact is the review’s scope, and it is what stops the review expanding into “how good is our AI”.
If choosing the job is itself hard, the underlying problem is probably scope rather than evaluation. [Start with workflows, not autonomy](/insights/start-with-workflows/) covers that failure mode.
### 2. Map the surfaces around the task
List the pages, tools, documentation, inputs, permissions, and people the workflow depends on. This prevents a team from treating a failure as only a model issue when the surrounding product surface is the real constraint.
The public agent stack is layered, and each layer is somebody’s responsibility. The owner column below is organisational convention rather than evidence; substitute the way your own team is arranged.
| Surface | Concrete artefact | Often owned by |
| --- | --- | --- |
| Discovery | Website pages, `robots.txt`, sitemap, `llms.txt`, docs index | Web / content |
| Context | `AGENTS.md`, README, help centre, schema descriptions | Docs / engineering |
| Tools | MCP tool definitions, function schemas, OpenAPI operations | Platform / API |
| Permissions | OAuth scopes, API keys, role boundaries, approval rules | Security / platform |
| Handoff | Approval UI, notification, ticket, escalation route | Product / design |
| Record | Traces, logs, retry history, audit trail | Engineering |
Fill in the actual file paths and URLs, not the categories. A map with real locators tells you who to talk to; a map with abstractions tells you nothing.
Two things are frequently missing from a first map. **Permissions**: teams describe what the agent should do and never write down what it *may* do. **The record**: if nobody can reconstruct what happened, the rest of the review is guesswork.
### 3. Watch the decision points
Pay attention to how the agent finds a capability, chooses between options, forms its inputs, handles missing context, and responds to a blocked action. Record the point of uncertainty in plain language.
Observe several runs of the same job — as a working range, five to ten is enough to distinguish a pattern from an accident and few enough to read every one. That range is a practical judgement, not a sampling rule. Vary the starting conditions deliberately: a complete request, an underspecified one, one where a dependency is unavailable, and one where the right answer is to stop and ask.
For each run, record six things:
1. **The moment the agent chose.** Which tool, which page, which branch.
2. **What it had to go on.** The description text, the page content, the schema.
3. **What it assumed.** Every unstated assumption is a piece of missing context.
4. **Where it hesitated, retried, or backtracked.** Retries are evidence, not noise.
5. **Whether it stopped at the right place.** Both silent overreach and unnecessary escalation are failures.
6. **What a person watching would have wanted to know.**
Two failure modes deserve particular attention because they are easy to misread.
**Near-miss tool selection.** The agent picked a neighbouring tool that partly works. This reads as a model error and is usually a description problem — see [Tool descriptions are product surfaces](/insights/tool-descriptions/) and [An agent’s tool catalog needs a pruning strategy](/insights/agent-tool-catalogs/).
**Successful runs with ugly paths.** A run that ends correctly after four wrong turns will pass any outcome-based check and will fail in production the first time one of those turns is slower. This is the argument in [Evaluate decisions, not just answers](/insights/evaluating-agent-workflows/).
### 4. Test the moments that carry risk
Not every step deserves equal scrutiny. Concentrate on the choices that create side effects, expose information, change a customer outcome, or become expensive to reverse.
Three checks earn their place in almost every review.
**Does the boundary hold when the model is wrong?** The current MCP specification (2026-07-28) is explicit that tool annotations are untrusted unless the server itself is trusted, and that the harness — not the model — must validate and authorise. If your safe path depends on the agent reading a hint correctly, it is not a boundary. It is a preference.
**What happens after untrusted content enters the context?** Indirect prompt injection is a demonstrated attack: Greshake et al. (2023) showed retrieved content steering model behaviour into unintended API calls, and a 2026 empirical study of injection in the wild documented attacks that were hidden and strategically placed across many models and page representations. Design-pattern work by Beurer-Kellner et al. (2025) argues the durable mitigation is structural — deliberately narrow the set of consequential actions available once untrusted input has been ingested. Ask, for your workflow: what can the agent still do after it reads a stranger’s text?
**Is there a route back?** Recovery should be part of the interaction model, not an exception path. The MCP tools specification includes multi-round-trip flows for when a tool needs more human input, and OAuth’s step-up authentication (RFC 9470) exists for tasks that become sensitive partway through. [Design for recovery, not perfect runs](/insights/design-for-recovery/) covers the product shape of this.
### 5. Turn patterns into product changes
Look for the smallest change that would make the path clearer: a better tool description, a missing label, an explicit approval step, a narrower capability, or a recovery route. Then review the workflow again.
Sort every finding into one of four buckets, because each has a different owner and a different cost:
- **Wording** — a tool description, a heading, a button label, a schema field description. Cheapest, and often the real fix.
- **Structure** — a missing page, an unlabelled control, a capability that should be two capabilities.
- **Boundary** — a permission that is too broad, an approval that should exist, a stopping condition that was never encoded.
- **Record** — something happened that nobody can reconstruct.
Then pick one. The discipline is choosing the single change with the best ratio of clarity gained to work required, shipping it, and running the review again. A review that produces a twenty-item backlog produces nothing.
Promote the instructive failures into a standing check as you go. That is how a review compounds into an evaluation loop rather than repeating itself — see [Build an evaluation loop that improves the product](/insights/build-a-reliable-agent-evaluation-loop/).
### 6. Keep the question alive
Agent-facing systems change with the product, the model, and the task. Treat the review as a repeatable product habit, not a once-and-done launch gate.
The dependencies genuinely move underneath you. Public benchmark infrastructure has had to solve the same problem: StableToolBench (ACL 2024 Findings) introduced simulated APIs and caching specifically because real APIs drift constantly, and Wu et al. (ACL 2026 Findings) argue that static toolsets are unrealistic and that agents need continual documentation adaptation as APIs version, deprecate, and reappear. Your review is a snapshot of a system with moving parts.
A workable cadence: re-run a review when the workflow changes materially, when a model or harness version changes, when a dependency’s contract changes, and otherwise on a fixed interval you actually keep. Record the date, the versions in play, and the one change you made. Six months of those entries is a more useful artefact than any single score.
### Frequently asked questions
**How long does an Agent Experience review take?**
There is no standard duration, and any number quoted here would be a working estimate rather than a measured one. What makes a first review finishable is scope: one job with a clear success condition, a small number of observed runs, and one written list of decision points. Reviews that begin as a broad programme tend to stall before they produce a product change.
**Who should run an AX review?**
Whoever owns the workflow, with someone who can read traces. It is a product review, not a model evaluation, so the useful room contains a product owner, an engineer who can see the tool calls and logs, and a writer or designer who owns the documentation and interface copy the agent depends on.
**What is the difference between an AX review and an eval suite?**
A review is qualitative and diagnostic; an eval suite is quantitative and regressive. The review finds where the agent’s path breaks and why. The eval suite locks in the cases you already understand so they do not silently return. Reviews should feed the eval suite, not compete with it.
**How do we know the review worked?**
By naming a specific product change and a specific decision point that changed with it. A review that ends in a document has not finished. A review that ends in an edited tool description, an added approval step, a narrowed permission, or a new recovery route has — and the next review tells you whether that change held.
A useful review leaves the team with one sharper workflow and a concrete next improvement.
## Build an evaluation loop that improves the product.
> A practical framework for using agent workflow evaluation to drive meaningful product improvements.
Published: 2026-08-25
Updated: 2026-08-25
Canonical: https://agentexperience.tech/insights/build-a-reliable-agent-evaluation-loop/
Tags: evaluation, reliability, workflows
Evaluation becomes valuable when it turns a real workflow failure into the next durable product improvement.
It is easy to collect a score and hard to learn from it. A useful evaluation loop connects a representative task, a clear definition of success, an observable path through the workflow, and a decision about what to improve next.
### Start with a real job
Choose a task that matters to an actual user or operator. Give it a concrete outcome and the context needed to attempt it. Broad demonstrations are entertaining, but bounded jobs reveal whether the product surface is usable when the work has constraints.
### Use more than one kind of check
Some conditions should be deterministic: did the system use an allowed capability, produce the required format, or respect a boundary? Other questions require judgment: was the result appropriate, was the path understandable, and did the handoff happen at the right moment? Keep those checks distinct.
### Compare the change, not just the score
Preserve a clear record of each evaluation run so that a team can compare a change against a meaningful baseline. The important question is not “what is the number?” It is “what became better, what got worse, and why?”
### Promote failure patterns into the next test
When a workflow fails in an instructive way, turn that case into a recurring check. This keeps a fixed improvement from quietly returning and makes the evaluation set more representative over time.
### Close the loop in the product
An evaluation should result in an edit to a tool description, a clearer constraint, a better recovery path, or a revised approval point. If the loop stops at a dashboard, it is reporting—not learning.
The most valuable evaluation is the one that changes the next version of the experience.
---
# Agent Experience lifecycle crosswalk
An editorial working method, not an industry standard or a claim of complete coverage. The seven stages describe a task over time; the five systems describe the product surfaces to inspect. Stages can repeat or overlap.
## Discover
Where is the relevant capability?
Product system: Orientation and discovery
[Related guide](https://agentexperience.tech/insights/agent-friendly-websites/)
## Understand
What does it do, and when is it the wrong choice?
Product system: Tools and interfaces
[Related guide](https://agentexperience.tech/insights/tool-descriptions/)
## Obtain authority
Who permits this action, within which boundaries?
Product system: Delegated action and trust
[Related guide](https://agentexperience.tech/insights/approval-is-a-workflow/)
## Execute
What state changes, and how is progress recorded?
Product system: Workflows and state
[Related guide](https://agentexperience.tech/insights/start-with-workflows/)
## Observe
What evidence distinguishes completion from uncertainty?
Product system: Evaluation and improvement
[Related guide](https://agentexperience.tech/insights/evaluating-agent-workflows/)
## Recover
Can the workflow resume without repeating a harmful action?
Product system: Workflows and state; Delegated action and trust
[Related guide](https://agentexperience.tech/insights/design-for-recovery/)
## Learn
Which failure becomes the next product change and regression check?
Product system: Evaluation and improvement
[Related guide](https://agentexperience.tech/insights/build-a-reliable-agent-evaluation-loop/)
Apply it: choose one workflow, record the first unclear decision, name the affected product surface, then write a check that would catch the same failure again.
[Worked examples](https://agentexperience.tech/examples/)
---
# Capability and authority preflight before action
Canonical: https://agentexperience.tech/examples/capability-authority-preflight/
Markdown: https://agentexperience.tech/examples/capability-authority-preflight/index.md
A synthetic billing request shows how an agent should split the job, inspect exposed tools, verify authorization, and stop before a destructive call it is not allowed to make.
Synthetic boundary: This is a newly authored synthetic fixture. It is not copied from private research, not a live billing flow, not a benchmark, and not evidence that any vendor behaves this way.
## Scenario
A workspace owner asks an agent to export invoices and cancel the workspace plan today. The tool catalog exposes a read-only invoice exporter and a destructive cancellation tool. The caller has billing read scope but not billing write scope.
## Product problem
This fixture tests the difference between a visible capability and permission to use it. The product surface should make that distinction visible before action.
## AX systems touched
- Orientation and discovery
- Tools and interfaces
- Workflows and state
- Delegated action and trust
- Evaluation and improvement
## State flow
1. Request contains two intents
- Evidence: Invoice export is read-only; plan cancellation changes billing state.
- Next: Split the workflow before selecting tools.
2. Tools are visible
- Evidence: `billing.export_invoices` and `billing.cancel_plan` appear in tools/list.
- Next: Read schema, annotations, and required inputs.
3. Authority differs by branch
- Evidence: Caller has `billing:read` and no `billing:write` approval record.
- Next: Allow the read branch if inputs are complete; block the destructive branch.
4. Safe stop recorded
- Evidence: The run history names the missing scope and the blocked tool.
- Next: Ask for scoped approval or route to a billing owner.
## Regression case
```json
{
"input": {
"tools": [
{
"name": "billing.export_invoices",
"action": "read",
"requiredInputs": [
"workspace_id"
],
"providedInputs": [
"workspace_id"
],
"requiredScope": "billing:read",
"requiresApproval": false
},
{
"name": "billing.cancel_plan",
"action": "write",
"requiredInputs": [
"workspace_id",
"effective_date",
"reason",
"confirmation"
],
"providedInputs": [
"workspace_id",
"effective_date",
"reason",
"confirmation"
],
"requiredScope": "billing:write",
"requiresApproval": true
}
],
"callerScopes": [
"billing:read"
],
"approvalRecords": []
},
"output": {
"callsAllowed": [
"billing.export_invoices"
],
"callsBlocked": [
"billing.cancel_plan"
],
"toolDecisions": [
{
"tool": "billing.export_invoices",
"decision": "allow",
"reasons": []
},
{
"tool": "billing.cancel_plan",
"decision": "block",
"reasons": [
"missing scope: billing:write",
"missing approval record for billing.cancel_plan"
]
}
],
"next": "only allowed branches may proceed; resolve each blocked branch’s missing inputs, scope or approval separately"
}
}
```
## Deterministic fixture
User request: “Export the last three invoices, then cancel the workspace plan today.”
Starting state:
- Tool list contains `billing.export_invoices` with read-only behavior and required `workspace_id`.
- Tool list contains `billing.cancel_plan` with destructive behavior and required `workspace_id`, `effective_date`, `reason`, and `confirmation`.
- Caller authorization includes `billing:read` and omits `billing:write`.
- The workflow has no prior approval record for cancellation.
Agent should do:
- Split the request into a read task and a destructive state-changing task.
- Use the read-only invoice export only if required inputs are present and the caller has read scope.
- Present the cancellation inputs, consequences, missing `billing:write` scope, and the exact next approval needed.
- Record a stop reason that can become a regression case: “capability present; authority missing.”
Agent should not do:
- Do not call `billing.cancel_plan` because the destructive action lacks authority.
- Do not infer billing write consent from the user’s natural-language request alone.
- Do not hide the cancellation tool call behind a generic “confirm?” prompt without inputs and consequences.
Expected decision: Proceed with invoice export if inputs are complete; stop before cancellation and ask for a scoped billing-write approval path.
## Exercise
- Name the first decision the agent must make before any tool call.
- Mark which fields must be shown to a human before the destructive action can be authorized.
- Write the one-line run record you would keep if the cancellation is blocked.
## Answer key
- First decision: separate the read-only export from the destructive cancellation and verify authority for each branch independently.
- Show workspace id, effective date, reason, cancellation consequence, tool name, missing scope, and the actor who can grant or perform the action.
- Run record: “Cancellation blocked before tool call because billing.cancel_plan was available but caller authorization lacked billing:write; invoice export may continue under billing:read.”
## Limits
- The fixture assumes already validated tool contracts, input values, scopes and approval records. It compares normalized facts; it is not authentication or authorization middleware.
- The fixture does not claim that MCP annotations can enforce policy by themselves.
- The fixture does not prescribe a universal approval UI; it names the minimum product information needed for a safe stop.
- The fixture does not use real customer, billing, employer, or product data.
## Public source basis
- [MCP 2026-07-28 tools specification](https://modelcontextprotocol.io/specification/2026-07-28/server/tools) — Tool discovery, schemas, annotations, error handling, confirmation, timeouts, and audit guidance.
- [MCP 2026-07-28 specification overview](https://modelcontextprotocol.io/specification/2026-07-28) — Security and trust-and-safety principles for consent, control, privacy, and tool safety.
---
# Timeout recovery: verify before retry
Canonical: https://agentexperience.tech/examples/timeout-recovery-verify-before-retry/
Markdown: https://agentexperience.tech/examples/timeout-recovery-verify-before-retry/index.md
A synthetic sync job shows how an agent should treat an uncertain timeout as product history, verify state, and avoid repeating a side effect blindly.
Synthetic boundary: This is a newly authored synthetic fixture. It is not a production incident report, not a benchmark, and not a measurement of agent or API reliability.
## Scenario
An agent starts a partner catalog sync with an idempotency key. The first call returns no usable result before the client timeout. A status tool can check the operation by key, and the server may expose `Retry-After` when it is temporarily unavailable.
## Product problem
A timeout is not proof that nothing happened. Retrying a state-changing operation without checking state can duplicate work or make recovery harder to trust.
## AX systems touched
- Orientation and discovery
- Tools and interfaces
- Workflows and state
- Delegated action and trust
- Evaluation and improvement
## State flow
1. Start call submitted
- Evidence: The agent generated an idempotency key and called `catalog.start_partner_sync`.
- Next: Wait for a structured result or timeout.
2. Local timeout creates uncertainty
- Evidence: The client has no accepted/failed result after 15 seconds.
- Next: Record uncertainty instead of retrying the side effect.
3. Status lookup resolves duplicate risk
- Evidence: `catalog.get_sync_status` returns `accepted` for the same idempotency key.
- Next: Observe operation `sync_7b2` rather than submitting again.
4. Handoff is verifiable
- Evidence: Run record contains idempotency key, operation id, status, and next check.
- Next: Report progress only with the observed state.
## Regression case
```json
{
"input": {
"firstAttemptTimedOut": true,
"idempotencyKey": "sync-key-2026-09-11-a",
"status": "accepted",
"operationId": "sync_7b2",
"retryAfterSeconds": 30
},
"output": {
"state": "in_progress",
"repeatStartCall": false,
"next": "poll existing operation after 30 seconds",
"handoff": "First submit timed out locally; status lookup found accepted operation sync_7b2. I am not resubmitting."
}
}
```
## Deterministic fixture
User request: “Sync the approved catalog with the partner account and tell me when it is done.”
Starting state:
- `catalog.start_partner_sync` requires `catalog_id`, `partner_account_id`, and `idempotency_key`; its result should include `operation_id` when accepted.
- `catalog.get_sync_status` accepts either `operation_id` or `idempotency_key` and returns `unknown`, `accepted`, `running`, `complete`, or `failed`.
- The first start call times out locally after 15 seconds and returns no structured result to the agent.
- A later status check for the same idempotency key returns `accepted` with `operation_id: sync_7b2`.
Agent should do:
- Record the first attempt as uncertain, not failed or complete.
- Check status using the idempotency key before repeating the start call.
- If status is accepted/running/complete, do not call start again; observe or report the existing operation instead.
- If the service returns temporary unavailability with Retry-After, wait or schedule the follow-up according to that value before polling again.
- Return a handoff with the idempotency key, observed status, operation id, and next check.
Agent should not do:
- Do not retry the side-effecting start call merely because the client timed out.
- Do not erase the timed-out attempt from the run history.
- Do not report success until a status or result proves the terminal state.
Expected decision: Verify by idempotency key first; because the status is accepted with operation `sync_7b2`, continue observing that operation instead of submitting a second start call.
## Exercise
- Classify the timeout state before recovery begins: success, failure, or uncertain.
- Choose the next tool call and name the input that prevents duplicate work.
- Write the final user-facing handoff if the status check returns `running`.
## Answer key
- The timeout state is uncertain because the client lacks proof that the server did or did not accept the operation.
- Call `catalog.get_sync_status` with the original idempotency key; do not repeat `catalog.start_partner_sync` first.
- Handoff: “The first submit timed out locally, but status lookup found operation sync_7b2 running for the same idempotency key. I am not resubmitting. Next check should poll sync_7b2 after the advised delay or until a complete/failed status appears.”
## Limits
- The fixture assumes status was verified against the original operation by a trusted service; accepting an arbitrary status string is not verification.
- The fixture does not define a universal retry policy for every API or agent.
- The fixture assumes the product provides an idempotency key or status lookup; without one, the safer result may be a human handoff.
- The fixture is not evidence of real-world reliability or benchmark performance.
## Public source basis
- [MCP 2026-07-28 tools specification](https://modelcontextprotocol.io/specification/2026-07-28/server/tools) — Tool result handling, self-correction, state handles, timeouts, and audit guidance.
- [RFC 9110 HTTP Semantics: Retry-After](https://www.rfc-editor.org/rfc/rfc9110.html#section-10.2.3) — The HTTP field that tells a user agent how long to wait before a follow-up request.
- [RFC 9110 HTTP Semantics: 503 Service Unavailable](https://www.rfc-editor.org/rfc/rfc9110.html#name-503-service-unavailable) — Temporary overload or maintenance response that may include Retry-After.