How the number is calculated
Score = 100 × passed weight ÷ tested applicable weight, rounded to the nearest integer. Coverage = tested applicable weight ÷ all applicable weight. Unknown checks affect coverage and never pretend to pass. Inapplicable checks are excluded. Page-level weights are divided equally across sampled pages.
If 80 weighted points pass out of 90 tested points, the score is 89. If another 10 points could not be tested, weighted coverage is 90%. Read both numbers together.
The report also counts how many checks could run. A check could run when its result is a pass, a failure, or not applicable. Unknown means that check could not be completed. If robots.txt disallows our crawler, or fewer than 60% of the checks could run, the result is a limited check. It lists what those checks found and does not show an overall score, because a number from so few checks would mislead.
Version 1 rules
| Category / check | Weight | Source |
|---|---|---|
| Crawler accessibility Documented search crawler policies allow the target | 30% | IETF |
| Indexability Pages return successful HTTP responses | 15% | |
| Indexability No observed noindex directive | 10% | |
| Content extractability Descriptive page title is available | 8% | |
| Content extractability Exactly one primary heading is available | 6% | W3C |
| Content extractability Heading levels follow a logical hierarchy | 3% | W3C |
| Content extractability Social sharing metadata is present | 3% | |
| Technical structure Mobile viewport is declared | 3% | W3C |
| Agent accessibility Images declare dimensions | 2% | |
| Content extractability Text is present in raw HTML | 6% | |
| Technical structure Canonical configuration is unambiguous | 8% | |
| Technical structure A valid sitemap is discoverable | 7% | Sitemaps.org |
| Structured data Existing JSON-LD parses successfully | 5% | Schema.org |
| Agent accessibility Native form controls have apparent names | 5% | W3C |
| Content extractability Meta description is present and length-appropriate | 5% | |
| Content extractability Page provides substantive extractable text | 6% | |
| Content extractability Document language is declared | 3% | W3C |
| Structured data Organization or Person identity schema is present | 5% | Schema.org |
| Agent accessibility Images have alt attributes | 5% | W3C |
| Technical structure Sitemap URLs declared in robots.txt are reachable | 4% | Sitemaps.org |
| Structured data LocalBusiness markup includes name, address, and phone | 4% | Schema.org |
| Structured data FAQPage questions include a name and an accepted answer | 3% | Schema.org |
| Content extractability A visible question-and-answer section is present | 3% | |
| Structured data Business name, address, and phone agree across sampled pages | 4% | Schema.org |
Why these categories
A separate AI readiness component would double-count crawl and content evidence. Trust, authorship, freshness and citation quality require context and are not numerical penalties in version 1.
Intentional policy choices
Training-only crawlers do not affect the search-policy score. Google-Extended and Applebot-Extended are control tokens, not search crawlers, so blocking them is not a search penalty. Missing llms.txt has no penalty. Google Search says it does not use that file. Missing JSON-LD, LocalBusiness markup, forms or canonical declarations is not automatically a failure. When those types are present, missing names, phones, addresses or FAQ answers are reported. Malformed or conflicting canonicals are reported. Sitemap absence has a small weight. A sitemap URL declared in robots.txt that returns 404 or 410 is reported separately. A successful response that is not sitemap XML is reported the same way.
What the tests cannot prove
Our HTTP observations are not verified crawler activity. Policy is not enforcement. Raw markup does not prove keyboard operation or rendered visibility. JSON-LD syntax does not establish rich-result eligibility. We do not measure indexing, rankings or citations.
Version history
1.0.0: initial raw-HTML model. Weights total 100 before applicability normalization. Reports retain the version so algorithm changes are not mistaken for website changes.
1.1.0: added meta description length, extractable word count, a document-language check and an Organization/Person identity-schema check. All four run on raw HTML with no third-party data source. Weights total 124 before applicability normalization.
1.2.0: added title-length, exactly-one-H1, heading hierarchy, Open Graph and Twitter card presence, mobile viewport and image dimension checks. These inspect raw markup only. Browser-rendered layout, Core Web Vitals, remote image weight, backlink metrics and credentialed search data are not measured. Weights total 135 before applicability normalization.
1.3.0: named AI product tokens are matched to their own robots group, otherwise the * group. Added checks for robots-referenced sitemap responses, LocalBusiness name/address/phone when that type is present, FAQPage question and answer fields when that type is present, visible question headings, and name/address/phone agreement across the sample. llms.txt stays unscored. Page speed and live AI-mention checks are not part of this version. An overall score is withheld when robots.txt disallows our crawler or fewer than 60% of checks could run. Weights total 153 before applicability normalization.
1.3.1: same weights as 1.3.0. Robots-declared sitemap URLs are fetched and checked as sitemap XML, including when the content type is not XML. A 200 response that is not a urlset or sitemapindex fails instead of staying unknown. Name, address, and phone agreement passes only when a name, a phone, and an address field can each be compared on two pages. Agreement on a name alone is unknown.