# How the AI Visibility grade is built

> Every one of the 48 checks behind the AI Visibility grade: what it measures, whether it observes your server or reads a declaration you make, the severity it is charged at, and what it is worth out of 100. Rubric v1.4.0.

Canonical: https://prompeteer.ai/ai-visibility/methodology

We do not publish a leaderboard. This page names no site but our own, carries no example grade attached to anybody, and there is no public index of the reports we produce: a report is a private page behind a share token, marked noindex, belonging to whoever asked for it.

Everything below is generated from the scorer itself — the ids, titles, pillars,
severities and point values are read out of the same module that produces your
report, at the moment this page is served.

## The arithmetic

A check either passes, fails, or could not be measured. A failure costs its
severity; a pass is worth exactly what the failure would have cost. A critical failure costs 6x what a minor one costs, an important one 2x.
A check we could not measure leaves the denominator entirely — it is never
printed as a zero.

Each pillar scores its passes over its counted checks and the five combine at the
declared weights. A pillar that measured less than 50% of its own severity
points drops out rather than concentrating its weight, and dropping only happens
while at least 50 of the declared 100 points survive it.

Bands: A+ 95 · A 90 · B+ 85 · B 80 · B- 75 · C+ 60 · C 50 · D 35 · F 0. The letter is a pure function of the
total and nothing rewrites it.

## What each check is actually worth

The declared pillar weights are not what decides a check's leverage; the pillar's
scoreable check count is, and the spread between the widest pair is 2.67x. Nobody chose those
ratios — they fell out of how many checks each pillar accumulated — and they are
published rather than repaired because repairing them means moving a pillar
weight, which may not happen until it has been validated against measured
visibility on a held-out half.

- **Retrievability** — 30% declared, 13 scored checks, 0.75 points per severity point. The lowest rate, because it holds by far the most checks: thirteen scoreable ids over forty severity points. Its minor checks are the cheapest in the rubric, which is why a long redirect chain costs a third of what an llms.txt does.
- **Parseability** — 25% declared, 8 scored checks, 1.25 points per severity point. Two critical checks inside eight make P1 and P2 the largest single checks in the rubric. That is the one concentration here which matches the evidence: a document with no words in it cannot be quoted by anybody, whatever else is true of it.
- **Answerability** — 20% declared, 7 scored checks, 2.00 points per severity point. The joint highest rate in the rubric. Seven scoreable checks over ten severity points, and it lost one of each when A5 was folded into A2 at v1.4.0, which raised what the rest are worth. An important answerability check is now worth as much as a critical retrievability one.
- **Entity and trust** — 15% declared, 9 scored checks, 1.25 points per severity point. Nine scoreable checks over twelve severity points, three of them third-party signals that come back unmeasured on every audit today. In practice the pillar divides its weight across six checks rather than nine.
- **Agent readiness** — 10% declared, 5 scored checks, 2.00 points per severity point. The joint highest rate, and the least defensible of the five: five minor checks divide ten declared points, so declaring an OpenAPI document is worth more than a short redirect chain. No engine has been shown to read four of the five. We publish the number rather than quietly shrinking the pillar, because the fix is a weight move and a weight move needs evidence we do not have yet.

## What each check reads

- **Observed** (31) — Measured on a response your server actually gave us — a status code, a header, a timing, or the bytes we received.
- **Declared** (13) — Read out of a declaration your site makes about itself. We parse it and take it at face value; we do not verify that it is true. These are the checks a determined site can satisfy without changing anything a reader would notice, and saying so is more useful than pretending otherwise.
- **Third party** (4) — Read from an index somebody else owns, which we neither control nor can reproduce on demand.
- **Typed URL** (0) — Read from the URL typed into the form rather than from the server that answered it. Nothing is in this class at v1.4.0 — R2 left it when it started reading the final response — and the name is kept so a check cannot fall back into it unnamed.

The 4 third-party checks (R13, E9, E10, E11) come back unmeasured on every audit
today: the collector behind them is not wired to anything. They take no points
from anybody and add none.

## The 48 checks

### Retrievability — 30%

- **R1 Canonical URL responds** — Observed · Critical · 4.50 points
  Whether an ordinary anonymous request for this exact URL came back with a 200, and how long it took.
  Fix: Return 200 for the URL you want quoted; if it redirects, audit the destination instead.
- **R2 Served over HTTPS** — Observed · Important · 1.50 points
  Whether the URL the server finally answered on — after every redirect — is an https one. Before v1.4.0 this read the URL typed into the form, which is not a fact about your server.
  Fix: Serve the canonical URL over HTTPS and redirect http to https.
- **R3 Short redirect chain** — Observed · Minor · 0.75 points
  How many redirect hops stood between the URL we asked for and the response we got.
  Fix: Collapse the chain so the canonical URL answers in one hop.
- **R4 robots.txt is readable** — Observed · Minor · 0.75 points
  Whether /robots.txt answered, and how many bytes it held. No robots.txt is not a failure — it permits everything.
- **R5 Retrieval crawlers allowed** — Declared · Critical · 4.50 points
  What your own robots.txt says about the eight retrieval agents, read under RFC 9309 rules. This is your declaration, not a test that your server honours it.
  Fix: Allow OAI-SearchBot, Claude-SearchBot and PerplexityBot. Blocking these removes you from answers, not from training.
- **R6 Training crawler posture** — Declared · Reported, not scored
  What your robots.txt says about the eight training agents. Reported so the choice is visible; never scored, because refusing model training is a legitimate decision.
- **R7 Crawlers reach the edge** — Observed · Critical · 4.50 points
  Whether your edge served a 200 to requests carrying a retrieval crawler’s user-agent token. We send those tokens from a Prompeteer address, not the vendor’s, and the vendors publish IP lists precisely so you can refuse a stranger sending their name — so a site that verifies crawlers properly refuses us and shows here as blocked.
  Fix: Allow these user agents at the CDN or WAF, then upload your server logs so the finding rests on your own records rather than on our probe.
- **R8 Responds quickly** — Observed · Minor · 0.75 points
  Wall-clock time to the first byte of the anonymous response, measured once from our network.
  Fix: Aim for under 800ms to first byte.
- **R9 Response is compressed** — Observed · Minor · 0.75 points
  Whether the response carried a content-encoding header, meaning the origin compressed it.
  Fix: Enable gzip or brotli.
- **R10 Sitemap reachable** — Observed · Minor · 0.75 points
  Whether /sitemap.xml answered with a 200 when we asked for it, which is how a crawler finds the pages nothing links to.
  Fix: Publish a sitemap and reference it from robots.txt.
- **R11 Self-referential canonical** — Declared · Important · 1.50 points
  Whether the page’s own canonical link points back at the URL we audited. Host and path are compared after ignoring case, a trailing slash, a leading www and any query string; the scheme is R2’s question, not this one.
  Fix: Point the canonical at this URL, or audit the URL the canonical names — a page that canonicalises elsewhere is asking engines to quote that other page.
- **R12 Page is indexable** — Declared · Critical · 4.50 points
  Whether a robots meta tag or X-Robots-Tag header on this page says noindex, or the bare `none` that means noindex and nosnippet together.
  Fix: Remove noindex, or the `none` directive, from the page you want quoted.
- **R13 Present in the open training corpus** — Third party · Minor · 0.75 points
  Whether Common Crawl holds captures for this domain. Reported at minor and never critical: measured, a site that blocks CCBot outright can still return index rows, and well-known sites can return none.
  Fix: Allow CCBot if you want to be in the open corpus, and earn inbound links. This moves over months and is not something to optimise for directly.
- **R14 Snippet extraction allowed** — Declared · Critical · 4.50 points
  Whether a robots directive forbids showing text from this page — nosnippet, max-snippet:0, or a bare `none`. A page can be perfectly indexable and still never quotable.
  Fix: Remove nosnippet and max-snippet:0. They permit indexing but forbid quoting, which is the whole of an answer engine citation.

### Parseability — 25%

- **P1 Content present without JavaScript** — Observed · Critical · 7.50 points
  How many words of visible text sat inside the page’s main region in the raw HTML, with no JavaScript executed. Under 120 words there is nothing to quote; 120 to 299 is thin.
  Fix: Server-render the body, and give the page 300+ words of substance in its main region.
- **P2 Not an empty SPA shell** — Observed · Critical · 7.50 points
  Whether the document is an empty mount point and nothing else — a div the framework fills in later, with no words in it and no words anywhere around it either.
  Fix: Pre-render or server-render this route.
- **P3 Bots and humans get the same page** — Observed · Important · 2.50 points
  Whether a crawler user-agent and a browser user-agent received the same amount of text for this URL, in both directions. Serving crawlers more is cloaking; serving them less starves them.
  Fix: Serve one document to everybody.
- **P4 Exactly one H1** — Observed · Important · 2.50 points
  Whether the raw HTML carries exactly one H1, so an extractor has one unambiguous title for the page.
  Fix: Use exactly one H1.
- **P5 Heading levels are not skipped** — Observed · Minor · 1.25 points
  Whether the heading levels descend without skipping a level.
  Fix: Do not jump heading levels.
- **P6 Content sits in a landmark** — Observed · Minor · 1.25 points
  Whether the body copy sits inside a main or article landmark rather than loose in the body.
  Fix: Wrap the body copy in <main>.
- **P7 Content outweighs boilerplate** — Observed · Minor · 1.25 points
  What share of the document’s visible words are inside the main region rather than in navigation, chrome and footers.
  Fix: Reduce chrome relative to content.
- **P8 HTML within size limits** — Observed · Minor · 1.25 points
  Whether the response was HTML and arrived under our 2MB read cap.
  Fix: Serve text/html and keep the document small enough to be read whole.
- **P10 Graded document** — Observed · Reported, not scored
  Which of the responses we collected the content checks actually read, and its word count. Reported so a reader can check every other finding against the right document; never scored.

### Answerability — 20%

- **A1 Answer-first opening** — Observed · Important · 4.00 points
  The length of the first real paragraph in the main region. 40 to 120 words is a passage an engine can lift whole.
  Fix: Open with a self-contained 40-120 word answer that can be lifted as a citation.
- **A2 Question-shaped headings** — Observed · Important · 4.00 points
  How many headings are real questions — a wh-word or an auxiliary inside the clause a question mark closes, so "How it works" and "What we do" do not count. Carries A5’s points since v1.4.0.
  Fix: Phrase section headings as the questions buyers actually ask.
- **A3 Paragraphs are extractable** — Observed · Minor · 2.00 points
  The median paragraph length in the main region. 40 to 150 words is a paragraph that survives being quoted on its own.
  Fix: Aim for self-contained 40-150 word paragraphs.
- **A4 Structured content present** — Observed · Minor · 2.00 points
  Whether the main region contains a list or a table.
  Fix: Add a list or a comparison table.
- **A5 Visible FAQ** — Observed · Reported, not scored
  How many of A2’s question headings carry a visible question mark. Reported and not scored since v1.4.0: it counted a subset of what A2 had already counted, so scoring both charged one measurement twice.
  A5 was folded into A2 in v1.4.0. A5 counted the visible questions among exactly the headings A2 had already counted, at the same threshold, so a page could not pass A5 without passing A2 — you were being charged twice for one measurement. A2 carries the points now.
- **A6 FAQ schema matches visible Q&A** — Observed · Important · 4.00 points
  Whether every question in your FAQPage markup also appears as copy a person can see, matched by text against the whole visible document.
  Fix: Every FAQPage question must appear as visible copy. Schema without visible Q&A is a penalty, not a win.
- **A7 Sentences are readable** — Observed · Minor · 2.00 points
  Mean sentence length across the prose in the main region, counted on the document we received.
  Fix: Shorten sentences toward 25 words.
- **A8 Summary near the top** — Observed · Minor · 2.00 points
  Whether the page opens with a heading followed by prose, rather than with a bare hero or a form.
  Fix: Lead with a heading and a summary.

### Entity and trust — 15%

- **E1 Structured data present** — Declared · Important · 2.50 points
  Whether the page carries JSON-LD and whether every block of it parses. Carries E2’s points since v1.4.0.
  Fix: Emit valid JSON-LD, and fix any block that fails to parse.
- **E2 Organization identified** — Declared · Reported, not scored
  Which Organization type, if any, the JSON-LD graph declares — LocalBusiness and its descendants count. Reported and not scored since v1.4.0: it reads the same parsed graph E1 tests.
  E2 was folded into E1 in v1.4.0. E2 read the Organization node out of the same JSON-LD graph E1 parses, and over 500 seeded pages the two never disagreed. E1 carries the points now; E2 still reports what type it found.
- **E3 sameAs links** — Declared · Minor · 1.25 points
  How many sameAs links the graph carries out to profiles elsewhere.
  Fix: Link the Organization to at least two authoritative profiles.
- **E4 Connected entity graph** — Declared · Important · 2.50 points
  Whether every @id this page references is also defined on this page. References to another host — Wikidata, a parent company — are deliberate links out and are not asked for.
  Fix: Define every @id you reference on this page.
- **E5 Author is resolvable** — Declared · Important · 2.50 points
  Whether a page marked up as an authored work also names an author in the graph. A homepage marked up as WebPage is not expected to have one.
  Fix: Name an author and resolve it to a Person node.
- **E6 dateModified is precise** — Declared · Minor · 1.25 points
  Whether dateModified is an ISO 8601 timestamp with a time, rather than a bare date.
  Fix: Emit dateModified as ISO 8601 with a time and offset.
- **E7 Freshness is real** — Declared · Minor · 1.25 points
  Whether dateModified differs from datePublished. Having no dates at all is reported, not scored — an absence of evidence is not freshness.
  Fix: Update dateModified when the content actually changes.
- **E8 Social card complete** — Declared · Minor · 1.25 points
  Whether all three of og:title, og:description and og:image are present in the head we read.
  Fix: Complete the Open Graph tags.
- **E9 Resolvable public entity** — Third party · Minor · 1.25 points
  Whether a Wikidata entity resolves for this brand, giving engines a canonical thing to attach your name to.
  Fix: A Wikidata entry gives engines something to resolve your name to; it is written by other people, over months.
- **E10 Off-site brand mentions** — Third party · Minor · 1.25 points
  How often this brand is mentioned on the off-site source we track.
  Fix: Models learn brands from what others write about you, not only from your own pages.
- **E11 Domain first seen** — Third party · Reported, not scored
  The date of the first web-archive capture of this domain. Reported and never scored: it dates the domain string, not the business — monday.com’s first capture is 1996 and the company was founded in 2012.

### Agent readiness — 10%

- **G1 Markdown twin available** — Observed · Minor · 2.00 points
  Whether a markdown twin of this page exists, either at a .md suffix or through Accept: text/markdown.
  Fix: Publish a markdown twin.
- **G2 Well-known discovery** — Observed · Minor · 2.00 points
  Whether any of the seven /.well-known/ paths we ask for answered with a 200.
  Fix: Publish an agent-content index under /.well-known/.
- **G3 MCP endpoint declared** — Observed · Minor · 2.00 points
  Whether an MCP endpoint answered, at /.well-known/mcp.json or at /mcp, so an agent can act and not only read.
  Fix: Expose an MCP endpoint so agents can transact, not just read.
- **G4 Machine-readable API surface** — Observed · Minor · 2.00 points
  Whether /openapi.yaml or /.well-known/api-catalog answered, which is how an agent learns what it can call here.
  Fix: Publish an OpenAPI document.
- **G5 Link: alternate header** — Observed · Minor · 2.00 points
  Whether the response carried a Link header advertising alternate representations.
  Fix: Advertise alternates in a Link header.
- **G6 llms.txt (reported, not scored)** — Observed · Reported, not scored
  Whether /llms.txt exists. Reported and never scored: Google states it has no effect on Search and no engine has confirmed reading it.

## Checks that stopped charging

An id is never reused and two checks are never folded into one, because the id is
the join key for every audit already stored.

- **A5** → A2. A5 was folded into A2 in v1.4.0. A5 counted the visible questions among exactly the headings A2 had already counted, at the same threshold, so a page could not pass A5 without passing A2 — you were being charged twice for one measurement. A2 carries the points now.
- **E2** → E1. E2 was folded into E1 in v1.4.0. E2 read the Organization node out of the same JSON-LD graph E1 parses, and over 500 seeded pages the two never disagreed. E1 carries the points now; E2 still reports what type it found.

Retired ids:

- None. No id has stopped being emitted.

## When a critical failure holds the grade

The letter is never remapped. A hold travels beside the score as its own state.
No check is admitted to that gate today; the mechanism ships inert, because a gate turns our measurement error into somebody’s letter and no check yet has a measured false-positive bound.

Permanently excluded:

- **R7** — The block is inferred from our own fetch carrying somebody else's crawler token from our address. Vendors publish IP lists precisely so a site can refuse that, so a well-configured site fails it — the false positive rate is high and unmeasured, and it points the wrong way.
- **R13** — A third-party corpus that archives a randomly selected subset of the web. Absence from it is not absence from anything a reader cares about, and no site can fix it.

## What this rubric does not measure

### Anything off your site

Who links to you, who writes about you, how often your brand is mentioned anywhere we do not fetch ourselves. Four checks are declared for third-party indexes and every one of them returns unmeasured on every audit today, because the collector behind them is not wired to anything — they take no points off anybody and they add none. When off-site signals do arrive they will sit beside the grade as evidence and not inside it, because they come from third parties we do not control and cannot reproduce on demand.

### Anything only your own data can answer

Server logs, Search Console and Bing exports, analytics, referrals from assistants, conversions. A file you upload is a text file: a check that reads it is a check you grade yourself, so nothing you upload moves your score, now or later. Those uploads exist to tell you things the rubric cannot, not to change the number.

### Whether a real crawler is actually blocked

We fetch your page several times presenting different crawlers' user-agent tokens, from our address rather than the vendor's, and every one of those requests also carries our own token. The vendors publish IP lists precisely so a site can refuse a stranger sending their name — so a site that verifies crawlers properly refuses us, correctly, and that shows up as a block. It is evidence worth having and it is not proof. Details are on /bot.

### What a model already knows about you

Whether a brand appears in an answer without retrieval is a property of text written before the model was trained, not of the page we fetched this morning. Nothing on your site changes it this month, so nothing in this rubric claims to.

### Whether your content is any good

Accuracy, originality, expertise, whether the claims are true. Every check here is structural: it asks whether a machine can retrieve, parse, quote and act on the page, never whether it should. A page can score well and be worthless, and the grade should not be read as saying otherwise.

### Ranking, traffic or revenue

The rubric has never been validated against measured visibility. The weights below are expert priors, and until they clear a held-out half against real outcomes they are exactly that. We would rather publish the arithmetic and let you argue with it than imply an evidence base we do not have.

---
Rubric v1.4.0 · 48 checks · https://prompeteer.ai/ai-visibility · https://prompeteer.ai/bot
