AI visibility review
Review documentation the way AI systems consume it, not the way humans read
it. Different consumers read different surfaces at different times: crawlers
snapshot HTML for training corpora, RAG retrievers fetch Markdown twins and
chunk them, and agents walk URLs and bind to machine-readable contracts.
A page can be excellent for human readers and invisible — or misleading —
to every one of these consumers. This review finds those gaps with
evidence, not assumptions.
Inputs
Accept any of:
- A PR:
gh pr view <N> and gh pr diff <N> for the change; the
PR preview site for rendered output (see the reference file for preview
URL shape and its known artifacts).
- Page URLs: production or preview.
- A section or product: review the navigation graph and discovery
paths, not just individual pages.
Step 0: Scope the review before fetching anything
State a one-paragraph review plan first: what the target is, which pages
you will fetch, and which layers matter most for this target. An unscoped
review fetches everything at full depth and burns most of its budget
proving things that were never in doubt.
- PR: review the changed pages and the discovery paths they depend
on. Pre-existing product-wide gaps get one line and a pointer, not a
re-investigation.
- Single page: full depth on that page; discovery paths checked once.
- Section or product: sample, don't enumerate. The product root, one
or two task pages, one reference page, and one API page (if any) reveal
every defect class; reading all 285 pages reveals the same classes
slower. Use corpus-level greps (
llms-full.txt) to measure how
widespread a defect is after you find it on a sampled page.
- Match depth to the product: for a GUI product, the agent-harness
layer is "what can be done headless" (install, config files), not API
contracts. For a legacy product, lead with currency and
compatibility-statement checks. Don't run every layer at uniform depth
when the target makes a layer mostly moot.
Step 1: Fetch the surfaces — verify, don't assume
A review is read-only. Never build the site (hugo, yarn build:*,
docker) for a review — everything a review needs is already published
(production, the PR preview) or readable in source (templates, data
files, content). Local builds take minutes, stall in constrained
environments, and leave artifacts in the working tree, and they verify
nothing that a fetch plus a source read doesn't. If a claim can't be
verified from published artifacts and source, label it an inference and
include the one-line command that would verify it.
Every claim in the report must come from a fetched artifact or a read
source file. Three gotchas that produce false findings if skipped:
- Always
curl --compressed. Production serves gzip; raw bytes look
like binary garbage and a naive fetch "finds" nothing.
- Minified HTML drops attribute quotes.
grep '<link rel="canonical"'
misses <link rel=canonical ...>. Match with quote-tolerant patterns
(for example <link[^>]*canonical[^>]*>) or you will report present
metadata as missing.
- Check preview AND production before calling something a bug. See
PR Preview for deployment behavior
and known parity gaps. Its advertised Markdown twins 404, so check twin
fidelity on production or staging. Other preview-only defects need
investigation; don't dismiss them as expected prefix behavior.
For each page, capture:
| Surface |
What to check |
<head> |
<title>, meta description, <link rel=canonical>, <link rel=alternate type=text/markdown> |
| JSON-LD |
Which @type nodes exist, and whether @id references resolve (entity graph coherence) |
| Headings |
h2/h3 hierarchy, stable anchor ids, question-shaped phrasing |
| Markdown twin |
Exists? Served as text/markdown? Conversion quality (see Step 3, RAG) |
| robots / noindex |
Anything blocking AI crawlers from this path |
Frontmatter and SEO signals
Frontmatter is the single source for the page's <title>, meta
description, JSON-LD fields, and twin metadata — one weak field degrades
every surface at once. Check in the source files (not just rendered
output):
description: present, specific to the page, roughly one to two
sentences. A missing description falls back to generic text; a
duplicated description (for example, a section landing reusing the
product root's) makes search snippets interchangeable and page
embeddings near-identical — the retriever can't tell the pages apart.
Grep for duplicates across the section; don't check pages one at a
time.
title: distinct within the product, matches how users phrase the
task. Title is the strongest single retrieval and snippet signal.
- Canonical intent: self-canonical by default; a cross-product
canonical (shared content pointing at the canonical edition) is a
deliberate consolidation — verify it points where intended, and flag
it as a trade-off, not a bug, when it's by design.
- Dates:
lastmod/date flow into twins, JSON-LD dateModified,
and sitemap <lastmod> — stale dates on current content undersell
freshness to both rankers and agents.
Step 2: Walk the discovery paths
An AI consumer can only use what it can find. Walk each path end-to-end
and record where it works and where it dead-ends:
llms.txt path: site root llms.txt → the product or section
entry → its artifacts. Check all three granularities: the per-section
index.section.md links, the per-page .md twins, and the per-product
llms-full.txt flattened corpus. Verify the corpus file exists (fetch
it, don't trust the link) and contains the pages under review. A
product missing from llms.txt — or listed without a llms-full.txt
corpus — is invisible to every llms.txt-first agent regardless of page
quality.
- Sitemap path:
sitemap.xml and sitemap-md.xml → page and twin
URLs.
- HTML head path: canonical + markdown-alternate + JSON-LD from any
page reached by crawl or search.
- In-site navigation: hops from the product root to the page; menu
placement;
related: links; anchor-deep links.
Report the paths as a table (works / dead end), and trace dead ends to
their cause in code or data — the fix usually lives in a template, a
build script, or a data file, not in the page (see the reference file for
where these live in this repo).
Step 3: Analyze per consumption layer
Judge each finding by which lifecycle stage it affects. The same page
serves four consumers with different needs and different latencies:
Pre-training / training (months; shapes the next model generation)
- Is the content server-rendered, public, and crawlable? Anything behind
authentication, a running instance, or client-side JS is absent from
every training corpus, permanently.
- What concrete facts can a model memorize from this page? Ports, paths,
prefixes, version numbers, header schemes. Vague prose trains nothing.
- Name the hallucination risk that gaps create: when docs publish an API's
conventions but not its surface, future models invent the missing
endpoints by analogy with products they know better. For new products,
the first crawl impression is the seed corpus — thin coverage now is
parametric ignorance later.
Post-training (instruction and agentic tuning)
- Are examples self-contained and runnable — imports and auth visible, no
"as in the previous example"? Instruction-tuning corpora favor
Q&A-shaped sections and copy-adaptable code.
- Do placeholders follow a consistent, machine-recognizable convention
(UPPER_SNAKE tokens with replace-instructions)?
RAG / retrieval (weeks; the layer you can move now)
- Chunk quality: each h2 section should stand alone with the answer in
its first sentence. Retrievers extract passages without surrounding
context.
- Twin fidelity: read the generated Markdown twin, don't trust that it
mirrors the HTML. Look for conversion bugs (lost whitespace around links
and code spans, broken tab-group rendering) and for repeated boilerplate
(beta banners, sunset notices) consuming the first chunk of every page
in a section — that makes section pages embed near-identically and
surfaces the banner instead of the answer.
- The dead-end test: for the page's core question, what does a
docs-grounded assistant retrieve and what can it actually answer? "Check
your instance" or "see the UI" is a terminal non-answer for every hosted
assistant.
Agent harness (immediate)
- Can an agent execute the page's guidance headlessly? Token auth in a
fenced command beats "log in via the browser."
- Are machine-readable contracts published or fetchable (OpenAPI, JSON
schema, MCP)? An interactive UI is not a contract.
- Are URL shapes predictable and anchors stable enough to construct from a
task description? Count the hops from product root to the answer.
Step 4: Report
Lead with the verdict — what's solid, what's broken, in two or three
sentences. Then:
- Facts with evidence. Every finding cites the fetched URL, file path,
or command output that proves it. Distinguish confirmed facts from
inferences.
- Separate findings by level. Page-level (fix in the content),
product-level (fix in data or config — for example a missing corpus
entry), and pipeline-level (fix in shared templates or converters,
affects all products). Mislabeling a pipeline bug as a page bug sends
the fix to the wrong place.
- Prioritized recommendations. Order by leverage: discovery-path
breaks first (they gate everything else), then machine-readable
contract gaps, then content coverage, then twin hygiene.
- Credit what works. Inherited infrastructure (head links, JSON-LD,
sitemap entries) that the change gets for free belongs in the report —
it scopes the real gaps and prevents re-litigating solved problems.
Produce the report; don't file anything unsolicited. Then offer
follow-ups. If the user accepts:
- File pipeline-caused findings as general issues citing the observed
pages as evidence — not product-scoped issues, which misleads triage.
- For small mechanical fixes (a cross-link, a frontmatter field), prefer a
direct PR over an issue.
Repo specifics
Before reviewing anything on docs.influxdata.com or in this repo, read
DOCS-AI-VISIBILITY.md — it maps the three
Markdown artifact layers, the eligibility predicates and their source
files, the products.yml gate that controls llms.txt inclusion, and the PR
preview workflow's known artifacts. Reviews that skip it rediscover (or
misdiagnose) the same plumbing every time.
DOCS-DEPLOYING.md
covers how those artifacts are generated, if a finding traces back to the
build rather than to content.
1---2name: ai-visibility3description: Review documentation PRs, pages, or navigation for visibility to AI consumers — crawlers building training corpora, RAG retrievers, and autonomous agents — across the model lifecycle (pre-training, training, post-training, inference/RAG). Use whenever the user asks how docs appear to LLMs or AI agents, asks to review a PR or page for AI visibility, discoverability, GEO, or agent experience, or mentions llms.txt, llms-full.txt, markdown twins, JSON-LD, canonical links, sitemap-md, or "how would a model navigate this" — even if they don't say "AI visibility" explicitly. Also covers SEO-relevant frontmatter review (titles, descriptions, canonicals) since the same metadata drives both search snippets and AI retrieval.4---56# AI visibility review78Review documentation the way AI systems consume it, not the way humans read9it. Different consumers read different surfaces at different times: crawlers10snapshot HTML for training corpora, RAG retrievers fetch Markdown twins and11chunk them, and agents walk URLs and bind to machine-readable contracts.12A page can be excellent for human readers and invisible — or misleading —13to every one of these consumers. This review finds those gaps with14evidence, not assumptions.1516## Inputs1718Accept any of:1920- **A PR**: `gh pr view <N>` and `gh pr diff <N>` for the change; the21 PR preview site for rendered output (see the reference file for preview22 URL shape and its known artifacts).23- **Page URLs**: production or preview.24- **A section or product**: review the navigation graph and discovery25 paths, not just individual pages.2627## Step 0: Scope the review before fetching anything2829State a one-paragraph review plan first: what the target is, which pages30you will fetch, and which layers matter most for this target. An unscoped31review fetches everything at full depth and burns most of its budget32proving things that were never in doubt.3334- **PR**: review the changed pages and the discovery paths they depend35 on. Pre-existing product-wide gaps get one line and a pointer, not a36 re-investigation.37- **Single page**: full depth on that page; discovery paths checked once.38- **Section or product**: sample, don't enumerate. The product root, one39 or two task pages, one reference page, and one API page (if any) reveal40 every defect class; reading all 285 pages reveals the same classes41 slower. Use corpus-level greps (`llms-full.txt`) to measure how42 widespread a defect is after you find it on a sampled page.43- **Match depth to the product**: for a GUI product, the agent-harness44 layer is "what can be done headless" (install, config files), not API45 contracts. For a legacy product, lead with currency and46 compatibility-statement checks. Don't run every layer at uniform depth47 when the target makes a layer mostly moot.4849## Step 1: Fetch the surfaces — verify, don't assume5051A review is read-only. **Never build the site (`hugo`, `yarn build:*`,52docker) for a review** — everything a review needs is already published53(production, the PR preview) or readable in source (templates, data54files, content). Local builds take minutes, stall in constrained55environments, and leave artifacts in the working tree, and they verify56nothing that a fetch plus a source read doesn't. If a claim can't be57verified from published artifacts and source, label it an inference and58include the one-line command that would verify it.5960Every claim in the report must come from a fetched artifact or a read61source file. Three gotchas that produce false findings if skipped:6263- **Always `curl --compressed`.** Production serves gzip; raw bytes look64 like binary garbage and a naive fetch "finds" nothing.65- **Minified HTML drops attribute quotes.** `grep '<link rel="canonical"'`66 misses `<link rel=canonical ...>`. Match with quote-tolerant patterns67 (for example `<link[^>]*canonical[^>]*>`) or you will report present68 metadata as missing.69- **Check preview AND production before calling something a bug.** See70 [PR Preview](../../../DOCS-DEPLOYING.md#pr-preview) for deployment behavior71 and known parity gaps. Its advertised Markdown twins 404, so check twin72 fidelity on production or staging. Other preview-only defects need73 investigation; don't dismiss them as expected prefix behavior.7475For each page, capture:7677| Surface | What to check |78| ---------------- | ---------------------------------------------------------------------------------------------- |79| `<head>` | `<title>`, meta description, `<link rel=canonical>`, `<link rel=alternate type=text/markdown>` |80| JSON-LD | Which `@type` nodes exist, and whether `@id` references resolve (entity graph coherence) |81| Headings | h2/h3 hierarchy, stable anchor ids, question-shaped phrasing |82| Markdown twin | Exists? Served as `text/markdown`? Conversion quality (see Step 3, RAG) |83| robots / noindex | Anything blocking AI crawlers from this path |8485### Frontmatter and SEO signals8687Frontmatter is the single source for the page's `<title>`, meta88description, JSON-LD fields, and twin metadata — one weak field degrades89every surface at once. Check in the source files (not just rendered90output):9192- **`description`**: present, specific to the page, roughly one to two93 sentences. A missing description falls back to generic text; a94 duplicated description (for example, a section landing reusing the95 product root's) makes search snippets interchangeable and page96 embeddings near-identical — the retriever can't tell the pages apart.97 Grep for duplicates across the section; don't check pages one at a98 time.99- **`title`**: distinct within the product, matches how users phrase the100 task. Title is the strongest single retrieval and snippet signal.101- **Canonical intent**: self-canonical by default; a cross-product102 canonical (shared content pointing at the canonical edition) is a103 deliberate consolidation — verify it points where intended, and flag104 it as a trade-off, not a bug, when it's by design.105- **Dates**: `lastmod`/`date` flow into twins, JSON-LD `dateModified`,106 and sitemap `<lastmod>` — stale dates on current content undersell107 freshness to both rankers and agents.108109## Step 2: Walk the discovery paths110111An AI consumer can only use what it can find. Walk each path end-to-end112and record where it works and where it dead-ends:1131141. **`llms.txt` path**: site root `llms.txt` → the product or section115 entry → its artifacts. Check all three granularities: the per-section116 `index.section.md` links, the per-page `.md` twins, and the per-product117 `llms-full.txt` flattened corpus. Verify the corpus file exists (fetch118 it, don't trust the link) and contains the pages under review. A119 product missing from `llms.txt` — or listed without a `llms-full.txt`120 corpus — is invisible to every llms.txt-first agent regardless of page121 quality.1222. **Sitemap path**: `sitemap.xml` and `sitemap-md.xml` → page and twin123 URLs.1243. **HTML head path**: canonical + markdown-alternate + JSON-LD from any125 page reached by crawl or search.1264. **In-site navigation**: hops from the product root to the page; menu127 placement; `related:` links; anchor-deep links.128129Report the paths as a table (works / dead end), and trace dead ends to130their cause in code or data — the fix usually lives in a template, a131build script, or a data file, not in the page (see the reference file for132where these live in this repo).133134## Step 3: Analyze per consumption layer135136Judge each finding by which lifecycle stage it affects. The same page137serves four consumers with different needs and different latencies:138139### Pre-training / training (months; shapes the next model generation)140141- Is the content server-rendered, public, and crawlable? Anything behind142 authentication, a running instance, or client-side JS is absent from143 every training corpus, permanently.144- What concrete facts can a model memorize from this page? Ports, paths,145 prefixes, version numbers, header schemes. Vague prose trains nothing.146- Name the hallucination risk that gaps create: when docs publish an API's147 conventions but not its surface, future models invent the missing148 endpoints by analogy with products they know better. For new products,149 the first crawl impression is the seed corpus — thin coverage now is150 parametric ignorance later.151152### Post-training (instruction and agentic tuning)153154- Are examples self-contained and runnable — imports and auth visible, no155 "as in the previous example"? Instruction-tuning corpora favor156 Q\&A-shaped sections and copy-adaptable code.157- Do placeholders follow a consistent, machine-recognizable convention158 (UPPER\_SNAKE tokens with replace-instructions)?159160### RAG / retrieval (weeks; the layer you can move now)161162- **Chunk quality**: each h2 section should stand alone with the answer in163 its first sentence. Retrievers extract passages without surrounding164 context.165- **Twin fidelity**: read the generated Markdown twin, don't trust that it166 mirrors the HTML. Look for conversion bugs (lost whitespace around links167 and code spans, broken tab-group rendering) and for repeated boilerplate168 (beta banners, sunset notices) consuming the first chunk of every page169 in a section — that makes section pages embed near-identically and170 surfaces the banner instead of the answer.171- **The dead-end test**: for the page's core question, what does a172 docs-grounded assistant retrieve and what can it actually answer? "Check173 your instance" or "see the UI" is a terminal non-answer for every hosted174 assistant.175176### Agent harness (immediate)177178- Can an agent execute the page's guidance headlessly? Token auth in a179 fenced command beats "log in via the browser."180- Are machine-readable contracts published or fetchable (OpenAPI, JSON181 schema, MCP)? An interactive UI is not a contract.182- Are URL shapes predictable and anchors stable enough to construct from a183 task description? Count the hops from product root to the answer.184185## Step 4: Report186187Lead with the verdict — what's solid, what's broken, in two or three188sentences. Then:189190- **Facts with evidence.** Every finding cites the fetched URL, file path,191 or command output that proves it. Distinguish confirmed facts from192 inferences.193- **Separate findings by level.** Page-level (fix in the content),194 product-level (fix in data or config — for example a missing corpus195 entry), and pipeline-level (fix in shared templates or converters,196 affects all products). Mislabeling a pipeline bug as a page bug sends197 the fix to the wrong place.198- **Prioritized recommendations.** Order by leverage: discovery-path199 breaks first (they gate everything else), then machine-readable200 contract gaps, then content coverage, then twin hygiene.201- **Credit what works.** Inherited infrastructure (head links, JSON-LD,202 sitemap entries) that the change gets for free belongs in the report —203 it scopes the real gaps and prevents re-litigating solved problems.204205Produce the report; don't file anything unsolicited. Then offer206follow-ups. If the user accepts:207208- File pipeline-caused findings as **general** issues citing the observed209 pages as evidence — not product-scoped issues, which misleads triage.210- For small mechanical fixes (a cross-link, a frontmatter field), prefer a211 direct PR over an issue.212213## Repo specifics214215Before reviewing anything on docs.influxdata.com or in this repo, read216[DOCS-AI-VISIBILITY.md](../../../DOCS-AI-VISIBILITY.md) — it maps the three217Markdown artifact layers, the eligibility predicates and their source218files, the products.yml gate that controls `llms.txt` inclusion, and the PR219preview workflow's known artifacts. Reviews that skip it rediscover (or220misdiagnose) the same plumbing every time.221222[DOCS-DEPLOYING.md](../../../DOCS-DEPLOYING.md#llm-markdown-generation)223covers how those artifacts are generated, if a finding traces back to the224build rather than to content.