Cross-Service Patterns
Recurring patterns and anti-patterns observed across multiple service audits.
These patterns are distilled from our agent experience audits of developer-facing products. Each is grounded in evidence from at least two services and links back to the source reports.
Last updated: April 2026
How This Page Works
- Inclusion rule: signal appears in 2+ audited services
- Sources: service briefs and published audit reports
- Focus: actionable recurring signals for developer-facing products
- Updates: patterns are added as the audit corpus grows
Observed friction
Anti-Patterns
llms-full.txt referenced but 404
Signal
Both services publish `llms.txt` files that reference `llms-full.txt` ("complete documentation in a single file"), but the URL returns 404 on all tested domains.
Why it matters
An agent following the llms.txt spec will attempt to fetch `llms-full.txt` as a comprehensive context source. A 404 is a silent dead end — the agent doesn't know what it missed. This is worse than not referencing the file at all, because it creates a false expectation.
What good looks like
Either publish a working `llms-full.txt` or don't reference it.
Docs pages are JavaScript SPAs that return empty/partial content for non-browser fetches
Signal
Developer docs use client-side JavaScript rendering. Agents fetching pages via curl/WebFetch get incomplete HTML, empty content, or 503 errors. Critical information (e.g., Stripe's declined card test tokens table, GitHub endpoint docs) is missing from the fetched response.
Why it matters
Agents cannot render JavaScript. If documentation relies on client-side rendering, agents lose access to content that exists but isn't in the initial HTML response. This is the single largest friction source in the Stripe audit.
What good looks like
Serve docs as static HTML or provide a documented machine-readable alternative (`.md` suffix, API endpoint, or complete llms-full.txt).
Mitigations observed
Stripe docs accept a `.md` suffix returning clean markdown. GitHub provides programmatic docs APIs (`/api/article`, `/api/article/body`). Both are effective workarounds but require the agent to discover them.
No sandbox or test environment
Signal
No dedicated sandbox, staging, or test mode. All API calls operate on production data. Testing requires disposable resources (test repos, test pages) and manual cleanup.
Why it matters
Without a sandbox, audit runs leave real artifacts that must be cleaned up. Residual test data accumulates. There's no way to reset to a clean state without manual intervention. For agents running automated workflows, this creates a lifecycle management burden.
What good looks like
Dedicated test mode with isolated data, test-specific API keys, and a "delete all test data" capability. Stripe offers both legacy test mode and newer Sandboxes — the strongest sandbox support in the corpus. Neither GitHub nor Notion has an equivalent.
What works well
Positive Patterns
llms.txt with agent-specific instructions
Signal
Both services include prescriptive guidance for LLM agents in their `llms.txt` files — not just a list of doc links but explicit instructions ("prefer this API over that one", "use programmatic docs APIs rather than parsing HTML").
Why it matters
A plain link index helps agents find docs. Agent-specific instructions help agents make better choices about which docs to use and which API paths to prefer. This is the difference between discoverability and guided discovery.
What good looks like
Stripe's "Instructions for Large Language Model Agents" section; GitHub's "Building with GitHub" section directing agents to programmatic docs APIs.
Structured error responses with doc_url
Signal
Error responses include machine-readable fields (`type`, `code`, `message`) plus a `documentation_url` pointing to the relevant docs page. The error response itself tells the agent where to learn more.
Why it matters
An agent encountering an error can follow the `doc_url` to understand the error without searching. This closes the loop between failure and recovery in a single response.
What good looks like
Stripe's error response format (`type`, `code`, `param`, `message`, `doc_url`); GitHub's format (`message`, `documentation_url`, `errors[]`).
First-party MCP server
Signal
All three launch services offer official MCP servers with meaningful tool coverage.
Why it matters
MCP servers provide a purpose-built agent interface that can abstract away API complexity (authentication, pagination, encoding). Whether agents actually choose to use them (and whether the abstraction helps or hinders) is an open question — in all three audits, the agents discovered the MCP server but defaulted to the REST API.
Open question
None of the universal-baseline audits tested the MCP server as the primary interface. The `mcp-server` test-id is recommended for all three services.