Nine popular TypeScript libraries publish documentation aimed at LLMs. The filename is a convention; the contents are not. Same name, a 2,500× spread in size, and no agreement on whether the file contains documentation or a list of links to it.
| Library | llms.txt | llms-full.txt | Usable without fetching? |
|---|---|---|---|
| Prisma | 2,450 · 71% links | 6,915 · 0% links | yes — prose, and small |
| tRPC | 15,699 · 0% links | 599,762 · 2% links | yes — the index itself is prose |
| Zod | 21,522 · 94% links | 259,341 · 1% links | the full file, at ~65k tokens |
| Vercel AI SDK | 2,217 · 33% links | 5,673,960 · 2% links | full file is ~1.4M tokens |
| Drizzle ORM | 37,377 · 84% links | 3,553,515 · 1% links | full file is ~890k tokens |
| Next.js | 8,792 · 58% links | — (404) | index only; docs index is 96% links |
| Stripe | 93,150 · 87% links | — (404) | index only |
| TanStack Query | 11,396 · 78% links | identical file | index only; "full" is the same bytes |
| React Router | — (404) | — (404) | nothing published |
"% links" = share of non-empty lines carrying a markdown link. Token estimates at ~4 chars/token.
For tRPC, llms.txt is documentation — 15k of prose, no links. For Zod, the same filename is 94% links: a table of contents. For TanStack Query, llms-full.txt is byte-identical to llms.txt, so the "full" version is the index. For Next.js and Stripe, it 404s entirely.
Sizes span 2,217 characters to 5,673,960 — a factor of about 2,500. Nothing in the name tells a consumer which of those it is about to receive.
The practical consequence: an agent cannot write generic code to consume these. Fetching llms.txt gets you documentation from one library and a link list from the next, and fetching llms-full.txt gets you 7KB from Prisma or 5.7MB from the Vercel AI SDK. Any tool that uses these has to special-case each library — which is the thing a convention exists to prevent.
A coding agent with web access can follow a link index. A model answering from its context alone cannot — it gets a list of URLs it has no way to open. So for the common case of a single request with documentation pasted in, only the self-contained prose files do anything at all: Prisma's 7KB llms-full.txt, tRPC's 15KB index, and Zod's full file if you are willing to spend ~65k tokens on it.
Everything else is either a menu with no kitchen behind it, or too large to put in a prompt.
Prisma installs its documentation into your project. From v7.9, prisma init writes a tree of skill files into .agents/skills/ — small, task-scoped, and already on disk, so no fetching is involved. It is the only mechanism in this survey that works for a model with no network access, and the only one this site has been able to measure directly.
The measurement is worth reading alongside this, because it is not a clean win. Prisma's shipped docs move their score from 87 to 93 — but the pack an agent would route to by name for the failing task fixes nothing at all, and one failure survives every document they ship. The Prisma scorecard has the numbers.
Every figure above is one request. Nothing here needs to be taken on trust:
curl -sL https://prisma.io/llms-full.txt | wc -c curl -sL https://ai-sdk.dev/llms-full.txt | wc -c
The survey script is in the repo (scripts/survey-agent-docs.mjs) and writes data/agent-docs.json. Re-run it and any of these numbers can be checked, or shown to have changed.
SDKProof measures whether AI coding agents write a library's current API or an older one they remember. The obvious fix a maintainer reaches for is to ship documentation for agents. This is what that looks like today across nine libraries — and mostly, it is not yet something a model can use.
Surveyed 6 August 2026. These files change; the script re-runs in seconds.