From 6e382171124f674ab291f4413ed5917b461da698 Mon Sep 17 00:00:00 2001 From: dacharyc Date: Sun, 13 Sep 2026 17:01:42 -0400 Subject: [PATCH 1/8] Add v0.6.0: five new checks, RAG ingestion guidance, related surfaces Adds bot-protection-interference, page-size-transfer, single-fetch-completeness, markdown-link-portability, and embedded-data-serialization (23 -> 28 checks), two interaction effects, the Related Surfaces scope statement, and the Serving RAG Ingestion Pipelines section. Co-Authored-By: Claude Fable 5 --- README.md | 17 +- SPEC.md | 743 +++++++++++++++++++++++++++++-- site/config/_default/params.toml | 2 +- site/sharing-image.html | 14 +- site/static/sharing.png | Bin 78706 -> 85206 bytes 5 files changed, 712 insertions(+), 64 deletions(-) diff --git a/README.md b/README.md index 37105f2..ba1ae7e 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ docs agent-friendly. The spec focuses on meeting the technical constraints of agent platforms (truncation limits, content negotiation, discovery); it does not consider qualitative evaluation of content. -**Status**: Draft (v0.5.1) +**Status**: Draft (v0.6.0) **Full spec**: [SPEC.md](SPEC.md) | **Website**: [agentdocsspec.com](https://agentdocsspec.com) @@ -17,7 +17,7 @@ were built for human readers, and agent access patterns are fundamentally different: - Agents retrieve URLs from training data instead of navigating your site -- Web fetch pipelines silently truncate content (Claude Code at ~100K chars; +- Web fetch pipelines truncate content without warning (Claude Code at ~100K chars; the MCP Fetch reference server at just 5K chars by default) - HTML-to-markdown conversion is lossy, and inline CSS can consume the entire truncation budget before content even starts @@ -25,21 +25,22 @@ different: - Cross-host redirects and JavaScript redirects break agent access entirely The result: agents frequently fail to get the documentation content they need, -fall back on training data, or silently work with partial information. +fall back on training data, or work with partial information without +knowing it. ## What the Spec Covers -The spec defines **23 checks across 7 categories**: +The spec defines **28 checks across 7 categories**: | Category | Checks | What it evaluates | |----------|--------|-------------------| | Content Discoverability | 7 | Discovery index exists, is valid, fits in a single fetch, links resolve, links point to markdown, embedded directives in HTML and markdown pointing agents to `llms.txt` | | Markdown Availability | 2 | `.md` URL support, content negotiation via Accept headers | -| Page Size | 4 | Rendering strategy (SPA/CSR detection), markdown size, HTML size (pre/post conversion), content start position | -| Content Structure | 3 | Tabbed content serialization blowup, section header quality, code fence validity | +| Page Size | 6 | Rendering strategy (SPA/CSR detection), markdown size, HTML size (pre/post conversion), served transfer size, content start position, single-fetch completeness | +| Content Structure | 5 | Tabbed content serialization blowup, section header quality, code fence validity, markdown link portability, embedded data serialization | | URL Stability | 2 | Soft 404 detection, redirect behavior | | Observability | 3 | `llms.txt` coverage, markdown/HTML content parity, cache header hygiene | -| Authentication | 2 | Auth gate detection, alternative access paths for gated content | +| Authentication | 3 | Auth gate detection, alternative access paths for gated content, bot-protection interference with automated fetching | Each check has defined pass/warn/fail criteria, an automation level, and severity. See the [Checks Summary](SPEC.md#checks-summary) in the full spec. @@ -65,7 +66,7 @@ If you can only do a few things, these have the highest impact: ## Test Your Docs [`afdocs`](https://afdocs.dev) is a companion CLI tool -and Node.js library that implements this spec. It runs all 23 checks against +and Node.js library that implements this spec. It runs the automated checks against your documentation site and reports what's working, what's not, and what to fix. ```bash diff --git a/SPEC.md b/SPEC.md index 611af1a..02da746 100644 --- a/SPEC.md +++ b/SPEC.md @@ -3,8 +3,8 @@ | | | |--------------|--------------------------------------------------------------| | **Status** | Draft | -| **Version** | 0.5.1 | -| **Date** | 2026-05-08 | +| **Version** | 0.6.0 | +| **Date** | 2026-09-13 | | **Author** | Dachary Carey + community contributors | | **URL** | https://agentdocsspec.com | | **Repository** | https://github.com/agent-ecosystem/agent-docs-spec | @@ -16,7 +16,7 @@ Documentation sites are increasingly consumed by coding agents rather than human readers, but most sites are not built for this access pattern. Agents hit truncation limits, get walls of CSS instead of content, can't follow cross-host redirects, and don't know about emerging discovery mechanisms like -`llms.txt`. This spec defines 23 checks across 7 categories that evaluate how +`llms.txt`. This spec defines 28 checks across 7 categories that evaluate how well a documentation site serves agent consumers. It is grounded in empirical observation of real agent workflows and is intended as a shared standard for documentation teams, tool builders, and platform providers. @@ -39,19 +39,48 @@ This spec does **not** target: their own retrieval pipelines that may or may not resemble the web fetch pipelines described here. - **RAG pipelines** that pre-index documentation into vector stores. These - ingest content at build time, not at query time, so truncation limits and - real-time fetch behavior are less relevant. + retrieve at query time from an index built ahead of time, so truncation + limits and real-time fetch behavior are less relevant. Their *ingestion* + step is a different matter: it fetches from the site like any automated + client, and many of this spec's checks serve it directly. See + [Serving RAG Ingestion Pipelines](#serving-rag-ingestion-pipelines). The findings and checks in this spec are grounded in empirical observation of coding agents. Some recommendations (like providing `llms.txt` and serving markdown) will benefit other consumers too, but the pass/warn/fail criteria are calibrated for the coding agent use case. +### Related Surfaces + +This spec covers the **delivery** of web-served documentation: whether agents +can discover, fetch, and receive content intact. Agent-friendly documentation +has at least two other surfaces, deliberately out of scope here and planned +as companion specifications as the evidence base for them matures: + +- **Content composition**: what documentation should *contain* to serve + agents well. Factual consistency across pages, structure and density + suited to machine consumption, and how representation across a corpus + shapes what agents effectively know about a product. These properties + require semantic evaluation rather than the mechanical verification this + spec's checks are built on. +- **Repository-local documentation**: docs serving a coding agent that + works *inside* a repository (`README`, `docs/` directories, agent-facing + instruction files). The agent discovers content with local tools (grep, + find, directory listings) and consumes it through file reads, so almost + none of the web spec's checks transfer: there is no fetch pipeline, no + truncation-by-summarizer, and no llms.txt; greppability and file layout + do the work that discovery checks do on the web. + +Keeping these separate protects what makes each credible: this spec's checks +are mechanically verifiable against a live site, and that property should +not be diluted as adjacent guidance develops. + ## Background Agents don't use docs like humans. They retrieve URLs from training data rather than navigating table-of-contents structures. They struggle with HTML-heavy -pages, silently lose content to truncation, and don't know about emerging +pages, lose content to truncation with no indication anything was cut, and +don't know about emerging standards like `llms.txt` unless explicitly told. These checks codify the patterns that empirically help or hinder agent access to documentation content. @@ -150,6 +179,15 @@ Each check has: - **Automation**: Whether the check can be fully automated, partially automated (heuristic), or is advisory only. +The canonical source of this spec is a single document +([SPEC.md](https://github.com/agent-ecosystem/agent-docs-spec/blob/main/SPEC.md) +in the repository). The website serves it as per-category pages under +[agentdocsspec.com/spec/web/](https://agentdocsspec.com/spec/web/), following +this spec's own progressive disclosure recommendation: the full document +outgrew the 100,000-character truncation threshold its own checks are built +around, so it now practices what it prescribes. Each page stays well under +the 50,000-character pass threshold. + ### Check Dependencies Some checks depend on the results of others: @@ -171,9 +209,18 @@ Some checks depend on the results of others: - `auth-alternative-access` only runs if `auth-gate-detection` returns warn or fail (the site must have auth-gated content for alternative access paths to be relevant). +- `bot-protection-interference` has no prerequisites, but it inverts the + usual dependency direction: when it returns warn or fail, results from + every multi-page check should be flagged as computed from a partial sample + (see the [Bot Protection Degrading Scan Reliability](#bot-protection-degrading-scan-reliability) + interaction effect). It is also evaluated from evidence gathered across the + entire scan rather than run as a discrete Category 7 step. - `markdown-content-parity` only runs if `markdown-url-support` or `content-negotiation` passes (the site must serve markdown for this check to apply). +- `single-fetch-completeness` and `markdown-link-portability` only run if + `markdown-url-support` or `content-negotiation` passes (both evaluate + properties of served markdown). Implementations should run checks in category order (1 through 7) and skip dependent checks when their prerequisites fail. @@ -559,7 +606,10 @@ the nesting pattern goes further by distributing content across multiple files. - **Warn**: Ensure the directive appears near the top of every markdown page, not just some. - **Fail**: Add a blockquote near the top of each markdown page (e.g., - "> For the complete documentation index, see [llms.txt](/llms.txt)"). + "> For the complete documentation index, see + [llms.txt](https://example.com/llms.txt)"). Use an absolute URL; see + `markdown-link-portability` for why relative links are fragile in + served markdown. - **Automation**: Heuristic. Fetch the markdown version of sampled pages (via `.md` URL or content negotiation) and search for patterns like links to `llms.txt`, phrases like "documentation index", or blockquote directives @@ -622,9 +672,9 @@ which agents consume far more effectively than HTML. ## Category 3: Page Size and Truncation Risk -These checks evaluate whether page content fits within the processing limits of -agent web fetch pipelines. Truncation is silent: the agent doesn't know it's -working with partial data. +These checks evaluate whether page content fits within the transfer and +processing limits of agent web fetch pipelines. Truncation is silent: the +agent doesn't know it's working with partial data. ### How Agents Get Content @@ -653,6 +703,23 @@ Because different agents hit different paths, this spec defines size checks for **both** the markdown response (if available) and the HTML response. A site that's only optimized for the markdown path is leaving most agents behind. +Pipelines also differ in **when** they cut oversized content, and the order +determines which measurement predicts the agent's experience: + +1. **Convert, then truncate.** Scripts and styles are stripped, HTML is + converted to markdown, and the size limit applies to the converted output. + Post-conversion size (`page-size-html`) predicts these pipelines. +2. **Truncate, then convert** (or ingest raw HTML directly). The size limit + applies to the bytes as served, so inline scripts and serialized data + consume the budget before any content does. Served size + (`page-size-transfer`) predicts these pipelines. +3. **Capped fetch.** Independent of processing order, some tools cap the + response bytes they will read, so a page can fail at the transfer layer + before any conversion happens. Served size predicts this too. + +A page can score well on one measurement while failing agents on the other, +which is why the spec measures both. + For empirical observations of how specific platforms (Claude, Cursor, Copilot, Gemini, Windsurf Cascade, and others) handle retrieval, truncation, and summarization in practice, see [Agent platform comparisons](https://agentdocsspec.com/platforms/). @@ -792,6 +859,78 @@ summarization in practice, see [Agent platform comparisons](https://agentdocsspe conversion ratio (e.g., "505KB HTML -> 12KB markdown (98% boilerplate)") as a useful signal for site owners. +### `page-size-transfer` + +- **What it checks**: The served byte size of the HTML document response: + the response body after transfer decoding (decompression), which is what + an agent's HTTP client hands to its processing pipeline. Subresources + (linked CSS, JavaScript, images) are not counted, because agents generally + don't fetch them. Inline scripts, styles, and serialized data payloads + embedded in the document are counted, because agents can't avoid receiving + them. +- **Why it matters**: `page-size-html` measures what survives HTML-to-markdown + conversion, which models pipelines that strip scripts and convert before + truncating. Served size measures what every agent pays before any + processing happens, and it fails differently: + - **Truncate-first and raw-ingestion pipelines** consume script payload as + content. For them, serialization overhead isn't invisible; it is the + page. + - **Fetch caps** apply to response bytes, not converted output. A page can + convert to a few kilobytes of clean markdown and still exceed the byte + budget of the tool fetching it (Claude Code's fetch buffer caps at + ~10MB). + - **Bandwidth and latency costs** apply to every fetch regardless of + pipeline, and multi-page reading sessions multiply them. + + Modern server-rendering frameworks can make the gap between served bytes + and content arbitrarily large. In measurements of production documentation + sites on one hosted platform, pages shipped 75-84% of their bytes as + serialized framework payloads inside inline script tags: component trees, + resolved metadata, and a complete duplicate of the page's markdown source. + Served-bytes-to-content ratios ran from 40:1 to 200:1. Those pages score + well on `page-size-html` because conversion strips the payload, while + every agent fetching them transfers half a megabyte to several megabytes + per page. +- **Result levels**: + - **Pass**: Served size under 1MB. + - **Warn**: Served size between 1MB and 10MB. No documented cap is + exceeded, but truncate-first and raw-ingestion pipelines are consuming + mostly non-content bytes, and multi-page sessions pay a real bandwidth + and latency cost. + - **Fail**: Served size over 10MB. This exceeds the only well-documented + transfer cap (Claude Code's fetch buffer); content beyond the cap is + unreachable regardless of how the pipeline processes it. +- **Recommended action**: + - **Warn**: Identify what the non-content bytes are; in practice they are + usually inline serialization (framework hydration payloads, embedded + duplicate page source, resolved data objects) visible in the page + source. Avoid shipping the same content twice in different formats, + load large data payloads on demand, and confirm markdown variants are + available and discoverable so agents have a cheaper path. + - **Fail**: Same actions, urgently. At this size, at least one major + platform cuts the page off at the transfer layer. + - Markdown availability gives agents that discover it an escape hatch but + does not reduce what HTML-path agents transfer; fixing the served + payload remains important. +- **Automation**: Full. Fetch with an `Accept-Encoding` typical of agent + HTTP clients, decode the response, and measure the decoded body. + Implementations may also report the on-the-wire (compressed) size where + available; serialized payloads compress well, so wire size understates + the processing burden. +- **Report details**: Show served bytes alongside the post-conversion + content size from `page-size-html`, and report the ratio between them + (e.g., "3.4MB served -> 29KB content (~120:1)"). A high ratio on a large + page is an architecture signature (hydration payloads, embedded duplicate + content) rather than a content problem; it tells the site owner the fix + lives in framework configuration, not in the docs themselves. +- **Notes**: This check complements `rendering-strategy`, which catches pages + that ship too little server-rendered content. This check catches the + opposite failure: pages that render content fine but ship many times its + weight in serialization overhead. Byte-level caps are less documented than + character-level truncation limits, so the default thresholds here are + conservative and should be configurable (see + [Appendix A](#appendix-a-known-platform-truncation-limits)). + ### `content-start-position` - **What it checks**: How far into the **post-conversion** content (by character @@ -820,6 +959,76 @@ summarization in practice, see [Agent platform comparisons](https://agentdocsspe by the site should not have boilerplate preamble; if it does, that's a separate issue worth flagging but not something this check targets. +### `single-fetch-completeness` + +- **What it checks**: Whether a markdown response delivers its complete + content in one fetch, and when it doesn't, whether the continuation is + machine-followable: declared where agents will see it, linked with an + absolute URL, and actually working. +- **Why it matters**: Pagination is application-level truncation, and it is + quieter than the platform truncation this category otherwise measures. A + paginated markdown response looks complete: it is well-formed, ends + cleanly, and returns 200. The signals that it is partial are easy for + agent pipelines to lose: + - **Summarization pipelines** process fetched content through a smaller + model before the orchestrating agent sees it. A pagination note may or + may not survive summarization, and the summarizer cannot perform a + follow-up fetch itself; the orchestrator would have to notice the note + and choose to fetch again. + - **Trailing pagination notes** sit at the end of the content, which is + the first region lost to platform truncation. A truncated response + loses the only indication that it was also paginated. + - **RAG pipelines** chunk fetched content for retrieval. A pagination + marker lands in one chunk, unrelated to the content it describes, and + effectively disappears. + + This failure was observed in production on a model catalog's markdown + variant: 100 of 102 entries shown, a pagination note at the bottom of the + file, a continuation URL that was root-relative rather than absolute, and, + when fetched, a continuation response that returned an empty body. An + agent fetching that page gets 98% of the catalog and no working way to + learn what's missing. + + Notably, pagination in a markdown variant is often inherited from the + HTML UI rather than needed by the markdown itself. The catalog above + paginates at 100 entries per page, but the complete set serializes to + roughly 32,000 characters, comfortably under this spec's 50,000-character + pass threshold. The markdown variant imported an interaction pattern from + a surface that has interaction; markdown doesn't. +- **Result levels**: + - **Pass**: The response is complete in one fetch (no pagination signals + detected), or pagination exists and the continuation is declared at the + top of the content with an absolute URL that resolves to the next + segment. + - **Warn**: Pagination exists and the continuation works, but is fragile: + declared only at the bottom of the content, linked with a relative URL, + or discoverable only from response headers. + - **Fail**: The content is partial and the continuation is missing, + relative and unresolvable, or broken (non-success status, empty body, + or a soft 404). +- **Recommended action**: + - **Warn**: Move the continuation declaration to the top of the content + (before anything truncation could remove) and make continuation links + absolute. + - **Fail**: First ask whether the markdown variant needs pagination at + all: complete content that fits within this spec's size thresholds + should be served in one response, even when the HTML UI paginates. If + pagination is genuinely necessary, declare it at the top with absolute + links, and verify the continuation URLs actually serve content. +- **Automation**: Heuristic. Detect pagination signals in markdown + responses: "N of M" phrasing, links or instructions containing pagination + query parameters (`?page=`, `?offset=`), "next page" link text, and + `Link: rel="next"` response headers. When signals are found, fetch the + continuation and verify it returns substantive content of the expected + representation. Absence of signals is treated as complete; a page that + omits content with no marker at all is not detectable by this + check (see `markdown-content-parity` for the cross-representation + comparison that can catch it). +- **Notes**: Only applies to markdown responses (`.md` variants, content + negotiation, and `llms.txt`-linked markdown). HTML pagination is an + interaction pattern agents share with human readers and is out of scope + here. + --- ## Category 4: Content Structure @@ -915,6 +1124,122 @@ heuristics. outside the site owner's control, though implementations may optionally flag them as informational findings. +### `markdown-link-portability` + +- **What it checks**: Whether links in served markdown are absolute URLs, and + whether a sample of them resolves to the representation they promise (a + `.md` link returns markdown content, not an HTML error page). +- **Why it matters**: Relative URL resolution is well-defined (RFC 3986), but + it requires knowing the base URL, and agent pipelines routinely lose it. A + browser always carries the base; markdown fetched by an agent passes + through summarization models, gets chunked for RAG, or gets pasted into a + context where the source URL is gone. Once the base is lost, a + root-relative link is unreconstructable and a path-relative link is + meaningless. This spec already recommends absolute URLs between `llms.txt` + levels for the same reason; served markdown deserves the same rule. + + Link verification must go beyond status codes. In one observed production + case, a catalog's markdown variant emitted over 100 well-formatted links + that all pointed into a wrong internal path prefix, apparently a build-time + substitution error. Every link returned 200 with a body. The body was an + HTML SPA shell whose only acknowledgment of failure was a serialized + framework error digest inside script payload: a soft 404 served as HTML at + a `.md` URL. A checker (or agent) that tested status codes alone would + conclude the links worked; checking the `Content-Type` header alone would + have caught it. +- **Result levels**: + - **Pass**: Links are absolute URLs, and sampled links resolve to the + expected representation. + - **Warn**: Links are root-relative (resolvable while the base URL is + known, fragile once it isn't), or sampled links resolve with minor + mismatches (e.g., a `.md` link that redirects to an HTML page with the + right content). + - **Fail**: Links are path-relative, or sampled links are broken: hard + 404s, soft 404s, or a content type that contradicts the link (`.md` + links returning HTML shells). +- **Recommended action**: + - **Warn**: Emit absolute URLs when generating markdown variants; the + site's canonical host is known at build time. + - **Fail**: Fix the link generation first, then make the links absolute. + Verify generated links in CI by fetching a sample and checking both + status and content type; a link set that is generated is a link set + that can break wholesale. +- **Automation**: Full. Parse links from served markdown, classify as + absolute, root-relative, or path-relative, resolve a sample against the + fetch URL, and verify status, `Content-Type`, and soft-404 heuristics + (reusing the detection from `http-status-codes`). +- **Notes**: Applies to markdown served via `.md` URLs and content + negotiation. `llms.txt` link quality is covered separately by + `llms-txt-links-resolve`; implementations should apply the same + representation verification there, since status-code-only resolution + misses soft 404s. + + **Why this check exempts the HTML path.** Relative links in HTML are + correct web practice (they are what makes staging domains, mirrors, and + CDN setups work), and the HTML path does not need the site's help: a + pipeline converting HTML to markdown still holds the fetch URL at + conversion time, so resolving relative links is the pipeline's job, with + full information. The base URL is only lost downstream of conversion. + Served markdown is different on both ends: the generator knows the + canonical host, so absolute links are free to produce, and on the + best-case consumption path (direct delivery of `text/markdown` under the + summarization threshold) the site's bytes reach the model verbatim, with + no conversion step where anything could be resolved. Tool builders + implementing fetch pipelines should resolve relative links during + HTML-to-markdown conversion, and likewise when ingesting raw HTML; + converted content with relative links has all the same failure modes as + served markdown once it leaves the converter. + +### `embedded-data-serialization` + +- **What it checks**: Whether machine-generated bulk data (large uniform + tables, inline JSON or data blobs, base64 payloads) dominates a page's + converted content, and attributes the page's size to the specific elements + responsible. +- **Why it matters**: Dynamic widgets (compatibility matrices, model + catalogs, spec browsers, pricing tables) flatten into static content when + a page is rendered for agents. The result can be a page whose size wildly + exceeds what its author believes they wrote: the author sees a few + paragraphs and a widget; the built page carries hundreds of serialized + rows under them. The size checks in Category 3 catch the symptom but + don't explain it, and without attribution the person who can fix the page + has no idea what to fix, or that anything is wrong at all. + + In one measured production case, a reference page served 302KB of HTML of + which 64% was table markup, including a single generated table of 218 + rows. The page converts to roughly 83,000 characters (this spec's warn + band), while its non-table prose totals about 17,000 characters. The + page's truncation risk is entirely a property of its generated tables, + which is invisible in an aggregate size number. +- **Result levels**: + - **Pass**: No bulk-data elements detected, or bulk elements are present + but the page passes the Category 3 size checks regardless. + - **Warn**: Bulk-data elements are the dominant contributor (for example, + over half of converted content) to a page that lands in the size + checks' warn band. + - **Fail**: Bulk-data elements are the dominant contributor to a page + that exceeds the size checks' fail threshold. Content after the bulk + element is beyond the truncation point for most platforms. +- **Recommended action**: Bulk data is often legitimate content (a support + matrix is the point of a support-matrix page), so the goal is structure, + not removal. Split large generated tables across per-section pages, + provide filtered or queryable views, load embedded data blobs on demand, + and place prose before bulk elements so truncation removes data rows + rather than explanation. Report the attribution to content authors: + a page that an author experiences as two paragraphs should not ship as a + hundred kilobytes without the author knowing. +- **Automation**: Heuristic. After HTML-to-markdown conversion (same + pipeline as `page-size-html`), detect bulk elements: tables above a row + threshold with uniform row structure, fenced or inline JSON blobs above a + size threshold, and base64 runs. Report each element's share of the + converted content. Thresholds for "bulk" need calibration against real + pages and should be configurable. +- **Notes**: This is the data-widget sibling of + `tabbed-content-serialization`, which covers the same flattening failure + for tab and accordion UI. Together with `content-start-position` (where + content sits relative to boilerplate), these checks explain *why* a page + fails the Category 3 size checks, not just that it does. + --- ## Category 5: URL Stability and Redirects @@ -1015,7 +1340,7 @@ HTML content without anyone noticing. remove known-intentional gaps from the sitemap before calculating coverage. - **Notes**: Not every sitemap page belongs in `llms.txt`. Sites - intentionally exclude content for a variety of reasons: changelog and + intentionally exclude content for good reasons: changelog and release notes archives that would bloat the file, older product versions that aren't relevant to current development, API reference pages that aren't useful in markdown form, or directory pages that just link to @@ -1052,8 +1377,8 @@ HTML content without anyone noticing. However, in some cases, content divergence may be intentional. Some sites intentionally serve different content to different audiences, providing agent-optimized markdown alongside human-optimized HTML. In those cases, - divergence is a feature, not a bug. The check's value is surfacing the - divergence so site owners can confirm it reflects their intent. + the divergence is deliberate. The check's value is surfacing it so site + owners can confirm it reflects their intent. - **Result levels** (based on the percentage of content segments in the HTML version that are missing from the markdown version, after normalizing whitespace, case, and formatting): @@ -1116,6 +1441,20 @@ HTML content without anyone noticing. - **Curated**: The site intentionally serves different content with no tag-level signal. Set thresholds to 0 to make the check informational. + **Dynamically generated pages.** Pages built from data (catalogs, model + listings, compatibility matrices) can diverge between representations + without anyone deciding they should, because the HTML and markdown + variants are rendered by different pipelines with different defaults. In + one observed production case, a catalog's HTML showed 98 items while its + markdown variant listed 102: the HTML applied a default filter the + markdown dump didn't, and the markdown was additionally paginated. For + pages with repeated structure, implementations should compare item counts + between representations, and should distinguish the likely causes when + counts differ: a default filter on the dynamic view (divergent by + configuration), pagination on either side (divergent by windowing, see + `single-fetch-completeness`), or staleness (one representation generated + from older data). Each has a different owner and fix. + ### `cache-header-hygiene` - **What it checks**: Whether `llms.txt` and markdown endpoints have cache @@ -1180,10 +1519,13 @@ code. ## Category 7: Authentication and Access -These checks evaluate whether documentation is accessible to agents without -requiring interactive authentication. Docs behind login walls are effectively +These checks evaluate whether documentation is accessible to agents at all: +without requiring interactive authentication, and without infrastructure-level +barriers aimed at automated clients. Docs behind login walls are effectively invisible to coding agents, which has significant implications as agent-assisted -development becomes a standard workflow. +development becomes a standard workflow. Bot-protection systems can produce the +same invisibility through a different mechanism, and often without the site +owner realizing documentation is affected. ### Why This Matters @@ -1222,6 +1564,17 @@ dramatically better experience with the competitor's product. The agent can read the competitor's API reference, find code examples, and verify patterns in real time. For your product, the agent is guessing. +Bot protection produces the same invisibility through a different mechanism, +and usually without a deliberate decision. Auth gating is at least a policy +choice about who may read the docs; bot enforcement is typically configured +site-wide for security reasons, with documentation caught as collateral. It +is also harder for the site owner to see. A login wall fails every request +the same way, but behavioral enforcement can pass a casual spot check and +then throttle, challenge, or stall the sustained multi-page sessions that +real agent work produces. A site owner who verifies their docs by loading a +page in a browser, or fetching a single URL with curl, will conclude +everything works. + ### `auth-gate-detection` - **What it checks**: Whether documentation pages require authentication to @@ -1300,6 +1653,103 @@ in real time. For your product, the agent is guessing. - **Notes**: Only applies when `auth-gate-detection` returns warn or fail. If docs are publicly accessible, this check is skipped. +### `bot-protection-interference` + +- **What it checks**: Whether bot-protection systems (CDN bot management, WAF + rules, behavioral rate enforcement) interfere with automated fetching of + documentation content. +- **Why it matters**: Coding agents are automated clients. Bot management tuned + for scraper and attack traffic frequently cannot distinguish an agent + fetching docs on a developer's behalf from abuse, and its enforcement modes + are worse for agents than a clean block because the failures are invisible: + - **Challenge interstitials served as 200.** A "verifying your browser" page + returned with a success status is a soft 404 from the agent's perspective; + the agent extracts challenge boilerplate instead of documentation and may + present it as an answer. + - **Tarpits.** The server accepts the connection and returns headers, then + holds the response body open indefinitely. The agent's fetch stalls until + its own timeout with no error to reason about, and a multi-page reading + session dies partway through. + - **Volume-triggered throttling or blocking.** Enforcement engages only + after several requests, so the first pages of a session succeed and later + ones fail. Because enforcement is typically stateful (keyed to IP or + client fingerprint) and decays over time, single-page spot checks look + healthy while sustained agent sessions fail. + + These modes are not hypothetical. In one observed production case, a CDN's + bot management responded to a sustained documentation scan by holding + response bodies open indefinitely. Single-request probes of the same pages + looked healthy throughout, and enforcement decayed after a cooldown period. +- **Result levels**: + - **Pass**: A sustained multi-page scan completes with no evidence of + interference: no challenge pages, no stalled response bodies, no + volume-correlated failures. Because detection is heuristic and + enforcement is stateful, pass means no interference was observed during + this run, not a guarantee that bot protection will never engage. + - **Warn**: Intermittent interference. Some requests during a sustained scan + are challenged, stalled, or blocked while others succeed. + - **Fail**: Sustained fetching is effectively blocked. Once enforcement + triggers, most requests are challenged, stalled, or denied. +- **Recommended action**: + - **Warn**: Identify which bot-management layer is challenging or stalling + some requests and exempt public documentation routes from behavioral + enforcement. Intermittent interference means enforcement thresholds sit + close to normal agent reading cadence, so small configuration changes + (or ordinary traffic growth) can tip it into sustained blocking. + - **Fail**: Treat public documentation paths as automation-friendly in + bot-management configuration. Exempt docs routes from behavioral + enforcement, or scope enforcement to interactive product surfaces. Where + limits are genuinely needed, prefer an explicit `429` with `Retry-After` + over tarpits or silent blocks: a `429` is an error the agent can see, + report, and react to, while a tarpit or challenge page fails invisibly. + Never serve challenge interstitials with a 200 status. +- **Automation**: Heuristic. Interference generally cannot be probed directly + without generating the sustained traffic that triggers it, so implementations + should detect it as a byproduct of a normal scan: response bodies that stall + past the request timeout, challenge-page heuristics in fetched content, or + failure rates that climb as the scan progresses. Unlike other checks, this + one has no fetch phase of its own; it is evaluated from evidence accumulated + across the entire run rather than probed as a discrete step. + + A scan that follows this spec's guidance in + [A Note on Responsible Use](#a-note-on-responsible-use) already resembles a + realistic multi-page agent reading session, and that is the correct + calibration, because that workload is exactly what this check predicts. If a + respectful scan at agent-like cadence triggers enforcement, that is the + finding, not a scan artifact. Implementations should not escalate traffic to + deliberately provoke enforcement. Because enforcement is stateful and decays, + results vary across runs; a clean run does not prove absence. +- **Notes**: When interference is detected mid-scan, results from other + multi-page checks are computed on whatever sample survived. Implementations + should surface a run-level warning that scores may not reflect the full site + (see the [Bot Protection Degrading Scan Reliability](#bot-protection-degrading-scan-reliability) + interaction effect). This check identifies the condition; it does not + prescribe that sites disable bot protection. Like auth gating, this is a + tradeoff the site owner should make deliberately, with awareness that coding + agents are among the clients being blocked. + + Results are also vantage-point dependent. Enforcement is commonly keyed to + client reputation (IP range, ASN, TLS fingerprint), so a scan run from + datacenter infrastructure may trigger enforcement that residential traffic + would not. This mirrors real agent traffic, which originates from the same + mix of vantage points: some harnesses fetch from the developer's own + connection, while others route web fetches through vendor server + infrastructure or run in cloud-hosted sessions, both of which present + datacenter IPs to the site. A datacenter-origin scan is representative of + that second class of agent traffic, not a false positive. Implementations + should note the scan's network context alongside results; even a coarse + classification (a developer machine versus CI or cloud infrastructure) + lets a reader interpret enforcement findings correctly. Reports should + carry the classification rather than the scanner's raw IP address, since + reports are often shared. + + This check is distinct from robots.txt and AI user-agent blocking, which + this spec intentionally excludes (see + [Appendix B](#robotstxt-and-ai-user-agent-blocking)). Declared crawling + policy is invisible to most coding agents because they don't identify + themselves; behavioral enforcement affects them precisely because their + traffic is indistinguishable from the automated traffic it targets. + ### Making Private Docs Agent-Accessible This section offers non-normative guidance for organizations that gate their @@ -1358,29 +1808,34 @@ a first-class agent experience with their private documentation. | ID | Category | Automation | Severity | Depends On | |----|----------|------------|----------|------------| -| `llms-txt-exists` | Content Discoverability | Full | High | -- | -| `llms-txt-valid` | Content Discoverability | Full | Medium | `llms-txt-exists` | -| `llms-txt-size` | Content Discoverability | Full | High | `llms-txt-exists` | -| `llms-txt-links-resolve` | Content Discoverability | Full | High | `llms-txt-exists` | -| `llms-txt-links-markdown` | Content Discoverability | Full | Medium | `llms-txt-exists` | -| `markdown-url-support` | Markdown Availability | Full | High | -- | -| `content-negotiation` | Markdown Availability | Full | Medium | -- | -| `rendering-strategy` | Page Size | Heuristic | High | -- | -| `page-size-markdown` | Page Size | Full | High | `markdown-url-support` or `content-negotiation` | -| `page-size-html` | Page Size | Full | High | -- | -| `content-start-position` | Page Size | Heuristic | High | -- | -| `tabbed-content-serialization` | Content Structure | Heuristic | High | -- | -| `section-header-quality` | Content Structure | Heuristic | Medium | `tabbed-content-serialization` | -| `markdown-code-fence-validity` | Content Structure | Full | Medium | `markdown-url-support` or `content-negotiation` | -| `http-status-codes` | URL Stability | Full | Medium | -- | -| `redirect-behavior` | URL Stability | Partial | Medium | -- | -| `llms-txt-directive-html` | Content Discoverability | Heuristic | High | -- | -| `llms-txt-directive-md` | Content Discoverability | Heuristic | Medium | `markdown-url-support` or `content-negotiation` | -| `llms-txt-coverage` | Observability | Heuristic | High | `llms-txt-exists` | -| `markdown-content-parity` | Observability | Heuristic | Medium | `markdown-url-support` or `content-negotiation` | -| `cache-header-hygiene` | Observability | Full | Medium | -- | -| `auth-gate-detection` | Authentication | Full | High | -- | -| `auth-alternative-access` | Authentication | Partial | Medium | `auth-gate-detection` (warn or fail) | +| [`llms-txt-exists`](#llms-txt-exists) | Content Discoverability | Full | High | -- | +| [`llms-txt-valid`](#llms-txt-valid) | Content Discoverability | Full | Medium | `llms-txt-exists` | +| [`llms-txt-size`](#llms-txt-size) | Content Discoverability | Full | High | `llms-txt-exists` | +| [`llms-txt-links-resolve`](#llms-txt-links-resolve) | Content Discoverability | Full | High | `llms-txt-exists` | +| [`llms-txt-links-markdown`](#llms-txt-links-markdown) | Content Discoverability | Full | Medium | `llms-txt-exists` | +| [`markdown-url-support`](#markdown-url-support) | Markdown Availability | Full | High | -- | +| [`content-negotiation`](#content-negotiation) | Markdown Availability | Full | Medium | -- | +| [`rendering-strategy`](#rendering-strategy) | Page Size | Heuristic | High | -- | +| [`page-size-markdown`](#page-size-markdown) | Page Size | Full | High | `markdown-url-support` or `content-negotiation` | +| [`page-size-html`](#page-size-html) | Page Size | Full | High | -- | +| [`page-size-transfer`](#page-size-transfer) | Page Size | Full | Medium | -- | +| [`content-start-position`](#content-start-position) | Page Size | Heuristic | High | -- | +| [`single-fetch-completeness`](#single-fetch-completeness) | Page Size | Heuristic | Medium | `markdown-url-support` or `content-negotiation` | +| [`tabbed-content-serialization`](#tabbed-content-serialization) | Content Structure | Heuristic | High | -- | +| [`section-header-quality`](#section-header-quality) | Content Structure | Heuristic | Medium | `tabbed-content-serialization` | +| [`markdown-code-fence-validity`](#markdown-code-fence-validity) | Content Structure | Full | Medium | `markdown-url-support` or `content-negotiation` | +| [`markdown-link-portability`](#markdown-link-portability) | Content Structure | Full | Medium | `markdown-url-support` or `content-negotiation` | +| [`embedded-data-serialization`](#embedded-data-serialization) | Content Structure | Heuristic | Medium | -- | +| [`http-status-codes`](#http-status-codes) | URL Stability | Full | Medium | -- | +| [`redirect-behavior`](#redirect-behavior) | URL Stability | Partial | Medium | -- | +| [`llms-txt-directive-html`](#llms-txt-directive-html) | Content Discoverability | Heuristic | High | -- | +| [`llms-txt-directive-md`](#llms-txt-directive-md) | Content Discoverability | Heuristic | Medium | `markdown-url-support` or `content-negotiation` | +| [`llms-txt-coverage`](#llms-txt-coverage) | Observability | Heuristic | High | `llms-txt-exists` | +| [`markdown-content-parity`](#markdown-content-parity) | Observability | Heuristic | Medium | `markdown-url-support` or `content-negotiation` | +| [`cache-header-hygiene`](#cache-header-hygiene) | Observability | Full | Medium | -- | +| [`auth-gate-detection`](#auth-gate-detection) | Authentication | Full | High | -- | +| [`auth-alternative-access`](#auth-alternative-access) | Authentication | Partial | Medium | `auth-gate-detection` (warn or fail) | +| [`bot-protection-interference`](#bot-protection-interference) | Authentication | Heuristic | High | -- | ## Interaction Effects @@ -1411,7 +1866,7 @@ benefit. **Checks involved**: `llms-txt-exists`, `llms-txt-size` **Observed behavior**: A site provides llms.txt, but the file exceeds agent -context limits. Agents see the first portion of the file and silently lose +context limits. Agents see the first portion of the file and lose everything after the truncation point: links, structure, and entire sections become invisible. Quality assessments of the truncated portion (link resolution, coverage, markdown links) don't reflect what agents actually @@ -1461,12 +1916,30 @@ back on training data or seek secondary sources that may be inaccurate or outdated. Authentication is a legitimate choice for many documentation sites. This -pattern is notable not because auth is wrong, but because it means agents have -no path to current content at all. Even partial alternatives (a public llms.txt +pattern is notable because it means agents have no path to current content +at all. Even partial alternatives (a public llms.txt as a navigational index, ungated API references, docs shipped with the SDK/package) significantly improve the agent experience compared to a complete access barrier. +### Bot Protection Degrading Scan Reliability + +**Checks involved**: `bot-protection-interference`, plus every multi-page check + +**Observed behavior**: Behavioral bot enforcement engages partway through a +scan. Requests that would have succeeded in isolation begin to stall, get +challenged, or fail, and every check still running is now scoring whatever +sample survives. The site's scores can look reasonable while being computed +from a fraction of the intended pages. + +This pattern has two victims. Agents doing multi-page reading sessions lose +access mid-session, which is the site-side problem the check exists to +surface. And the assessment itself degrades: per-check "failed to fetch" +counts are scattered and easy to miss, so implementations should aggregate +fetch failures at run level and flag results prominently when the failure +rate is high (for example, above 20% of page fetches). A flagged run is +still useful evidence; it just measures a smaller sample than it appears to. + ### Oversized Pages Without Markdown Escape **Checks involved**: `page-size-html`, `markdown-url-support`, plus the @@ -1474,15 +1947,103 @@ undiscoverable markdown pattern above **Observed behavior**: Pages exceed agent context limits on the HTML path, and there is no discoverable markdown path for agents to get smaller -representations. Agents silently receive truncated content on these pages with -no alternative available. +representations. Agents receive truncated content on these pages with no warning and no +alternative available. When pages are large but markdown is available and discoverable, agents that support content negotiation or follow llms.txt directives can access smaller representations. Without that escape hatch, truncation is unavoidable. +### Dynamic Content Rendered Statically + +**Checks involved**: `markdown-content-parity`, `single-fetch-completeness`, +`markdown-link-portability`, `embedded-data-serialization`, plus the +Category 3 size checks + +**Observed behavior**: A page whose content is dynamic (a filterable +catalog, a data-driven matrix, a widget-rendered listing) is flattened into +static markdown for agents, and the flattening fails in several ways at +once. There are four characteristic failure directions: too much (widget +data dumped wholesale into the content), too little (UI pagination +inherited into a format that didn't need it), inconsistent (default filters +or staleness making representations disagree), and unnavigable (generated +links that assume a browser context, or that are broken wholesale by the +generation pipeline). + +One observed production catalog page exhibited all four simultaneously: +the HTML showed 98 items under a default filter while the markdown listed +102, the markdown was paginated with a trailing note and a continuation +URL that returned an empty body, and every entry link pointed into a wrong +generated path prefix that soft-404ed. Each individual check would flag +one symptom; the underlying cause is shared. The markdown variant is a +second rendering pipeline, and it needs the same QA the HTML pipeline +gets. Implementations that detect several of these failures on the same +generated page should present them as one pipeline problem rather than +four independent findings. + --- +## Serving RAG Ingestion Pipelines + +This section offers non-normative guidance for sites whose documentation is +consumed by retrieval-augmented generation systems: documentation Q&A bots, +docs MCP servers, and internal knowledge bases that chunk and embed content +into a vector store. RAG retrieval happens at query time from that index, +but ingestion has to get the content from somewhere first, and there are +two common paths: + +- **Web ingestion** crawls the published site. It fetches like any + automated client, so the properties that make a site agent-friendly at + fetch time also make it index-friendly at ingestion time. The check + mapping below applies to this path. +- **Source ingestion** reads the documentation source files (the markdown + or MDX in the docs repository) directly, bypassing delivery entirely. + This is common for teams indexing their own docs, and it is often a + workaround for a site that is hostile to crawling; a site that passes + this spec's checks makes web ingestion a viable alternative. Source + ingestion trades delivery problems for build-system problems: the + ingester is effectively a second renderer, and build-time constructs + (component tags, includes, frontmatter, variable substitution) reach the + index unrendered unless the pipeline handles them the way the site + generator does. The result can be an index of content nobody publishes. + These are source-format processability concerns, out of scope for this + spec; note that they are also distinct from the repository-local + documentation surface in [Related Surfaces](#related-surfaces), which + concerns agents working interactively inside a repository, not batch + pipelines reading its files. + +This guidance is informed by consumer reports from production RAG builds. + +How existing checks serve web ingestion: + +- **Crawl manifest**: `llms-txt-exists` and `llms-txt-coverage` give + ingesters a complete, curated URL set instead of sitemap heuristics, and + the descriptions provide per-page metadata for free. +- **Clean source format**: `markdown-url-support` and `content-negotiation` + let pipelines ingest markdown directly and skip HTML extraction, which is + the largest source of ingestion noise. Sites failing `rendering-strategy` + or `content-start-position` poison their own index: boilerplate and empty + shells get embedded and then retrieved. +- **Chunk boundaries**: `section-header-quality` matters doubly for RAG. + Chunkers split on section boundaries, and a chunk's header may be the + only context it carries into retrieval. Self-describing headers produce + self-describing chunks; generic headers ("Step 1") produce chunks that + retrieve poorly and confuse whatever reads them. Content that flows + across section boundaries without markers chunks badly in practice. +- **Incremental re-indexing**: `cache-header-hygiene` is more valuable for + RAG than for live fetch. `ETag` and `Last-Modified` let pipelines detect + what changed and re-embed only that, instead of re-crawling wholesale or + serving a stale index. +- **Complete, navigable content**: `single-fetch-completeness` and + `markdown-link-portability` failures propagate undetected into an index. A + paginated catalog ingests as a partial catalog; broken generated links + embed as broken references. + +What this spec does not cover: embedding-friendly prose density, guidance on +writing self-contained sections, and metadata schemas for content +categorization. Those are content-composition concerns; see +[Related Surfaces](#related-surfaces). + ## Appendix A: Known Platform Truncation Limits The thresholds used in this spec's pass/warn/fail levels are derived from @@ -1505,6 +2066,13 @@ Code). Implementations should allow these thresholds to be configurable so users can evaluate against specific platform limits or adjust as new data becomes available. +`page-size-transfer` uses byte thresholds (1MB warn, 10MB fail) rather than +character thresholds, because it measures the response before any processing. +The 10MB fail line is anchored to Claude Code's documented fetch buffer; +byte-level caps on other platforms are less documented than character-level +truncation limits, so these defaults are conservative and should likewise be +configurable. + ### Known Platform Limits Compare platform architecture and truncation limits in [Platforms](https://agentdocsspec.com/platforms/). @@ -1530,8 +2098,8 @@ intentionally excluded, along with the rationale. `robots.txt` can block known AI training crawlers (`ClaudeBot`, `GPTBot`, `Google-Extended`, etc.) that identify themselves via user-agent strings. -However, this is a crawling policy concern, not an agent-friendliness concern, -and the two audiences are distinct. +However, this is a crawling policy concern rather than an agent-friendliness +concern, and the two audiences are distinct. Training crawlers and coding agents are different request paths with different user-agents. The agents this spec targets (coding assistants fetching docs @@ -1556,6 +2124,12 @@ indistinguishable from human traffic. A site blocking `ClaudeBot` in fetching a docs page. Since this spec is about making documentation accessible to agents in real-time workflows, `robots.txt` configuration is out of scope. +Behavioral bot protection is a different matter. Because most coding agents +don't identify themselves, bot-management systems that act on traffic behavior +rather than declared identity affect them even when crawling policy does not. +That failure mode is in scope; see +[`bot-protection-interference`](#bot-protection-interference). + ### GitHub Raw URL Fallback GitHub raw URLs (`raw.githubusercontent.com/...`) were observed to be the @@ -1563,8 +2137,8 @@ single most reliable documentation access pattern in practice. When official docs failed (rate-limited, JavaScript-rendered, or hard to navigate), GitHub was almost always a viable fallback. -However, this is a fallback strategy for agent users, not a property of the -documentation site itself. Whether a project's docs source happens to be on +However, this is a fallback strategy for agent users rather than a property +of the documentation site itself. Whether a project's docs source happens to be on GitHub, and whether the raw content there is usable as standalone documentation, is outside the control of a docs site evaluation. This spec focuses on what documentation site owners can do to improve agent @@ -1602,6 +2176,79 @@ welcome. ## Changelog +### v0.6.0 (2026-09-13) + +- Added `bot-protection-interference` (Category 7: Authentication and Access). + Detects bot-protection systems interfering with automated documentation + fetching: challenge interstitials served as 200, tarpits that return headers + and then stall the response body indefinitely, and volume-triggered + throttling or blocking. Grounded in an observed production case where CDN + bot management responded to a sustained scan by holding response bodies + open; single-request probes looked healthy throughout, and enforcement + decayed after a cooldown. Detection is heuristic, observed as a byproduct + of a normal scan rather than a directed probe. +- Added the [Bot Protection Degrading Scan Reliability](#bot-protection-degrading-scan-reliability) + interaction effect: when enforcement engages mid-scan, other checks score + the surviving sample, so implementations should aggregate fetch failures at + run level and flag results when the failure rate is high. +- Expanded the Category 7 introduction to cover infrastructure-level access + barriers alongside authentication. +- Added `page-size-transfer` (Category 3: Page Size and Truncation Risk). + Measures the served byte size of the HTML document response, a failure + mode `page-size-html`'s post-conversion measurement cannot see. Grounded + in measurements of production documentation sites where 75-84% of page + bytes were serialized framework payloads (component trees, resolved + metadata, embedded duplicate markdown source), with served-bytes-to-content + ratios from 40:1 to 200:1. Scored on served bytes; the ratio is reported + as a diagnostic. +- Documented the pipeline distinction in Category 3's "How Agents Get + Content" section: convert-then-truncate, truncate-then-convert (or raw + ingestion), and capped fetch, and which size measurement predicts each. +- Added `single-fetch-completeness` (Category 3: Page Size and Truncation + Risk). Detects pagination in markdown responses and verifies the + continuation is machine-followable. Grounded in an observed production + catalog whose markdown variant showed 100 of 102 entries with a trailing + relative continuation URL that returned an empty body, while the complete + set would have fit well under the 50,000-character pass threshold. +- Added `markdown-link-portability` (Category 4: Content Structure). Links + in served markdown should be absolute and should resolve to the + representation they promise, verified beyond status codes (content type + and soft-404 heuristics). Grounded in an observed production catalog + whose generated markdown links all pointed into a wrong path prefix and + soft-404ed as HTML SPA shells at `.md` URLs while returning 200. +- Added `embedded-data-serialization` (Category 4: Content Structure). + Attributes page size to machine-generated bulk elements (large uniform + tables, inline data blobs). Grounded in a measured production reference + page: 302KB of HTML, 64% table markup including a single 218-row + generated table, converting to ~83,000 characters while its non-table + prose totaled ~17,000. +- Extended `markdown-content-parity` notes with guidance for dynamically + generated pages: compare item counts between representations and + distinguish default-filter divergence, pagination windowing, and + staleness as causes. +- Added the [Dynamic Content Rendered Statically](#dynamic-content-rendered-statically) + interaction effect: the four characteristic ways a dynamic page flattens + badly into static markdown (too much, too little, inconsistent, + unnavigable), observed together on a single production catalog page. +- Added the [Related Surfaces](#related-surfaces) subsection to Scope, + naming the planned companion specifications (content composition, + repository-local documentation) and the boundary that keeps this spec's + checks mechanically verifiable. +- Added the [Serving RAG Ingestion Pipelines](#serving-rag-ingestion-pipelines) + informational section, mapping existing checks to RAG ingestion needs + (crawl manifest, clean source, chunk boundaries, incremental + re-indexing), informed by consumer reports from production RAG builds. + The Scope section's RAG exclusion now distinguishes query-time retrieval + (out of scope) from ingestion (served by this spec). +- Restructured the website serving of the spec: the full document exceeded + the 100,000-character truncation threshold its own checks warn about, so + it is now served as per-category pages under `/spec/web/`, with `/spec/` + becoming a landing page for this and future companion specifications. + The canonical source remains a single SPEC.md in the repository. This + breaks previously published deep URLs deliberately, in exchange for a + namespace that accommodates the companion specs. +- Check count: 23 → 28. + ### v0.5.1 (2026-05-08) - Moved per-platform truncation data out of Appendix A into a new diff --git a/site/config/_default/params.toml b/site/config/_default/params.toml index cb7dd2f..bf79d48 100644 --- a/site/config/_default/params.toml +++ b/site/config/_default/params.toml @@ -1,7 +1,7 @@ colorScheme = "congo" defaultAppearance = "dark" autoSwitchAppearance = true -description = "A specification defining 23 checks across 7 categories for evaluating how well documentation sites serve coding agents." +description = "A specification defining 28 checks across 7 categories for evaluating how well documentation sites serve coding agents." mainSections = ["spec"] images = ["sharing.png"] diff --git a/site/sharing-image.html b/site/sharing-image.html index e37a90e..8130aad 100644 --- a/site/sharing-image.html +++ b/site/sharing-image.html @@ -74,7 +74,7 @@

Agent-Friendly Documentation Spec

-

23 checks across 7 categories

+

28 checks across 7 categories

@@ -97,13 +97,13 @@

Agent-Friendly Documentation Spec

- - + + - - + + @@ -117,8 +117,8 @@

Agent-Friendly Documentation Spec

- - + +
Page Size4Rendering strategy, markdown size, HTML size, content start position6Rendering strategy, markdown size, HTML size, transfer size, content start, completeness
Content Structure3Tabbed content blowup, header quality, code fence validity5Tabbed content blowup, header quality, code fences, link portability, data serialization
URL Stability
Authentication2Auth gate detection, alternative access paths3Auth gate detection, alternative access, bot-protection interference
diff --git a/site/static/sharing.png b/site/static/sharing.png index 005f4b86f64d061c2f721db368622ed9cac92388..b61c2a57283c4451e8d704eb196553d2c24a0fb1 100644 GIT binary patch literal 85206 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 literal 78706 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⁣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 Date: Sun, 13 Sep 2026 17:01:43 -0400 Subject: [PATCH 2/8] Serve the spec as per-category pages under /spec/web/ The full document outgrew the 100K truncation threshold its own checks warn about. SPEC.md stays the canonical source; split_spec.py splits it at build time with absolute cross-page links. /spec/ becomes a landing page for the spec family. Co-Authored-By: Claude Fable 5 --- .gitignore | 2 +- site/content/_index.md | 14 +- site/content/platforms/_index.md | 6 +- site/content/spec/_index.md | 39 ++++ site/copy_spec_and_build | 26 +-- site/layouts/partials/llms-directive.md | 2 +- site/split_spec.py | 252 ++++++++++++++++++++++++ site/static/llms.txt | 18 +- 8 files changed, 327 insertions(+), 32 deletions(-) create mode 100644 site/content/spec/_index.md create mode 100644 site/split_spec.py diff --git a/.gitignore b/.gitignore index 79d44c9..c6eee10 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ site/public/ site/resources/ -site/content/spec/_index.md +site/content/spec/web/ site/build_and_sync .DS_Store diff --git a/site/content/_index.md b/site/content/_index.md index 171825d..398cfae 100644 --- a/site/content/_index.md +++ b/site/content/_index.md @@ -10,25 +10,25 @@ of CSS instead of content, can't follow cross-host redirects, and don't know about emerging discovery mechanisms like `llms.txt`. The result: agents frequently fail to get the documentation they need, fall -back on training data, or silently work with partial information. +back on training data, or work with partial information without knowing it. -This spec defines **23 checks across 7 categories** that evaluate how well a +This spec defines **28 checks across 7 categories** that evaluate how well a documentation site serves agent consumers. | Category | Checks | What it evaluates | |----------|--------|-------------------| | Content Discoverability | 7 | Discovery index exists, is valid, fits in a single fetch, links resolve, links point to markdown, embedded directives in HTML and markdown pointing agents to `llms.txt` | | Markdown Availability | 2 | `.md` URL support, content negotiation via Accept headers | -| Page Size | 4 | Rendering strategy (SPA/CSR detection), markdown size, HTML size (pre/post conversion), content start position | -| Content Structure | 3 | Tabbed content serialization blowup, section header quality, code fence validity | +| Page Size | 6 | Rendering strategy (SPA/CSR detection), markdown size, HTML size (pre/post conversion), served transfer size, content start position, single-fetch completeness | +| Content Structure | 5 | Tabbed content serialization blowup, section header quality, code fence validity, markdown link portability, embedded data serialization | | URL Stability | 2 | Soft 404 detection, redirect behavior | | Observability | 3 | `llms.txt` coverage, markdown/HTML content parity, cache header hygiene | -| Authentication | 2 | Auth gate detection, alternative access paths for gated content | +| Authentication | 3 | Auth gate detection, alternative access paths for gated content, bot-protection interference with automated fetching | Each check has defined pass/warn/fail criteria, an automation level, and severity. -**[Read the Full Spec](/spec/)** +**[Read the Spec](/spec/web/)** For empirical observations on how specific agent platforms (Claude, Cursor, Copilot, Gemini, and others) handle retrieval, truncation, and summarization, @@ -52,7 +52,7 @@ If you can only do a few things, these have the highest impact: ## Test Your Docs [`afdocs`](https://afdocs.dev) is a companion CLI tool -and Node.js library that implements this spec. It runs all 23 checks against +and Node.js library that implements this spec. It runs the automated checks against your documentation site and reports what's working, what's not, and what to fix. ```bash diff --git a/site/content/platforms/_index.md b/site/content/platforms/_index.md index 47742b0..9a293e0 100644 --- a/site/content/platforms/_index.md +++ b/site/content/platforms/_index.md @@ -16,7 +16,7 @@ This page provides an overview of observed agent web fetch retrieval behavior ac - [Truncation](#truncation): What gets lost and whether agents report it - [Summarization](#summarization): What happens to content between retrieval and generation -These observations inform the size thresholds and pipeline assumptions in the [Agent-Friendly Documentation Spec](/spec/), particularly [Category 3: Page Size and Truncation Risk](/spec/#category-3-page-size-and-truncation-risk). +These observations inform the size thresholds and pipeline assumptions in the [Web Documentation Delivery Spec](/spec/web/), particularly [Category 3: Page Size and Truncation Risk](/spec/web/page-size/). ## Retrieval @@ -64,9 +64,9 @@ Observable outputs from default settings primarily inform the conclusions below. | ---------- | -------------------- | ------------ | | [Claude API web fetch](https://rhyannonjoy.github.io/agent-ecosystem-testing/docs/anthropic-claude-api-web-fetch-tool/methodology) | _Dynamic filtering optional_, `web_fetch_20260209` | Server-side tool called directly with inspectable tool result in response. [Dynamic filtering](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool) available with certain LLMs in which Claude writes, executes code to filter before content reaches the context window, but it's not default behavior. | | [Claude Code](https://giuseppegurgone.com/claude-webfetch) | _Summarization threshold-triggered_ | Content under ~100K chars from trusted text/markdown sources reaches the context window directly without intermediate processing, but content exceeding this threshold goes through a summarization LLM that may lose information. | -| [Cursor](https://rhyannonjoy.github.io/agent-ecosystem-testing/docs/anysphere-cursor/methodology) | _Inferred via filtering, undocumented for web fetch_ | Codebase research, terminal commands, and browser automation requests trigger [built-in subagents](https://cursor.com/docs/subagents) `explore`, `bash`, and `browser`. Test prompts likely invoked `explore` and `bash` alongside web fetch. Backend routing and structure-aware content filtering suggest a pre-generation processing layer, not a passive, linear pipeline. | +| [Cursor](https://rhyannonjoy.github.io/agent-ecosystem-testing/docs/anysphere-cursor/methodology) | _Inferred via filtering, undocumented for web fetch_ | Codebase research, terminal commands, and browser automation requests trigger [built-in subagents](https://cursor.com/docs/subagents) `explore`, `bash`, and `browser`. Test prompts likely invoked `explore` and `bash` alongside web fetch. Backend routing and structure-aware content filtering suggest a pre-generation processing layer rather than a passive, linear pipeline. | | [Gemini API URL context](https://rhyannonjoy.github.io/agent-ecosystem-testing/docs/google-gemini-url-context-tool/methodology) | _API layer pipeline, undocumented_ | Pre-generation injection suggests processing occurs before LLM invocation. No transformation layer between retrieval and generation; LLM receives content directly and any summarization occurs as part of generation, not as an intermediate pipeline stage. | | [GitHub Copilot](https://rhyannonjoy.github.io/agent-ecosystem-testing/docs/microsoft-github-copilot/methodology) | _Inferred via relevance-ranking, undocumented for web fetch_ | Reassembled excerpts, outputs that don't note discarded content, browser masquerading, and tool substitution patterns suggests an orchestrator-subagent relationship and not a linear, passive pipeline. Agent loop descriptions vary by implementation. [VS Code-Copilot docs](https://code.visualstudio.com/docs/copilot/agents/subagents) describe subagent delegation as _main agent-initiated_ for complex tasks with further config available, but [Copilot SDK docs](https://docs.github.com/en/copilot/how-tos/copilot-sdk/use-copilot-sdk/custom-agents) only describe subagents as configurable, and not default architecture. | | MCP Fetch (reference server) | _None_ hard truncation at `max_length` | Passive, linear pipeline without a processing layer. | | [OpenAI web search](https://rhyannonjoy.github.io/agent-ecosystem-testing/docs/open-ai-web-search-tool/methodology) | _Differs by API surface, undocumented_ | Chat Completions autonomously retrieves, but Responses' LLM actively manages search in the chain of thought with `open_page` and `find_in_page`, suggesting a processing layer, but not explicitly documented or named in either API responses. | -| [Windsurf Cascade](https://rhyannonjoy.github.io/agent-ecosystem-testing/docs/cognition-windsurf-cascade/methodology) | _Inferred via chunking, undocumented for web and docs search_ | Codebase research triggers [built-in subagent Fast Context](https://docs.windsurf.com/context-awareness/fast-context). Test prompts likely invoked Fast Context alongside web search. Chunk analysis, tool substitution, terminal execution, and workspace referencing suggest an extensive processing layer, not a passive, linear pipeline. | +| [Windsurf Cascade](https://rhyannonjoy.github.io/agent-ecosystem-testing/docs/cognition-windsurf-cascade/methodology) | _Inferred via chunking, undocumented for web and docs search_ | Codebase research triggers [built-in subagent Fast Context](https://docs.windsurf.com/context-awareness/fast-context). Test prompts likely invoked Fast Context alongside web search. Chunk analysis, tool substitution, terminal execution, and workspace referencing suggest an extensive processing layer rather than a passive, linear pipeline. | diff --git a/site/content/spec/_index.md b/site/content/spec/_index.md new file mode 100644 index 0000000..43145de --- /dev/null +++ b/site/content/spec/_index.md @@ -0,0 +1,39 @@ +--- +title: "Specifications" +description: "The Agent-Friendly Documentation Spec family: web delivery today, with companion specifications planned for content composition and repository-local docs." +--- + +Agent-friendly documentation has more than one surface. This page is the +home for the specification family; each spec covers one surface and +versions independently. + +## Available now + +- **[Web Documentation Delivery Spec](https://agentdocsspec.com/spec/web/)**: + 28 checks across 7 categories evaluating whether coding agents can + discover, fetch, and receive a documentation site's content intact. + Covers llms.txt discovery, markdown availability, page size and + truncation risk, content structure, URL stability, observability, and + authentication/access. This spec was formerly served in full at this + URL; it now lives at `/spec/web/`, split into per-category pages so that + each page fits comfortably within agent fetch limits (its own + recommendation, applied to itself). + +## Planned + +Companion specifications will be added here as the evidence base for them +matures (see [Related Surfaces](https://agentdocsspec.com/spec/web/#related-surfaces) +in the web delivery spec): + +- **Content composition**: what documentation should contain to serve + agents well: factual consistency across pages, structure and density + suited to machine consumption. +- **Repository-local documentation**: docs serving coding agents that work + inside a repository, where discovery happens through grep and file + listings rather than HTTP. + +## Implementation + +[afdocs](https://github.com/agent-ecosystem/afdocs) is the reference +implementation of the web delivery spec: `npx afdocs check ` tests a +documentation site against it. diff --git a/site/copy_spec_and_build b/site/copy_spec_and_build index 8a21db8..4e2f3e2 100755 --- a/site/copy_spec_and_build +++ b/site/copy_spec_and_build @@ -4,25 +4,15 @@ set -euo pipefail SITE_DIR="$(cd "$(dirname "$0")" && pwd)" REPO_DIR="$(dirname "$SITE_DIR")" SPEC_SOURCE="$REPO_DIR/SPEC.md" -SPEC_DEST="$SITE_DIR/content/spec/_index.md" +SPEC_WEB_DIR="$SITE_DIR/content/spec/web" -# Ensure content/spec/ directory exists -mkdir -p "$SITE_DIR/content/spec" - -# Prepend front matter to SPEC.md and write to content directory -cat > "$SPEC_DEST" <<'FRONTMATTER' ---- -title: "Agent-Friendly Documentation Spec" -description: "A specification defining 23 checks across 7 categories for evaluating how well documentation sites serve coding agents." -showTableOfContents: true ---- - -FRONTMATTER - -# Strip the first H1 header line (duplicates the page title from front matter) -tail -n +2 "$SPEC_SOURCE" >> "$SPEC_DEST" - -echo "Generated $SPEC_DEST" +# Split the canonical single-document spec into per-category pages under +# content/spec/web/ (the spec's own progressive disclosure recommendation: +# the full document exceeds the 100K truncation threshold its checks warn +# about). The /spec/ landing page (content/spec/_index.md) is hand-authored +# and not touched here. +rm -rf "$SPEC_WEB_DIR" +python3 "$SITE_DIR/split_spec.py" "$SPEC_SOURCE" "$SPEC_WEB_DIR" # Run Hugo, passing through any arguments (e.g., "server") cd "$SITE_DIR" diff --git a/site/layouts/partials/llms-directive.md b/site/layouts/partials/llms-directive.md index 5dc6ef5..d3619f3 100644 --- a/site/layouts/partials/llms-directive.md +++ b/site/layouts/partials/llms-directive.md @@ -1 +1 @@ -> For AI agents: the complete documentation index is at [/llms.txt](/llms.txt). Markdown versions of any page are available by appending `index.md` to the URL path. +> For AI agents: the complete documentation index is at [https://agentdocsspec.com/llms.txt](https://agentdocsspec.com/llms.txt). Markdown versions of any page are available by appending `index.md` to the URL path. diff --git a/site/split_spec.py b/site/split_spec.py new file mode 100644 index 0000000..83cc2a8 --- /dev/null +++ b/site/split_spec.py @@ -0,0 +1,252 @@ +#!/usr/bin/env python3 +"""Split SPEC.md into per-category site pages under content/spec/web/. + +The canonical spec is a single document (SPEC.md). This script serves it as +multiple pages, following the spec's own progressive disclosure +recommendation. It: + +- splits on H2 boundaries (fence-aware: headings inside ``` / ~~~ code + blocks are not section boundaries) +- assembles pages per the MANIFEST below +- builds a global anchor map and rewrites intra-document links: same-page + links stay fragments, cross-page links become absolute URLs (per the + spec's own `markdown-link-portability` check) +- emits Hugo front matter per page and a contents list at the top of the + overview page + +Usage: split_spec.py +""" + +import re +import sys +from pathlib import Path + +BASE_URL = "https://agentdocsspec.com/spec/web/" + +# page slug -> (title, description, weight) +PAGES = { + "_index": ( + "Web Documentation Delivery Spec", + "How well a documentation site serves coding agents: scope, terminology, and the summary of all 28 checks.", + 0, + ), + "content-discoverability": ( + "Category 1: Content Discoverability", + "Checks for llms.txt existence, validity, size, link quality, and directives that point agents to it.", + 1, + ), + "markdown-availability": ( + "Category 2: Markdown Availability", + "Checks for .md URL variants and content negotiation via Accept headers.", + 2, + ), + "page-size": ( + "Category 3: Page Size and Truncation Risk", + "Checks for rendering strategy, markdown/HTML/transfer size, content start position, and single-fetch completeness.", + 3, + ), + "content-structure": ( + "Category 4: Content Structure", + "Checks for tabbed content serialization, header quality, code fence validity, link portability, and embedded data.", + 4, + ), + "url-stability": ( + "Category 5: URL Stability and Redirects", + "Checks for HTTP status code honesty and redirect behavior.", + 5, + ), + "observability": ( + "Category 6: Observability and Content Health", + "Checks for llms.txt coverage, markdown/HTML content parity, and cache header hygiene.", + 6, + ), + "authentication": ( + "Category 7: Authentication and Access", + "Checks for auth gating, alternative access paths, and bot-protection interference.", + 7, + ), + "interaction-effects": ( + "Interaction Effects", + "How individual check failures combine into non-linear agent experience degradation.", + 8, + ), + "appendices": ( + "Appendices", + "Known platform truncation limits and notable exclusions.", + 9, + ), + "changelog": ( + "Changelog", + "Version history of the Agent-Friendly Documentation Spec.", + 10, + ), +} + +# H2 heading text -> page slug. Headings not listed here go to the overview. +MANIFEST = { + "Category 1: Content Discoverability": "content-discoverability", + "Category 2: Markdown Availability": "markdown-availability", + "Category 3: Page Size and Truncation Risk": "page-size", + "Category 4: Content Structure": "content-structure", + "Category 5: URL Stability and Redirects": "url-stability", + "Category 6: Observability and Content Health": "observability", + "Category 7: Authentication and Access": "authentication", + "Interaction Effects": "interaction-effects", + "Appendix A: Known Platform Truncation Limits": "appendices", + "Appendix B: Notable Exclusions": "appendices", + "Changelog": "changelog", +} + + +def github_anchor(heading: str) -> str: + """GitHub/Goldmark-style anchor from a heading line's text.""" + text = heading.strip().lstrip("#").strip() + text = text.replace("`", "") + text = text.lower() + text = re.sub(r"[^\w\- ]", "", text) + text = text.replace(" ", "-") + return text + + +def split_sections(lines): + """Yield (h2_title_or_None, [lines]) fence-aware; first item is preamble.""" + sections = [] + current_title = None + current = [] + fence = None + for line in lines: + m = re.match(r"^(```+|~~~+)", line) + if m: + tick = m.group(1)[0] * 3 + if fence is None: + fence = tick + elif line.strip().startswith(fence): + fence = None + if fence is None and line.startswith("## ") and not line.startswith("###"): + sections.append((current_title, current)) + current_title = line[3:].strip() + current = [line] + else: + current.append(line) + sections.append((current_title, current)) + return sections + + +def collect_anchors(page_lines, slug, anchor_map): + fence = None + for line in page_lines: + m = re.match(r"^(```+|~~~+)", line) + if m: + tick = m.group(1)[0] * 3 + if fence is None: + fence = tick + elif line.strip().startswith(fence): + fence = None + continue + if fence is None and re.match(r"^#{1,6} ", line): + anchor = github_anchor(line) + if anchor in anchor_map and anchor_map[anchor] != slug: + print( + f"WARNING: duplicate anchor '{anchor}' on " + f"{anchor_map[anchor]} and {slug}; keeping first", + file=sys.stderr, + ) + continue + anchor_map[anchor] = slug + + +def rewrite_links(text, slug, anchor_map, page_title_anchors): + def repl(m): + label, anchor = m.group(1), m.group(2) + target = anchor_map.get(anchor) + if target is None: + print(f"WARNING: unresolved anchor '#{anchor}' on {slug}", file=sys.stderr) + return m.group(0) + if target == slug: + return m.group(0) + page_path = "" if target == "_index" else f"{target}/" + if anchor in page_title_anchors: + return f"[{label}]({BASE_URL}{page_path})" + return f"[{label}]({BASE_URL}{page_path}#{anchor})" + + return re.sub(r"\[([^\]]+)\]\(#([\w\-]+)\)", repl, text) + + +def main(): + spec_path = Path(sys.argv[1]) + out_dir = Path(sys.argv[2]) + out_dir.mkdir(parents=True, exist_ok=True) + + lines = spec_path.read_text(encoding="utf-8").splitlines() + sections = split_sections(lines) + + # Assemble pages in source order. + pages = {slug: [] for slug in PAGES} + page_title_anchors = set() + for title, body in sections: + if title is None: + # Preamble: drop the document H1 (layout renders the page title). + body = [ln for ln in body if not ln.startswith("# ")] + pages["_index"].extend(body) + continue + slug = MANIFEST.get(title, "_index") + if slug != "_index" and title in MANIFEST: + # The H2 that *is* the page (category pages, interaction + # effects, changelog) becomes the page title; appendices keep + # their H2s because two sections share one page. + if slug not in ("appendices",): + page_title_anchors.add(github_anchor("## " + title)) + body = body[1:] # drop the H2 line itself + pages[slug].extend(body) + + # Global anchor map (title anchors map to their page root). + anchor_map = {} + for title, slug in MANIFEST.items(): + anchor_map[github_anchor("## " + title)] = slug + for slug, body in pages.items(): + collect_anchors(body, slug, anchor_map) + + # Contents list at the top of the overview. + contents = ["## Spec Contents", ""] + for slug, (title, desc, weight) in sorted(PAGES.items(), key=lambda i: i[1][2]): + if slug == "_index": + continue + contents.append(f"- [{title}]({BASE_URL}{slug}/): {desc}") + contents.append("") + + for slug, body in pages.items(): + title, desc, weight = PAGES[slug] + text = "\n".join(body).strip("\n") + "\n" + text = rewrite_links(text, slug, anchor_map, page_title_anchors) + # Strip trailing/leading horizontal rules left over from section joins. + text = re.sub(r"^\s*---\s*\n", "", text) + text = re.sub(r"\n---\s*$", "\n", text) + header = [ + "---", + f'title: "{title}"', + f'description: "{desc}"', + f"weight: {weight}", + "showTableOfContents: true", + "---", + "", + ] + if slug == "_index": + nav = "\n".join(contents) + "\n" + # Insert contents list right after the status table (before Abstract). + idx = text.find("## Abstract") + text = text[:idx] + nav + text[idx:] if idx >= 0 else nav + text + out_path = out_dir / "_index.md" + else: + backlink = ( + f"Part of the [Web Documentation Delivery Spec]({BASE_URL}). " + f"The [Checks Summary]({BASE_URL}#checks-summary) lists all " + f"checks with links to their definitions.\n\n" + ) + text = backlink + text + out_path = out_dir / f"{slug}.md" + out_path.write_text("\n".join(header) + text, encoding="utf-8") + print(f" {out_path} ({len(text)} chars)") + + +if __name__ == "__main__": + main() diff --git a/site/static/llms.txt b/site/static/llms.txt index c40d3e3..2a146a0 100644 --- a/site/static/llms.txt +++ b/site/static/llms.txt @@ -1,10 +1,24 @@ # Agent-Friendly Documentation Spec -> A specification defining 23 checks across 7 categories for evaluating how well documentation sites serve coding agents. +> A specification defining 28 checks across 7 categories for evaluating how well documentation sites serve coding agents. + +## Web Documentation Delivery Spec + +- [Web Documentation Delivery Spec](https://agentdocsspec.com/spec/web/index.md): Scope, terminology, conventions, top recommendations, and the summary of all 28 checks with links to their definitions. +- [Category 1: Content Discoverability](https://agentdocsspec.com/spec/web/content-discoverability/index.md): llms.txt existence, validity, size, link quality, and directives pointing agents to it. +- [Category 2: Markdown Availability](https://agentdocsspec.com/spec/web/markdown-availability/index.md): .md URL variants and content negotiation via Accept headers. +- [Category 3: Page Size and Truncation Risk](https://agentdocsspec.com/spec/web/page-size/index.md): Rendering strategy, markdown/HTML/transfer size, content start position, and single-fetch completeness. +- [Category 4: Content Structure](https://agentdocsspec.com/spec/web/content-structure/index.md): Tabbed content serialization, header quality, code fence validity, link portability, and embedded data. +- [Category 5: URL Stability and Redirects](https://agentdocsspec.com/spec/web/url-stability/index.md): HTTP status code honesty and redirect behavior. +- [Category 6: Observability and Content Health](https://agentdocsspec.com/spec/web/observability/index.md): llms.txt coverage, markdown/HTML content parity, and cache header hygiene. +- [Category 7: Authentication and Access](https://agentdocsspec.com/spec/web/authentication/index.md): Auth gating, alternative access paths, and bot-protection interference. +- [Interaction Effects](https://agentdocsspec.com/spec/web/interaction-effects/index.md): How individual check failures combine into non-linear degradation. +- [Appendices](https://agentdocsspec.com/spec/web/appendices/index.md): Known platform truncation limits and notable exclusions. +- [Changelog](https://agentdocsspec.com/spec/web/changelog/index.md): Version history. ## Docs -- [Full Spec](https://agentdocsspec.com/spec/index.md): The complete specification with all checks, thresholds, and implementation guidance. +- [Spec Landing Page](https://agentdocsspec.com/spec/index.md): The specification family: web delivery today, companion specs planned for content composition and repository-local docs. - [Platforms](https://agentdocsspec.com/platforms/index.md): Comparison of agent platforms across retrieval, truncation, and summarization behavior. - [Home](https://agentdocsspec.com/index.md): Overview, quick start guide, and background links. From 52f659a7c875524b4ad34d659268425054ac30cb Mon Sep 17 00:00:00 2001 From: dacharyc Date: Sun, 13 Sep 2026 17:01:43 -0400 Subject: [PATCH 3/8] Add Vale prose linting with AI-writing rules Ports the DC style (partly adapted from tbhb/vale-ai-tells, MIT) with two repo-specific tweaks: 'friendly' excepted from adverb density, and all adverbial 'silently' uses reworded rather than exempted. Co-Authored-By: Claude Fable 5 --- .vale.ini | 5 + .vale/styles/DC/AICompoundPhrases.yml | 139 +++++++++++++++++ .vale/styles/DC/AdverbDensity.yml | 32 ++++ .vale/styles/DC/ContrastiveFormulas.yml | 192 ++++++++++++++++++++++++ .vale/styles/DC/EmDash.yml | 6 + .vale/styles/DC/FillerPhrases.yml | 82 ++++++++++ .vale/styles/DC/HedgingPhrases.yml | 92 ++++++++++++ .vale/styles/DC/OpeningCliches.yml | 98 ++++++++++++ .vale/styles/DC/SycophancyMarkers.yml | 25 +++ .vale/styles/DC/THIRD_PARTY_NOTICES.md | 10 ++ .vale/styles/DC/Vocabulary.yml | 15 ++ check_prose_style | 21 +++ 12 files changed, 717 insertions(+) create mode 100644 .vale.ini create mode 100644 .vale/styles/DC/AICompoundPhrases.yml create mode 100644 .vale/styles/DC/AdverbDensity.yml create mode 100644 .vale/styles/DC/ContrastiveFormulas.yml create mode 100644 .vale/styles/DC/EmDash.yml create mode 100644 .vale/styles/DC/FillerPhrases.yml create mode 100644 .vale/styles/DC/HedgingPhrases.yml create mode 100644 .vale/styles/DC/OpeningCliches.yml create mode 100644 .vale/styles/DC/SycophancyMarkers.yml create mode 100644 .vale/styles/DC/THIRD_PARTY_NOTICES.md create mode 100644 .vale/styles/DC/Vocabulary.yml create mode 100755 check_prose_style diff --git a/.vale.ini b/.vale.ini new file mode 100644 index 0000000..9ba6f35 --- /dev/null +++ b/.vale.ini @@ -0,0 +1,5 @@ +StylesPath = .vale/styles +MinAlertLevel = suggestion + +[*.md] +BasedOnStyles = DC diff --git a/.vale/styles/DC/AICompoundPhrases.yml b/.vale/styles/DC/AICompoundPhrases.yml new file mode 100644 index 0000000..f8f268c --- /dev/null +++ b/.vale/styles/DC/AICompoundPhrases.yml @@ -0,0 +1,139 @@ +# Adapted from tbhb/vale-ai-tells (MIT). See THIRD_PARTY_NOTICES.md. +extends: existence +message: "AI fingerprint: '%s'. Rewrite with concrete specifics instead of this clichéd phrase." +level: error +ignorecase: true +tokens: + - rich tapestry + - rich tapestries + - tapestry of + - intricate tapestry + - complex and multifaceted + - multifaceted and complex + - intricate interplay + - delicate balance + - delicate interplay + - dynamic interplay + - crucial role + - played a crucial role + - plays a crucial role + - vital role + - pivotal role + - key role + - instrumental role + - cutting-edge + - game-changer + - game-changing + - paradigm shift + - sea change + - tipping point + - watershed moment + - double-edged sword + - slippery slope + - tip of the iceberg + - at the forefront + - on the cutting edge + - paving the way + - laid the groundwork + - lays the groundwork + - sets the stage + - set the stage + - a testament to + - stands as a testament + - serve as a reminder + - serves as a reminder + - it remains to be seen + - only time will tell + - the jury is still out + - takes center stage + - take center stage + - took center stage + - paints a picture of + - paint a picture of + - painted a picture of + - is not without its challenges + - are not without their challenges + - is not without challenges + - whether we like it or not + - whether you like it or not + - a cornerstone of + - the transformative power of + - deeply rooted in + - deeply rooted + - the hallmark of + - a hallmark of + - moving the needle + - moves the needle + - moved the needle + - move the needle + - nudge the needle + - nudges the needle + - nudged the needle + - unlocks new + - unlocked new + - unlocking new + - unlock new + - unlocks the potential + - unlock the potential + - unlocks the power + - unlock the power + - unlocks the value + - unlock the value + - unlocks capabilities + - unlock capabilities + - unlocks possibilities + - unlock possibilities + + # "real" as intensifier before an abstract noun. + # AI reaches for "a real choice" / "a real difference" to inflate + # weight where a plain noun would do. Bare "real" is too broad + # (real-time, real estate, real world), so this is enumerated. + - a real choice + - a real option + - a real difference + - a real test + - a real question + - a real chance + - a real problem + - a real shot + - a real risk + - a real cost + - a real benefit + - real value + - real progress + - real flexibility + - real benefits + - real costs + - real impact + - real leverage + - real ownership + - real accountability + - real consequences + - real tradeoffs + - real trade-offs + - real choices + - real options + - real differences + + # Investigation-thread metaphors: AI's preferred way to describe + # "open questions" or "loose ends." Tutorial-blog tone. + - threads to pull on + - thread to pull on + - threads to pull + - thread to pull + - loose threads to pull + - loose threads to chase + - another thread to pull + - more threads to pull + + # Solidification metaphors: the surface/design/contract "hardens" + # before some deadline. AI reaches for this constantly when + # describing in-progress work or pre-release windows. + # Broad regex catches "before/after X hardens" for any 1-6 + # word X. + - (?:before|after) [^.,;:!?]{1,40} hardens + - (?:before|after) [^.,;:!?]{1,40} hardened + - (?:before|after) [^.,;:!?]{1,40} solidifies + - (?:before|after) [^.,;:!?]{1,40} solidified + - (?:before|after) [^.,;:!?]{1,40} ossifies + - (?:before|after) [^.,;:!?]{1,40} ossified diff --git a/.vale/styles/DC/AdverbDensity.yml b/.vale/styles/DC/AdverbDensity.yml new file mode 100644 index 0000000..7fa9452 --- /dev/null +++ b/.vale/styles/DC/AdverbDensity.yml @@ -0,0 +1,32 @@ +# Original rule (not from vale-ai-tells). Flags every non-exception '-ly' +# word, but only in files whose '-ly' density exceeds 2% of word count +# (min 100 words). scope: raw keeps positions accurate; the cost is that +# code blocks and frontmatter count toward the word total. +extends: script +message: "Adverb-heavy file (over 2%% '-ly' words). Cut this one or its neighbors." +level: warning +scope: raw +script: | + text := import("text") + matches := [] + exceptions := {only: true, family: true, likely: true, early: true, + friendly: true, + assembly: true, apply: true, reply: true, supply: true, july: true, + italy: true, daily: true, weekly: true, monthly: true, ugly: true, + fly: true, rely: true, imply: true, multiply: true, ally: true, + rally: true, tally: true, anomaly: true, belly: true, silly: true} + words := text.re_find(`[A-Za-z]+`, scope, -1) + total := 0 + candidates := [] + for w in words { + total += 1 + lower := text.to_lower(w[0].text) + if text.has_suffix(lower, "ly") && !exceptions[lower] { + candidates = append(candidates, w[0]) + } + } + if total >= 100 && len(candidates) * 100 > total * 2 { + for c in candidates { + matches = append(matches, {begin: c.begin, end: c.begin + len(c.text)}) + } + } diff --git a/.vale/styles/DC/ContrastiveFormulas.yml b/.vale/styles/DC/ContrastiveFormulas.yml new file mode 100644 index 0000000..3fddc91 --- /dev/null +++ b/.vale/styles/DC/ContrastiveFormulas.yml @@ -0,0 +1,192 @@ +# Adapted from tbhb/vale-ai-tells (MIT). See THIRD_PARTY_NOTICES.md. +extends: existence +message: "AI contrast: '%s'. State the positive claim directly without the 'not X, but Y' formula." +level: error +tokens: + # "It's not just X; it's Y" patterns + - "[Ii]t'?s not just [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Ii]t isn'?t just [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Ii]t'?s not merely [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Ii]t'?s not simply [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Ii]t'?s not only [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Ii]t'?s not purely [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Ii]t'?s not solely [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Ii]t'?s not entirely [^;,—:]+[;,—:] it'?s [^.!?]+" + + # "It's not about X; it's about Y" patterns + - "[Ii]t'?s not about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Ii]t isn'?t about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Ii]t'?s not really about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Ii]t'?s not just about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Ii]t'?s not merely about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Ii]t'?s not simply about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Ii]t'?s not only about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Ii]t'?s not purely about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Ii]t'?s not solely about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Ii]t'?s not entirely about [^;,—:]+[;,—:] it'?s about [^.!?]+" + # Period-separated versions (two sentences) + - "[Ii]t'?s not about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + - "[Ii]t isn'?t about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + - "[Ii]t'?s not really about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + - "[Ii]t'?s not just about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + - "[Ii]t'?s not merely about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + - "[Ii]t'?s not purely about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + - "[Ii]t'?s not solely about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + - "[Ii]t'?s not entirely about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + + # "This isn't X; it's Y" patterns + - "[Tt]his isn'?t just [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his isn'?t merely [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his isn'?t simply [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his isn'?t only [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his isn'?t purely [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his isn'?t solely [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his isn'?t entirely [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his is not just [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his is not merely [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his is not simply [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his is not only [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his is not purely [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his is not solely [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his is not entirely [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his isn'?t merely about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Tt]his isn'?t just about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Tt]his isn'?t simply about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Tt]his isn'?t only about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Tt]his isn'?t purely about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Tt]his isn'?t solely about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Tt]his isn'?t entirely about [^;,—:]+[;,—:] it'?s about [^.!?]+" + - "[Tt]his isn'?t about [^;,—:]+[;,—:] it'?s about [^.!?]+" + # Period-separated versions (two sentences) + - "[Tt]his isn'?t about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + - "[Tt]his isn'?t merely about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + - "[Tt]his isn'?t just about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + - "[Tt]his isn'?t simply about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + - "[Tt]his isn'?t only about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + - "[Tt]his isn'?t purely about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + - "[Tt]his isn'?t solely about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + - "[Tt]his isn'?t entirely about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + - "[Tt]his is not about [^.!?]+\\. [Ii]t'?s about [^.!?]+" + + # "It's more than X; it's Y" patterns + - "[Ii]t'?s more than [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Ii]t'?s more than just [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his is more than [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]his is more than just [^;,—:]+[;,—:] it'?s [^.!?]+" + + # "It's less about X and more about Y" patterns + - "[Ii]t'?s less about [^;,—:]+ and more about [^.!?]+" + - "[Ii]t'?s less about [^;,—:]+, more about [^.!?]+" + - "[Tt]his is less about [^;,—:]+ and more about [^.!?]+" + + # "X isn't the point; Y is" patterns + - "[^.!?]+ isn'?t the point[;,—:] [^.!?]+ is" + - "[^.!?]+ is not the point[;,—:] [^.!?]+ is" + + # "The real X isn't Y; it's Z" patterns + - "[Tt]he real [^;,—:]+ isn'?t [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]he true [^;,—:]+ isn'?t [^;,—:]+[;,—:] it'?s [^.!?]+" + + # "What matters isn't X; it's Y" patterns + - "[Ww]hat matters isn'?t [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Ww]hat matters is not [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Ww]hat'?s important isn'?t [^;,—:]+[;,—:] it'?s [^.!?]+" + + # "The question isn't X; it's Y" patterns + - "[Tt]he question isn'?t [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]he question is not [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]he issue isn'?t [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]he problem isn'?t [^;,—:]+[;,—:] it'?s [^.!?]+" + - "[Tt]he challenge isn'?t [^;,—:]+[;,—:] it'?s [^.!?]+" + + # "Yes, X, but Y" dismissive acknowledgment + - "[Yy]es, [^,]+, but the real [^.!?]+" + - "[Ss]ure, [^,]+, but what really [^.!?]+" + + # "It's not whether X; it's how/why/when Y" + - "[Ii]t'?s not whether [^;,—:]+[;,—:] it'?s (?:how|why|when|what) [^.!?]+" + - "[Ii]t'?s not if [^;,—:]+[;,—:] it'?s (?:how|why|when|what) [^.!?]+" + + # "[Noun] isn't X. It's Y." pattern (any subject) + - "[A-Z][a-z]+ isn'?t [^.!?]+\\. [Ii]t'?s [^.!?]+" + - "[A-Z][a-z]+ is not [^.!?]+\\. [Ii]t'?s [^.!?]+" + + # "a Y, not a Z" bare appositive: the categorical assertion with + # preemptive correction, verb optional ("a refinement, not a rivalry"). + # Verbless, so it also fires in headings, where the clause-shaped tokens + # above never match. Subsumes the older single-word-subject + # "X is a Y, not a Z" token. + - "\\b[Aa]n? [^,.;:!?\\n]{2,}, [Nn]ot [Aa]n? [^.!?;:,\\n]+" + - "[A-Z][a-z]+ are [^,]+, not [^.]+" + + # "Not only X but also Y" patterns + - "[Nn]ot only [^,;—:]+,? but (?:also )?[^.!?]+" + + # "Not because X, but because Y" causal variant + - "[Nn]ot because [^,;—:]+,? but because [^.!?]+" + + # === Plural subject negation-correction === + + # "These aren't X. They're Y." — period-separated + - "[Tt]hese aren'?t [^.!?]+\\. [Tt]hey'?re [^.!?]+" + - "[Tt]hose aren'?t [^.!?]+\\. [Tt]hey'?re [^.!?]+" + - "[Tt]hese are not [^.!?]+\\. [Tt]hey'?re [^.!?]+" + - "[Tt]hose are not [^.!?]+\\. [Tt]hey'?re [^.!?]+" + - "[Tt]hese are not [^.!?]+\\. [Tt]hey are [^.!?]+" + - "[Tt]hose are not [^.!?]+\\. [Tt]hey are [^.!?]+" + + # With modifiers + - "[Tt]hese aren'?t just [^.!?]+\\. [Tt]hey'?re [^.!?]+" + - "[Tt]hese aren'?t merely [^.!?]+\\. [Tt]hey'?re [^.!?]+" + - "[Tt]hese aren'?t simply [^.!?]+\\. [Tt]hey'?re [^.!?]+" + + # Semicolon/em-dash-joined + - "[Tt]hese aren'?t [^;,—:]+[;,—:] they'?re [^.!?]+" + - "[Tt]hose aren'?t [^;,—:]+[;,—:] they'?re [^.!?]+" + - "[Tt]hese are not [^;,—:]+[;,—:] they'?re [^.!?]+" + - "[Tt]hose are not [^;,—:]+[;,—:] they'?re [^.!?]+" + + # Generic "[Noun] aren't X. They're Y." catch-all + - "[A-Z][a-z]+ aren'?t [^.!?]+\\. [Tt]hey'?re [^.!?]+" + - "[A-Z][a-z]+ are not [^.!?]+\\. [Tt]hey'?re [^.!?]+" + - "[A-Z][a-z]+ are not [^.!?]+\\. [Tt]hey are [^.!?]+" + + # === "Doesn't mean X. It means Y." === + + # Period-separated + - "[Tt]his doesn'?t mean [^.!?]+\\. [Ii]t means [^.!?]+" + - "[Tt]hat doesn'?t mean [^.!?]+\\. [Ii]t means [^.!?]+" + - "[Tt]his does not mean [^.!?]+\\. [Ii]t means [^.!?]+" + - "[Tt]hat does not mean [^.!?]+\\. [Ii]t means [^.!?]+" + + # Semicolon/em-dash-joined + - "[Tt]his doesn'?t mean [^;,—:]+[;,—:] it means [^.!?]+" + - "[Tt]hat doesn'?t mean [^;,—:]+[;,—:] it means [^.!?]+" + + # Generic "[Noun] doesn't mean X. It means Y." + - "[A-Z][a-z]+ doesn'?t mean [^.!?]+\\. [Ii]t means [^.!?]+" + - "[A-Z][a-z]+ does not mean [^.!?]+\\. [Ii]t means [^.!?]+" + + # === Multi-word subject "isn't X. It's Y." === + # Catches "The colophon isn't a disclaimer. It's a feature." + # The single-word "[Noun] isn't X. It's Y." patterns above only match + # single capitalized-word subjects. + + # "The [noun] isn't X. It's Y." + - "[Tt]he [a-z]+ isn'?t [^.!?]+\\. [Ii]t'?s [^.!?]+" + - "[Tt]he [a-z]+ is not [^.!?]+\\. [Ii]t'?s [^.!?]+" + - "[Tt]he [a-z]+ isn'?t [^.!?]+\\. [Ii]t is [^.!?]+" + + # "A/An [noun] isn't X. It's Y." + - "[Aa]n? [a-z]+ isn'?t [^.!?]+\\. [Ii]t'?s [^.!?]+" + - "[Aa]n? [a-z]+ is not [^.!?]+\\. [Ii]t'?s [^.!?]+" + + # "Our/Your/Their [noun] isn't X. It's Y." + - "(?:Our|Your|Their|Its) [a-z]+ isn'?t [^.!?]+\\. [Ii]t'?s [^.!?]+" + - "(?:Our|Your|Their|Its) [a-z]+ is not [^.!?]+\\. [Ii]t'?s [^.!?]+" + + # Multi-word/acronym subjects — catch-all with "isn't...It's" anchor + # "WCAG 2.1 AA isn't a checkbox. It's a constraint." + - "[^.!?]+ isn'?t [^.!?]+\\. [Ii]t'?s [^.!?]+" + - "[^.!?]+ is not [^.!?]+\\. [Ii]t'?s [^.!?]+" + - "[^.!?]+ isn'?t [^.!?]+\\. [Ii]t is [^.!?]+" diff --git a/.vale/styles/DC/EmDash.yml b/.vale/styles/DC/EmDash.yml new file mode 100644 index 0000000..05d4d85 --- /dev/null +++ b/.vale/styles/DC/EmDash.yml @@ -0,0 +1,6 @@ +extends: existence +message: "Em dash used — vary punctuation (parens, colon, semicolon, period, comma) instead. A few per article are fine; heavy use reads as LLM-generated." +level: error +nonword: true +tokens: + - '—' diff --git a/.vale/styles/DC/FillerPhrases.yml b/.vale/styles/DC/FillerPhrases.yml new file mode 100644 index 0000000..ed0e1e5 --- /dev/null +++ b/.vale/styles/DC/FillerPhrases.yml @@ -0,0 +1,82 @@ +# Adapted from tbhb/vale-ai-tells (MIT). See THIRD_PARTY_NOTICES.md. +extends: existence +message: "AI filler: '%s'. Delete this phrase. It adds no meaning." +level: error +ignorecase: true +tokens: + - a wide range of + - a broad range of + - a variety of + - a myriad of + - a plethora of + - a wealth of + - an abundance of + - a multitude of + - countless + - numerous + - innumerable + - in order to + - for the purpose of + - with the aim of + - with a view to + - so as to + - serves to + - tends to + - has the potential to + - has the ability to + - is capable of + - is able to + - due to the fact that + - owing to the fact that + - in light of the fact that + - given the fact that + - despite the fact that + - regardless of the fact that + - the fact that + - it is clear that + - it is evident that + - it is apparent that + - it is obvious that + - it can be seen that + - it can be observed that + - at the end of the day + + # Performative sincerity markers. "to be honest," overlaps DefensiveHedges' + # fuller "To be honest, X, but Y" concessive shape on purpose: this rule owns + # the bare filler, DefensiveHedges owns the hedged-concession reading, and a + # sentence that is both earns both alerts by design. + - and honestly + - and honestly, + - honestly, + - honestly? + - to be honest, + - to be honest? + - and frankly + - and frankly, + - frankly, + - frankly? + - and truthfully + - truthfully, + - if i'm being honest + - if i'm being frank + - to be frank, + - to tell you the truth + - the truth is, + - in all honesty + - in all honesty, + - quite honestly + - quite frankly + - i'll be honest + - i will be honest + - to be perfectly honest + - to be completely honest + - to be totally honest + - to be brutally honest + - to be 100% honest + - the honest truth + - the honest answer + - the honest take + - honest answer + - honest take + - my honest take + - my honest opinion diff --git a/.vale/styles/DC/HedgingPhrases.yml b/.vale/styles/DC/HedgingPhrases.yml new file mode 100644 index 0000000..982fc2d --- /dev/null +++ b/.vale/styles/DC/HedgingPhrases.yml @@ -0,0 +1,92 @@ +# Adapted from tbhb/vale-ai-tells (MIT). See THIRD_PARTY_NOTICES.md. +extends: existence +message: "AI hedge: '%s'. Delete this throat-clearing and state your point directly." +level: error +ignorecase: true +tokens: + - It's important to note that + - It is important to note that + - It is important to understand + - It is important to consider + - It is important to recognize + - It is important to acknowledge + - It is important to emphasize + - It is important to highlight + - It is important to mention + - It's worth noting that + - It is worth noting that + - It's worth mentioning that + - It is worth mentioning that + - It is worth emphasizing that + - It is worth highlighting that + - It is worth pointing out that + - It is worth remembering that + # Ported from Metacommentary: the no-'that' contraction forms so this rule + # owns the whole "It's worth ing" family. + - It'?s worth noting + - It'?s worth mentioning + - It'?s worth pointing out + - It'?s worth emphasizing + - It'?s worth highlighting + - It'?s worth remembering + - It is essential to note + - It is essential to understand + - It is essential to recognize + - It is essential to acknowledge + - It is essential to emphasize + - It is crucial to note + - It is crucial to understand + - It is crucial to recognize + - It is critical to note + - It is critical to understand + - It is critical to recognize + - It is necessary to note + - It is necessary to understand + - It is necessary to recognize + - It should be noted that + - It should be emphasized that + - It should be mentioned that + - It bears mentioning + - It goes without saying + - Needless to say + - Generally speaking + - Broadly speaking + - For the most part + - By and large + - All things considered + - That being said + - That said + - With that said + - Having said that + - On the other hand + - At the same time + - To be sure + - To some extent + - In some ways + - In many ways + - In a sense + - As such + - As it were + - One thing is clear + - One thing is certain + - One thing is for sure + - One thing is for certain + - This much is clear + - This much is certain + - raises important questions + - raises serious questions + - raises questions about + - begs the question + - forces us to ask + - forces us to consider + - invites us to consider + - invites us to ask + - invites us to reflect + - prompts us to ask + - prompts us to consider + - calls into question + - calls on us to + - reminds us that + - reminds us of the importance + - as you might expect + - as you'd expect diff --git a/.vale/styles/DC/OpeningCliches.yml b/.vale/styles/DC/OpeningCliches.yml new file mode 100644 index 0000000..3347cdf --- /dev/null +++ b/.vale/styles/DC/OpeningCliches.yml @@ -0,0 +1,98 @@ +# Adapted from tbhb/vale-ai-tells (MIT). See THIRD_PARTY_NOTICES.md. +extends: existence +message: "AI opening: '%s'. Start with your actual point instead of this generic lead-in." +level: error +ignorecase: true +tokens: + - In today's rapidly evolving + - In today's fast-paced + - In today's digital age + - In today's ever-changing + - In today's interconnected + - In the realm of + - In the world of + - In the landscape of + - In the ever-evolving landscape + - In an era where + - In an age where + - In this day and age + - Embarking on a journey + - Embark on a journey + - Embarking on this journey + - As we navigate + - As we delve into + - As we explore + - When it comes to + - Picture this + - Imagine a world where + - Have you ever wondered + - In recent years + - Throughout history + - Since the dawn of + - From time immemorial + - Before we dive in + - Before we dive into + - By the end of this article + - By the end of this guide + - By the end of this post + - By the end of this tutorial + - By the end of this section + - This guide will walk you through + - This article will walk you through + - This post will walk you through + - This guide will help you + - This article will help you + - This post will help you + - Welcome to this guide + - Welcome to this overview + - Welcome to this exploration + - Welcome to this deep dive + - Without further ado + - Without further ado, let's + - Without further ado, here's + - Gone are the days + - Gone are the days when + - Gone are the days of + - Whether you're a + - Whether you're an + - Whether you're just + - Whether you're new + - Whether you're already + - Whether you're looking + - Whether you're trying + - Whether you're someone + - You might be wondering + - You may be wondering + - You're probably wondering + - You might be asking yourself + - You may be asking yourself + - If you've ever + - If you've ever wondered + - If you've ever found yourself + - Have you ever found yourself + - Chances are + - Chances are you've + - Chances are you're + - You're not alone + - You're not alone if + - We've all been there + - Look no further + - You've come to the right place + - You're in the right place + - Ready to dive in + - Ready to get started + - Ready to learn + - Ready to explore + - In the dynamic world of + - In an increasingly + - In a world where + - In a world of + - As technology continues to evolve + - As technology continues to advance + - As the world becomes + - As the world continues + - As we stand at + - As we stand on the + - We live in an era + - We live in a world + - We live in a time diff --git a/.vale/styles/DC/SycophancyMarkers.yml b/.vale/styles/DC/SycophancyMarkers.yml new file mode 100644 index 0000000..75a2b2a --- /dev/null +++ b/.vale/styles/DC/SycophancyMarkers.yml @@ -0,0 +1,25 @@ +# Adapted from tbhb/vale-ai-tells (MIT). See THIRD_PARTY_NOTICES.md. +# Pruned of bare-word tokens (Absolutely, Certainly, Of course) that +# false-positive on ordinary usage. +extends: existence +message: "AI sycophancy: '%s'. Delete this. It sounds robotic and insincere." +level: error +ignorecase: true +tokens: + - Great question + - Excellent question + - That's a great question + - That's an excellent question + - What a great question + - Fantastic question + - Wonderful question + - I'm glad you asked + - I'm happy to help + - I'd be happy to help + - I'd be glad to help + - Without a doubt + - You're absolutely right + - You make an excellent point + - That's a wonderful idea + - That's a fantastic point + - I couldn't agree more diff --git a/.vale/styles/DC/THIRD_PARTY_NOTICES.md b/.vale/styles/DC/THIRD_PARTY_NOTICES.md new file mode 100644 index 0000000..177630b --- /dev/null +++ b/.vale/styles/DC/THIRD_PARTY_NOTICES.md @@ -0,0 +1,10 @@ +# Third-party rule sources + +`FillerPhrases.yml`, `HedgingPhrases.yml`, `ContrastiveFormulas.yml`, `OpeningCliches.yml`, +`AICompoundPhrases.yml`, and `SycophancyMarkers.yml` are adapted from +[tbhb/vale-ai-tells](https://github.com/tbhb/vale-ai-tells) (MIT License, Copyright (c) +2025-2026 Tony Burns). `SycophancyMarkers.yml` was pruned of bare-word tokens (`Absolutely`, +`Certainly`, `Of course`) that false-positive on ordinary usage; `FillerPhrases.yml` had +`at the end of the day` appended. + +`Vocabulary.yml` is independently written, not derived from any third-party style package. diff --git a/.vale/styles/DC/Vocabulary.yml b/.vale/styles/DC/Vocabulary.yml new file mode 100644 index 0000000..189300a --- /dev/null +++ b/.vale/styles/DC/Vocabulary.yml @@ -0,0 +1,15 @@ +extends: existence +message: "'%s' is a well-worn LLM tell — use plainer language." +level: error +ignorecase: true +tokens: + - delves? + - delving + - delved + - tapestry + - tapestries + - showcase + - showcases + - showcasing + - showcased + - silently diff --git a/check_prose_style b/check_prose_style new file mode 100755 index 0000000..db7bdfa --- /dev/null +++ b/check_prose_style @@ -0,0 +1,21 @@ +#!/bin/sh +# +# Lints uncommitted .md files with Vale against the DC style. +# Called by .git/hooks/pre-commit; safe to run manually too. + +SITE_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SITE_DIR" || exit 1 + +if ! command -v vale >/dev/null 2>&1; then + echo "vale not found on PATH. Install with: brew install vale" >&2 + exit 1 +fi + +FILES=$( { git diff --name-only --diff-filter=ACMR -- '*.md' + git diff --cached --name-only --diff-filter=ACMR -- '*.md' + git ls-files --others --exclude-standard -- '*.md' + } | sort -u | grep -v '^site/archetypes/') + +[ -z "$FILES" ] && exit 0 + +vale --config .vale.ini $FILES From 84fabe4fb30da5ff3828dbdeae6f4b8afc9c80ea Mon Sep 17 00:00:00 2001 From: dacharyc Date: Sun, 13 Sep 2026 17:04:32 -0400 Subject: [PATCH 4/8] Frame the home page around the spec family Attributes the 28 checks to the Web Documentation Delivery Spec and names the planned companion specs, matching the /spec/ landing page. Co-Authored-By: Claude Fable 5 --- site/content/_index.md | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/site/content/_index.md b/site/content/_index.md index 398cfae..6d34cbd 100644 --- a/site/content/_index.md +++ b/site/content/_index.md @@ -1,6 +1,6 @@ --- title: "Can agents read your documentation?" -description: "A proposed specification for making documentation sites work well for coding agents." +description: "A specification family for making documentation work well for coding agents." --- Documentation sites are increasingly consumed by coding agents (Claude Code, @@ -12,8 +12,9 @@ about emerging discovery mechanisms like `llms.txt`. The result: agents frequently fail to get the documentation they need, fall back on training data, or work with partial information without knowing it. -This spec defines **28 checks across 7 categories** that evaluate how well a -documentation site serves agent consumers. +The [Web Documentation Delivery Spec](/spec/web/) defines **28 checks across +7 categories** that evaluate how well a documentation site serves agent +consumers. | Category | Checks | What it evaluates | |----------|--------|-------------------| @@ -30,6 +31,12 @@ severity. **[Read the Spec](/spec/web/)** +Web delivery is the first surface in a planned family of specifications. +Companion specs for content composition (what documentation should contain +to serve agents well) and repository-local documentation (docs agents grep +and read inside codebases) will land at [Specifications](/spec/) as the +evidence base for them matures. + For empirical observations on how specific agent platforms (Claude, Cursor, Copilot, Gemini, and others) handle retrieval, truncation, and summarization, see **[Agent platform comparisons](/platforms/)**. @@ -65,7 +72,7 @@ are covered in the [GitHub repo](https://github.com/agent-ecosystem/afdocs). ## Background -This spec grew out of findings from two research articles on agent +This project grew out of findings from two research articles on agent documentation access patterns: - [Agent-Friendly Docs](https://dacharycarey.com/2026/02/18/agent-friendly-docs/) - @@ -79,8 +86,8 @@ documentation access patterns: ## Contributing -This spec is open for community review. We welcome feedback, proposed changes, -platform data, and real-world results. See the +The specs are open for community review. We welcome feedback, proposed +changes, platform data, and real-world results. See the [GitHub repository](https://github.com/agent-ecosystem/agent-docs-spec) for details. ## License From d7e4186ebcf7af647443c9891c27b2b7543bc766 Mon Sep 17 00:00:00 2001 From: dacharyc Date: Sun, 13 Sep 2026 17:06:41 -0400 Subject: [PATCH 5/8] Update Start Here and Quick Start for v0.6.0 lessons Adds bot-protection exemption as its own item, folds generated-markdown verification into the serve-markdown item, and adds generated data tables to the page-size item. Co-Authored-By: Claude Fable 5 --- SPEC.md | 35 +++++++++++++++++++++++++---------- site/content/_index.md | 11 ++++++++--- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/SPEC.md b/SPEC.md index 02da746..cfb4dfb 100644 --- a/SPEC.md +++ b/SPEC.md @@ -140,15 +140,21 @@ are ordered by impact based on observed agent behavior: to keep each file under the limit. Checks: `llms-txt-exists`, `llms-txt-size` -2. **Serve markdown versions of your pages.** Either via `.md` URL variants or - content negotiation. Markdown is what agents actually want; HTML conversion - is lossy and unpredictable. - Checks: `markdown-url-support`, `content-negotiation` - -3. **Keep pages under 50,000 characters of content.** If a page has tabbed or - dropdown content that serializes into a massive blob, break it into separate - pages or ensure the markdown version stays under the limit. - Checks: `page-size-markdown`, `page-size-html`, `tabbed-content-serialization` +2. **Serve markdown versions of your pages, and verify what you serve.** + Either via `.md` URL variants or content negotiation. Markdown is what + agents actually want; HTML conversion is lossy and unpredictable. Then + treat the markdown generator as a second rendering pipeline that needs + its own QA: it can emit broken links or partial content while the HTML + looks fine, and no human reads the markdown to notice. + Checks: `markdown-url-support`, `content-negotiation`, + `markdown-link-portability`, `single-fetch-completeness` + +3. **Keep pages under 50,000 characters of content.** If a page has tabbed + or dropdown content, or generated data tables, that serialize into a + massive blob, break it into separate pages or ensure the markdown version + stays under the limit. + Checks: `page-size-markdown`, `page-size-html`, + `tabbed-content-serialization`, `embedded-data-serialization` 4. **Put a pointer to your `llms.txt` at the top of every docs page.** A simple blockquote directive that tells agents where to find the documentation index. @@ -160,7 +166,16 @@ are ordered by impact based on observed agent behavior: redirects. Avoid cross-host redirects, JavaScript redirects, and soft 404s. Checks: `http-status-codes`, `redirect-behavior` -6. **Monitor your agent-facing resources.** Treat `llms.txt` and markdown +6. **Make sure bot protection isn't blocking agents.** Bot management tuned + for scraper traffic can challenge, throttle, or stall automated clients + fetching your public docs, and the failure is invisible from a browser. + Exempt documentation routes from behavioral enforcement, or scope + enforcement to interactive product surfaces. For affected sites this + outranks everything else on this list: nothing above matters if agents + can't fetch at all. + Checks: `bot-protection-interference` + +7. **Monitor your agent-facing resources.** Treat `llms.txt` and markdown endpoints like any other production surface: check freshness, verify content parity with HTML, and ensure cache headers allow timely updates. Checks: `llms-txt-coverage`, `markdown-content-parity`, diff --git a/site/content/_index.md b/site/content/_index.md index 6d34cbd..b975b17 100644 --- a/site/content/_index.md +++ b/site/content/_index.md @@ -48,12 +48,17 @@ If you can only do a few things, these have the highest impact: 1. **Create an `llms.txt`** under 50K characters. This is the single most effective discovery mechanism observed. 2. **Serve markdown versions** of your pages via `.md` URLs or content - negotiation. -3. **Keep pages under 50K characters** of content. Break up mega-pages. + negotiation, and verify what you serve: generated markdown can ship + broken links or partial content while the HTML looks fine. +3. **Keep pages under 50K characters** of content. Break up mega-pages, + serialized tab content, and generated data tables. 4. **Add an `llms.txt` pointer** to the top of every docs page. 5. **Don't break your URLs.** Use same-host HTTP redirects if you must move content. -6. **Monitor your agent-facing resources.** Keep `llms.txt` fresh, verify +6. **Make sure bot protection isn't blocking agents.** Exempt public docs + routes from behavioral enforcement; for affected sites, this outranks + everything else here. +7. **Monitor your agent-facing resources.** Keep `llms.txt` fresh, verify markdown parity, and check cache headers. ## Test Your Docs From 17a77d9cba9a87389611c9193f6798ea8b0ca596 Mon Sep 17 00:00:00 2001 From: dacharyc Date: Sun, 13 Sep 2026 17:11:20 -0400 Subject: [PATCH 6/8] Reconcile single-fetch-completeness with the splitting recommendations Names the distinction: splitting creates self-contained units reached by navigation; pagination creates obligatory windows over one unit. Split by meaning, don't window by size. Co-Authored-By: Claude Fable 5 --- SPEC.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/SPEC.md b/SPEC.md index cfb4dfb..d0d62cc 100644 --- a/SPEC.md +++ b/SPEC.md @@ -1044,6 +1044,22 @@ summarization in practice, see [Agent platform comparisons](https://agentdocsspe interaction pattern agents share with human readers and is out of scope here. + **Relationship to the spec's splitting recommendations.** This check + targets windowing rather than the number of fetches. Other parts + of this spec recommend *more* fetches: progressive disclosure splits an + oversized `llms.txt` into section files, and the page-size checks + recommend breaking large pages up. The difference is what each fetch + returns. Splitting creates self-contained units, each with its own topic + and URL, reached by navigation: an agent fetches an index, chooses the + relevant unit, and gets content that is complete as the thing it claims + to be. Pagination slices one logical unit into arbitrary windows: no + window is complete for any question, every window is required to have the + unit at all, and the seams are easy to lose. Multi-fetch by choice is + navigation; multi-fetch by obligation is truncation with extra steps. The + principle behind both: split by meaning, don't window by size. A response + should either be complete as what it claims to be, or say so plainly + where agents will see it. + --- ## Category 4: Content Structure @@ -1237,7 +1253,10 @@ heuristics. element is beyond the truncation point for most platforms. - **Recommended action**: Bulk data is often legitimate content (a support matrix is the point of a support-matrix page), so the goal is structure, - not removal. Split large generated tables across per-section pages, + not removal. Split large generated tables across per-section pages (as + self-contained units reached from an index, each complete for its scope; + paginating one table into windows trades this problem for the one + `single-fetch-completeness` describes), provide filtered or queryable views, load embedded data blobs on demand, and place prose before bulk elements so truncation removes data rows rather than explanation. Report the attribution to content authors: From 5f013daf61ab205f5944a0520db918b276f9780f Mon Sep 17 00:00:00 2001 From: dacharyc Date: Sun, 13 Sep 2026 17:15:34 -0400 Subject: [PATCH 7/8] Resolve cross-check tensions found in consistency pass - llms-txt-links-resolve now requires representation verification (soft-404 heuristics, content-type for markdown links) instead of bare status codes, and recommends absolute URLs in llms.txt - markdown-link-portability exempts same-document fragment links and covers llms.txt-discovered markdown - single-fetch-completeness and markdown-link-portability dependency widened to include the llms-txt-links-markdown path - embedded-data-serialization scoped to conversion-surviving bulk, with script payloads assigned to page-size-transfer - Conventions now classifies Interaction Effects, Related Surfaces, and the RAG section Co-Authored-By: Claude Fable 5 --- SPEC.md | 59 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/SPEC.md b/SPEC.md index d0d62cc..b1c59e4 100644 --- a/SPEC.md +++ b/SPEC.md @@ -120,9 +120,13 @@ and recommendations). The distinction is noted where it matters: - **Normative sections**: Category 1-7 check definitions, Checks Summary table. -- **Informational sections**: Background, Scope, Start Here, "How Agents Get - Content", "Who Actually Uses llms.txt?", Progressive Disclosure - recommendation, "Making Private Docs Agent-Accessible", Appendices. +- **Informational sections**: Background, Scope (including Related + Surfaces), Start Here, "How Agents Get Content", "Who Actually Uses + llms.txt?", Progressive Disclosure recommendation, "Making Private Docs + Agent-Accessible", Interaction Effects, "Serving RAG Ingestion + Pipelines", Appendices. Interaction Effects guides how implementations + present combined results; it defines no pass/warn/fail criteria of its + own. The progressive disclosure pattern for `llms.txt` is a recommendation from this spec, not a normative requirement. Sites that keep their `llms.txt` under @@ -234,8 +238,11 @@ Some checks depend on the results of others: `content-negotiation` passes (the site must serve markdown for this check to apply). - `single-fetch-completeness` and `markdown-link-portability` only run if - `markdown-url-support` or `content-negotiation` passes (both evaluate - properties of served markdown). + the site serves markdown by some detected path: `markdown-url-support` or + `content-negotiation` passes, or `llms-txt-links-markdown` finds markdown + links. A site can serve agent-facing markdown through `llms.txt` alone, + without page-level `.md` variants, and that markdown deserves the same + evaluation. Implementations should run checks in category order (1 through 7) and skip dependent checks when their prerequisites fail. @@ -363,20 +370,31 @@ against every discovered `llms.txt` file. ### `llms-txt-links-resolve` -- **What it checks**: Whether the URLs listed in `llms.txt` actually resolve - (return 200). +- **What it checks**: Whether the URLs listed in `llms.txt` resolve to the + content they promise. - **Why it matters**: A stale `llms.txt` with broken links is worse than no `llms.txt` at all. It sends agents down dead ends with high confidence. - **Result levels**: - - **Pass**: All links resolve (200, following same-host redirects). + - **Pass**: All links resolve (200, following same-host redirects) with no + soft 404s or representation mismatches. - **Warn**: >90% of links resolve. - **Fail**: <=90% of links resolve. - **Recommended action**: Audit and fix or remove broken URLs. A stale `llms.txt` with broken links is worse than no `llms.txt` at all because it sends agents down dead ends with high confidence. -- **Automation**: Full. +- **Automation**: Full. Verification must go beyond status codes: apply + soft-404 heuristics (see `http-status-codes`) to the response body, and + verify the content type for links that promise markdown. A bare status + check passes broken links; in one observed production case, a generated + catalog's `.md` links all soft-404ed as HTML SPA shells while returning + 200 (see `markdown-link-portability`). - **Notes**: Requires making HTTP requests to each URL. For large files, implementations may choose to test a random subset rather than every link. + Links in `llms.txt` should be absolute URLs: the file is copied, cached, + and aggregated by tools that drop its source URL, so relative links share + the portability failure modes described in `markdown-link-portability`. + The [progressive disclosure design principles](#progressive-disclosure-for-large-documentation-sets) + make the same recommendation for links between index levels. ### `llms-txt-size` @@ -1199,11 +1217,13 @@ heuristics. absolute, root-relative, or path-relative, resolve a sample against the fetch URL, and verify status, `Content-Type`, and soft-404 heuristics (reusing the detection from `http-status-codes`). -- **Notes**: Applies to markdown served via `.md` URLs and content - negotiation. `llms.txt` link quality is covered separately by - `llms-txt-links-resolve`; implementations should apply the same - representation verification there, since status-code-only resolution - misses soft 404s. +- **Notes**: Applies to markdown served via `.md` URLs, content + negotiation, and pages discovered through `llms.txt` links. Links in + `llms.txt` itself are covered by `llms-txt-links-resolve`, which applies + the same representation verification. Same-document fragment links + (`#anchor` with no path) are exempt from the absolute-URL requirement: + they resolve within the content the agent already holds, and rewriting + them to absolute URLs adds nothing. **Why this check exempts the HTML path.** Relative links in HTML are correct web practice (they are what makes staging domains, mirrors, and @@ -1267,7 +1287,12 @@ heuristics. threshold with uniform row structure, fenced or inline JSON blobs above a size threshold, and base64 runs. Report each element's share of the converted content. Thresholds for "bulk" need calibration against real - pages and should be configurable. + pages and should be configurable. This check sees only bulk that + survives conversion into content (tables, code fences, prose-embedded + data); serialized payloads inside `