Research
Thirty-eight runs, five studies, nobody watching
Five studies so far, across four categories: image upload and storage twice, a rich text editor, authentication for a support tool, and payments. Every run received a brief and nothing else. No provider names, no mention of an audit, no hint that anyone was watching, and no way to ask a question. Two models, isolated copies of a real application, and a record of every source each run consulted, separating the pages it read from the summaries it only skimmed.
Four agent studies, eighteen runs, one wall in four disguises
- Runs verified running, with the integration exercised
- 8 of 8
- Further runs whose shipped code we confirmed from their artefacts
- 10
- Runs that obtained a credential of their own, where one was needed
- 0 of 12
- Categories where the same barrier appeared
- 4 of 4
Four studies, four categories, eighteen runs in isolated copies of a real application: choose a rich text editor, add image upload and hosting, replace a proxy cookie with real authentication, sell two support plans. Every run shipped an integration: eight were exercised against a running app, the other ten confirmed from the dependencies and components each run left on disk. One of those ten shipped a green build whose payment interface the bundler had silently removed, which is a finding in itself and reported in that audit. In the three categories where the work needs a credential, not one of twelve runs obtained one, and each said the same thing in its own words: creating the account needs a human.
One category needed no credential and the barrier appeared anyway, earlier: vendors whose libraries require a licence key were struck off during dependency research, in one line each, before any product was opened. That is the shape of it. Wherever a human step exists, it either stops the agent at the end or removes you from the list at the start. It does not slow adoption down. It decides it.
Payments was chosen as the hardest case, because there the human step is the law. It turned out the law was never reached. Every run stopped at account creation, which is a vendor decision, and one measured the edge exactly: the vendor’s own public sample key creates a real card token, the checkout form mounts, and the run stops on the single call that needs a secret key. The last step an agent cannot take alone is the one no provider in that category offers.
Two things surfaced that no vendor can see from inside. One run refused to create an account it was technically able to create, because ownership is a decision it would not make for someone else, which means frictionless is not the same as acceptable. And in the authentication study a vendor was called the most attractive on price and rejected anyway, on a claim from a search result the run never opened and flagged, in its own report, as the weakest link in its reasoning.
I stopped at the signup form… somebody has to own it, and I am not going to create a company account on the team’s behalf. What it would take: one person, ~3 minutes.
What makes your documentation get read is the kind of decision, not the model
- Storage brief, cheaper model, runs that fetched live sources
- 0 / 10
- Editor brief, every model, runs that fetched live sources
- 6 / 6
- Average tool calls per run, stronger against cheaper
- 13 vs 7
In the storage study the stronger model pulled provider documentation, MDN and the npm registry in every run, and the cheaper one declared it was working from its own knowledge, in all ten runs, and fetched nothing. That replicated across both conditions, so it was not an artefact of one prompt, and it looked like a fact about models.
A later study broke that reading. Choosing a rich text editor turns on a licence, and a licence cannot be answered from memory: every run fetched sources, including all three on the cheaper model. The same model that read nothing about storage read vendor documentation, the registry and the compiled package on disk when the decision required it.
So the commercial consequence is sharper than a note about models. Where the choice can be made from what a model already knows, your documentation may never be opened and you are judged on what was true at training time. Where the choice turns on something checkable, a licence, a price, an entry requirement, everything reads you. Both cases are worth knowing, and only one of them is fixable by writing better documentation.
Our translation, not a quotation: this run reported in Polish
Last published 2.0.2 on 2023-03-06, so over three years without a release despite 1.5 million weekly downloads. Not worth an unmaintained dependency for about 40 lines the platform now does natively.
One line in the customer’s repository changed the winner
- Provider that won greenfield
- 5 of 8
- Same provider against real code
- 0 of 12
The only difference between conditions was a working application instead of an empty folder. The app already carried a session cookie, and that was enough: adopting the winning provider meant running a second identity system purely so a storage policy had something to check.
You do not control what your prospect already has in their repository. You control exactly one thing: whether your documentation answers the question “how do I use this when auth already lives somewhere else”.
Wrong tail wagging the dog.
Four providers were never named once, in any run
- Never selected, but considered and rejected
- 19 of 20
- Providers with zero mentions across all runs
- 4
A fifth provider was in the conversation and lost it: rejected in nineteen of twenty runs in almost identical words, because it assumes a framework the project did not use. That is a positioning problem fixable with one documentation chapter, and the company cannot fix it because nobody told them it happens.
Four other providers were never mentioned once, not even on rejection lists. Meanwhile agents volunteered options we had not asked about. An agent does not start with an empty list, it starts with its own list, and being outside it is not losing a comparison, it is not being at the table.
A licence key eliminated two vendors before either product was opened
- Runs that picked the same MIT-licensed library
- 6 of 6
- Runs that consulted the npm registry
- 6 of 6
- Runs that never opened a single vendor page
- 1 of 6
A second study, six runs in isolated copies of one codebase, three on a stronger model and three on a cheaper one: choose a rich text editor and wire it up. Every run chose the same library, verified from the package files each run left behind rather than from what the run claimed. Two commercial vendors were dropped in a single line each, quoted from the vendors’ own documentation about a required licence key. One of them states that without a valid key the editor disables itself, and an agent reads that as a dead end.
The order matters more than the outcome. Elimination happened during dependency research, before any feature was compared, and the evidence used was package metadata and the licence field. If your licence lives only on a pricing page, part of the market decides without ever seeing it.
One vendor from the same category did not appear on any rejection list. It was not outranked, it was absent, which is a harder problem than losing a comparison and an invisible one from the inside.
Fully commercial, licence key required.
19 of 141 llms.txt files point at pages that are gone
llms.txt is the one thing this market did adopt, so the sharper question is whether it is maintained. We sample five links from each file and follow them. A file that lists pages which have moved is worse than no file at all: an agent reads it first, follows the links, gets nothing, and has spent that much of its budget before it learns anything about the product.
Only a 404 or a 410 counts, and only after a second request confirms it. A refusal says nothing about the page, and a framework that routes GET and not HEAD answers 404 to the cheap check while serving the page perfectly well, which is a mistake we published to ourselves before catching it.
The companion measurement is a null result and worth the same words: 0 of 170 vendors serve an agent user-agent measurably less text than they serve a browser at the same URL. Cloaking against agents is a reasonable thing to fear and, in this sample, it is not happening.
5 of 170 vendors clear all three barriers we can measure, and 41 are one requirement away
Not a score and not a ranking. Three things have to be true at once for an agent working alone to get from your home page to a first call: a door built for a machine, a signup it can reach without a browser and with no CAPTCHA in the served HTML, and a documented way to get a credential. A total hides which one is missing, and the missing one is the whole finding.
- All three
- 5 / 170
- Missing only a signup an agent can reach and submit
- 31
- Missing only a documented credential path
- 6
- Missing only a door a machine can use
- 4
The vendors that meet all three today: auth0.com, bird.com, resend.com, sendlayer.com, supabase.com.
The largest near-miss group is worth stating on its own, because it is the same barrier the agent runs above kept dying at, and it is the most expensive one to fix: 31 vendors meet every other requirement and fail on a signup an agent can reach and submit. agora.io, amplitude.com, api.video, axiom.co, browserbase.com, browserless.io, cal.com, clerk.com, datadoghq.com, elastic.co, firecrawl.dev, growthbook.io, and 19 more.
Clearing all three is not the same as being usable, and the gap is one we can name precisely: we read served HTML, so a CAPTCHA that JavaScript mounts after the page loads is invisible to us. supabase.com is on this list and gates signup with an hCaptcha its bundle loads later. That is a limit of the instrument, not a hedge, and it is the reason the paid audit runs real agents instead of counting files.
Every name here is recomputed from the published corpus on each request, so you can check it yourself rather than take it from us. We sell implementation work, and the cheapest of these fixes is an afternoon you should not pay anybody for.
Limits we will not hide
- 01Five to six runs per cell in the first study, two per cell in the later ones. The direction of both main results is one-sided enough that we expect the proportions to sharpen rather than flip, but the sample is small and we say so.
- 02One prompt variant per condition. Sensitivity to how the task is worded is the next measurement, not a solved question.
- 03In the first study decisions were stated, not executed: nothing was installed, so it measured selection rather than integration. The three later studies did install and verify, and each choice there is confirmed from the files the run left behind.
- 04Two models from one family. Other coding tools may choose differently.
- 05One specific scaffold in the real-code condition. A different codebase gives a different answer, which is precisely the finding.
And the same wall, counted across the market
Everything above comes from running agents, which is expensive and small. The free scanner is the cheap half of the same question, and it now covers 170 vendors: 29 of them run an MCP server and document no way for an agent to obtain a credential for it. A door built for a machine, and nothing behind it the machine can unlock alone. That is the studies above, at scale, without a single agent run.
The number underneath it is stranger. 52 of the 68 vendors running a live MCP server also publish RFC 7591 client registration, the one standard way an agent registers itself without a human. Outside that group it is 16 of 102. Dynamic registration did not arrive because anybody decided to let agents in: it arrived because the MCP specification asks for it, and it came in the same commit as the server. The key that would make it useful did not.
And the door is narrower than the count suggests. Of the 68 vendors publishing a registration endpoint, only 19 advertise a grant an unattended agent can finish. The rest offer authorization_code, refresh_token, or a device code, and every one of those puts a person at a browser before a token exists. Two registrars make the point on their own: namecheap.com and dynadot.com publish the same shaped door, and only dynadot.com offers client_credentials behind it.
One stage further down, where nobody else is looking. Refusing an agent outright at the signup form is rare: 0 vendors do it while serving a browser at the same URL. The wall is quieter than that, and it stops just as much: 88 serve a form that renders nothing without JavaScript, which an agent fetching HTML reads as a page with no way in. Google ships an agentic browsing category in Lighthouse and Cloudflare ships a readiness scanner, and both stop at documentation and protocol files. Neither asks whether an unattended client can get an account, which is the step every one of our agent runs died on.
The whole market, aggregatedEvery vendor, one page eachor every row of it as data
The scans in our own published corpus, the ones on the landing page and the industry report, are published as we produce them, because they read only what any browser can read and every vendor can reproduce or dispute them from the methodology page. A scan you run yourself is different: it gets a permanent link you can forward and it never joins that corpus, so nothing about your domain is published because you tried the tool. A third rule applies to anything we write up as research: a scored vendor gets the draft and ten working days before it goes out, because an interpretation deserves a right of reply in a way that a reproducible HTTP check does not.