BEHIND THE CHECKS
How Chad's audit keeps improving.
SEO. LLM readiness. Agent discovery. See what we check, why we changed it, and the evidence behind it. This is the history of Chad's checks, not changes to your site.
240 checks in this catalogue · 136 rule histories · Latest recorded change
Run a free audit →See our own site report →Showing the saved catalogue.
Catalogue d6e379ab11aa · Snapshot assembled
Engine f97b21577afb. This history covers rule and check changes; it is not a complete product or scoring-formula release log.
Every recorded check, including observations and checks that could not be assessed. Areas can overlap; weights and the headline score stay the same.
136 rules · newest change first
Render-Blocking Resources
Link to this checkCounts the CSS and JavaScript that delay first render.
- Link to revision
Counts a stylesheet unless its media is print, and an external script only when it has no async or defer, is not a module and sits in <head>; before, every stylesheet and every external non-module script counted wherever it was. Capable of moving, one-directional: counts can only fall, so warn to pass only; pages stored before the parser recorded async, defer and position keep the old count. The warn threshold (above 6) is unchanged. Measured (fresh --coverage quick captures re-analysed from the same stored HTML): pages warning 25 to 0 on trychad.ai, 25 to 0 on networthtrackr.com, 24 to 0 on arrosqd.com, 12 to 0 on babra.ai, 25 to 0 on skatecred.com and 25 to 0 on inboxplease.com; overall score and grade unchanged on all six, outstanding warnings down by one on each.
Claimed agent HTTP response
Link to this checkCompares bounded browser-style HTTP control and claimed registered crawler user-agent responses at one sampled URL. Reports observed refusals, payment requirements or short content without asserting vendor-IP access or indexing outcomes. Captured experiments are unscored and independently request-bounded.
- Link to revision
When choosing an article page to probe, it now recognises the same Article types as every article check (adding Report, AnalysisNewsArticle, OpinionNewsArticle and LiveBlogPosting). This changes which page future crawls sample, not stored results. Unscored; capable of moving, not observed on our reference sites.
- Link to revision
Now samples up to three URLs: the target plus an article-like page (path depth 2 or more with Article markup) and a page carrying a price, chosen from the crawl by URL structure and markup. Each agent identity is compared with the control at the same final URL and reports its word ratio. Default visibility probe budget raised from 12 to 26. Unscored; capable of adding observation rows, not of moving a score.
- Link to revision
Permitted agent requests now run independently when the browser-style control is unhealthy. Bot requests omit Chrome client-hint/navigation headers. Direct responses remain explicit without a control; relative short-content review requires a healthy matching control and now catches responses at least 20 words long too. Missing/refused robots evidence prevents requests. Unscored; capable of changing observations, not scores.
- Link to revision
Probe body limit raised from 64 KiB to 2 MiB: it re-requests a whole page, and every reference homepage exceeded the old limit, so the check never ran. Measured: not_checked to pass on all five reference sites. Unscored, so no score moved.
- Link to revision
Archived observations must match expected URL, user agent, Accept header, emitted-request provenance and bounded response facts; Markdown capability flags must agree with media type and nonempty text. Contradictory archives remain not checked instead of asserting capability. Unscored behavior, capable of changing observations; not observed on the historical reference captures, which contain no such response experiments.
Citation Information Gain
Link to this checkFlags an Article whose citation list names only third-party sources, none of them the site's own analysis or data. content/semantic-completeness has always documented that it cannot measure information gain from a single page and asks the reader to judge it themselves — this narrower check fills that named gap from the citation list alone: a page citing nothing but other people's research gives an engine no reason to quote it over the sources it names.
- Link to revision
Now reads the citation list from Report, AnalysisNewsArticle, OpinionNewsArticle and LiveBlogPosting nodes as well, the same Article types every article check uses. Pages carrying only one of those types were previously not applicable. Capable of moving, not observed on our reference sites.
Latest captured article opening review
Link to this checkProvides one bounded opening from the latest reliably dated captured article for an agent to assess. Publication ambiguity and missing content remain unknown; this is an unscored sample, not a finding about all articles.
- Link to revision
An article dated both by a date-only value and a date-time on the same written day (JSON-LD 2026-03-04 beside meta 2026-03-04T09:30+10:00) was discarded as having conflicting dates; it is now dated by the date-time. An ambiguous numeric date such as 01/02/2026 is no longer read month-first and no longer dates an article. Changes which article is selected for review and how many are counted undated; unscored. Capable of moving, not observed on our reference sites.
Semantic Completeness
Link to this checkScores how completely a page covers its own subject, against the threshold we publish rather than an implicit one. Added because thin-but-technically-valid pages passed every structural check while having little chance of being cited.
- Link to revision
The article test it is gated on now accepts a datePublished on Report, AnalysisNewsArticle, OpinionNewsArticle and LiveBlogPosting nodes as the page's date, the same Article types every article check uses. A long, bylined page off a blog path dated only that way is now treated as an article. Capable of moving, not observed on our reference sites.
- Link to revision
The article-shape fallback used by this rule for pages off a blog path no longer treats a homepage as an article, no longer accepts a bare datePublished string (such as the WebPage node Yoast writes on every page) as the page's own date, and no longer reads ordinary prose such as 'by the standards of' as a byline. Measured by replaying the stored captures (645 pages, bodies hash-verified, same inputs both sides): 32 captured pages stop being read as articles and none start to, which is those same six homepage and marketing pages plus the inboxplease.com/blog index. Project aliases repeat them, so they are not independent examples. Found on fellow.app/, which was reported as an article-shaped page with no Article JSON-LD. Pages it no longer treats as articles are reported not applicable.
Article Schema
Link to this checkArticle structured data describes news and blog content using named schema properties. This check reports missing or malformed recommended fields; recommendations are not requirements for Google rich-result eligibility.
- Link to revision
The Article types it looks for now match the ones the article profile uses: Report, AnalysisNewsArticle, OpinionNewsArticle and LiveBlogPosting were added. Before this, a page could be classified as an article from its OpinionNewsArticle markup, and then this check found no Article entry and warned on valid markup. Capable of moving, not observed on our reference sites (none of the five use those types).
- Link to revision
The article-shape fallback used by this rule for pages off a blog path no longer treats a homepage as an article, no longer accepts a bare datePublished string (such as the WebPage node Yoast writes on every page) as the page's own date, and no longer reads ordinary prose such as 'by the standards of' as a byline. Measured by replaying the stored captures (645 pages, bodies hash-verified, same inputs both sides): 26 warnings clear and none are added, across six distinct pages: the trychad.ai and arrosqd.com homepages, three other arrosqd.com pages (menus, girls-brunch, privacy-policy) and fellow.app. Project aliases repeat these pages, so they are not independent examples. Found on fellow.app/, which was reported as an article-shaped page with no Article JSON-LD. The missing-schema warning now says why the page reads as an article.
- Link to revision
Article checks now report missing or malformed recommended headline, image and author fields, including linked author names and identifiers. Missing dates are contextual recommendations without a penalty; malformed dates are reported. Google lists no required Article properties. Existing rule weight and severity remain; findings and scores can move.
- Link to revision
Article field checks now inspect every current-document declaration in one finding and resolve captured nested author and image definitions. Related article cards cannot supply this page's fields. A lone declaration matching the primary heading remains inspectable when its URL identity is outdated; identity disagreements remain separate evidence. MedicalClinic authors are accepted as an Organization subtype. Measured on the same 2,852 stored pages: warnings changed 1,780 to 1,756, with 35 nested-author warnings cleared and 11 additional warnings for incomplete second declarations. These changes can move scores; measured integer score sensitivity did not change. Ambiguous association and bounded traversal limits are reported as not checked.
- Link to revision
Recognized article-section roots without a current-document Article declaration are now explicitly not applicable, so related-card date and author data cannot turn a listing into a missing-schema warning. Current-document declarations still receive field checks, including incomplete declarations. This guard is scoped to the Article rule; shared readers are unchanged. On the same 35 projects and 2,852 usable captured pages, the combined reader and applicability changes clear 49 warnings and add 11: 35 cleared nested-author warnings and 14 cleared listing warnings. Another 22 prior passes become explicit not-applicable executions; 36 captured rows use the guard. Project aliases and duplicate final URLs are not independent examples.
Article Citability Signals
Link to this checkChecks the Article properties that earn citations — author, dates, publisher — rather than only the subset that unlocks rich results. Rich-result eligibility and citation-worthiness had been treated as the same thing; they are not, and AI answer engines read the second set.
- Link to revision
Now checks Report, AnalysisNewsArticle, OpinionNewsArticle and LiveBlogPosting nodes as well, the same Article types every article check uses. Pages carrying only one of those types were previously skipped. Capable of moving, not observed on our reference sites.
Article Identity Consistency
Link to this checkChecks that an Article's url, @id and mainEntityOfPage agree with the page's own canonical URL rather than a stale or copy-pasted value. This is not a Google rich-result requirement — none of these properties are required or even recommended there — it is an entity-resolution check: an engine reading the node needs to know which URL the claim actually belongs to, and a disagreeing value misdirects it.
- Link to revision
Now checks Report, AnalysisNewsArticle, OpinionNewsArticle and LiveBlogPosting nodes as well, the same Article types every article check uses. Pages carrying only one of those types were previously skipped. Capable of moving, not observed on our reference sites.
About Page
Link to this checkChecks for an about/company page with content
- Link to revision
Recognises /founder, /founders and /about-us paths as about pages, and reports an about link whose destination was not captured as not_checked (insufficient_input) instead of a warning, matching eeat/privacy-policy. Measured: inboxplease.com (/founder) warn to pass; no movement on the five reference sites.
Contact Page
Link to this checkChecks for contact page with multiple contact methods
- Link to revision
Phone detection now prefers tel: links (any country) and recognises international, Australian (04xx, 02/03/07/08, 1300/1800) and UK national formats in addition to NANP; email detection also checks mailto: links and /contact-us paths. Measured: pattenelectrical.com warn to pass; arrosqd.com warn to pass.
NAP Consistency
Link to this checkChecks for consistent Name, Address, Phone across site
- Link to revision
Uses the shared phone extractor: prefers tel: hrefs when present on a page, supports AU/UK/international phone formats, and normalises +61/+64/+44/+1 country prefixes to national trunk form so E.164 hrefs and national display text are not flagged as two conflicting numbers. Measured: pattenelectrical.com warn to pass; no score movement on the five reference sites.
Horizontal Scroll
Link to this checkChecks for elements that may cause horizontal scrolling
- Link to revision
Scans inline style="…" attribute values via the DOM for width or min-width >600px and overflow-x:auto/scroll rather than matching across raw HTML, which flagged <img sizes="(max-width: 768px) …"> and @media (min-width: 1024px) rules in <style> blocks. Measured: warnings dropped on arrosqd.com (17 to 0 pages), trychad.ai (16 to 6 pages) and skatecred.com (1 to 0 pages); overall scores unchanged.
Agent documents for developer sites
Link to this checkDeveloper sites are read by coding agents as well as people. Which agent documents exist is a fact one request each establishes, once the site is known to be one that offers an API.
Facts that need JavaScript
Link to this checkA page that shows 0+ to a reader without scripts states something false. The comparison needs no new request when the page was rendered.
llms.txt links
Link to this checkA file meant as a map of the site is only useful if its links work. The links are the part of llms.txt a crawl can verify; whether any assistant reads the file is not established, so this is hygiene only.
Optional Markdown delivery
Link to this checkRequests text/markdown and one bounded same-origin alternate when negotiation does not deliver Markdown. Missing optional support is an unscored observation; incomplete or refused requests remain unknown. Captured experiments are unscored and independently request-bounded.
- Link to revision
Adds an observation row for the .md twin it already fetches: its status and the ratio of its words to the page's main-text words. A ratio under 0.6 or over 1.6, or an advertised twin that does not resolve, is reported; a guessed .md path that answers 404 is not. No new request. Unscored; verdicts of the existing row unchanged.
- Link to revision
The result now says how an agent reading the sampled page gets Markdown (content negotiation, the .md path, or an advertised alternate) and whether the captured llms.txt links the page or its Markdown. Unscored; verdicts unchanged. Measured: trychad.ai reports the .md path and an llms.txt listing, both confirmed against the live site.
- Link to revision
Visibility probes now retain missing/refused robots policy as unavailable rather than permission. Independent agent fallback shares the existing request budget, so remaining Markdown requests can be explicitly budget-limited. Captured Markdown semantics and scoring unchanged.
- Link to revision
Probe body limit raised from 64 KiB to 2 MiB, so the check now runs on ordinary homepages. Measured: not_checked to pass on trychad.ai and babra.ai (alternate delivery), to the unscored no-Markdown observation on the other three. No score moved.
- Link to revision
Archived observations must match expected URL, user agent, Accept header, emitted-request provenance and bounded response facts; Markdown capability flags must agree with media type and nonempty text. Contradictory archives remain not checked instead of asserting capability. Unscored behavior, capable of changing observations; not observed on the historical reference captures, which contain no such response experiments.
Decision pages for your rivals
Link to this checkBuyers choosing between vendors, and the answer engines they ask, read comparison pages. Whether the site has one per rival, and whether it carries the elements that make it citable, is a fact a crawl can establish once the caller says who the rivals are.
Near-identical templated pages
Link to this checkProgrammatic pages are only worth scaling when each says something the others do not. The crawl already holds the text needed to see whether a template's pages are the same page repeated.
All Non-Indexed Pages
Link to this checkLists pages blocked from indexing across the captured site.
- Link to revision
Its warn row is now emitted unscored, matching its weight 0. Before, the row counted as a scored warning, so site-health warning counts included an inventory the score never charged for. The list is still reported. Numeric score and grade unchanged (measured identical on trychad.ai, networthtrackr.com, arrosqd.com, babra.ai, skatecred.com); the warning count falls by one where noindex pages exist.
- Link to revision
Weight reduced from 2 to 0: it is an inventory of the same noindex pages crawl/indexability already assesses. The list is still reported. Capable of moving a score by a fraction of a point on a site with noindex pages; not observed on our reference sites.
Sitemap hygiene
Link to this checkSitemaps that repeat URLs, list nothing, or stamp every page with the build time make the file harder to trust. All of it is visible in the files already fetched.
Image Dimensions
Link to this checkReports images missing explicit width and height.
- Link to revision
Its warn row is now emitted unscored, matching its weight 0. Before, the row counted as a scored warning, so site-health warning counts included a note the score never charged for. The finding and its detail are still reported. Numeric score and grade unchanged (measured identical on trychad.ai, networthtrackr.com, arrosqd.com, babra.ai, skatecred.com); the warning count falls where images lack dimensions.
- Link to revision
Demoted from a scored warning (weight 4) to an unscored info observation. perf/cls-hints already scores the same missing-dimension images as layout-shift risk, so the same images were charged twice. The finding and its detail are still reported. Measured on stored captures of five reference sites: no score or grade moved; one outstanding warning fewer on two of them.
A2A Agent Card
Link to this checkAgents discover another agent's capabilities from its card at a fixed path; a published card missing required fields cannot be used. PRD goal G5.
Agent Readability
Link to this checkA page an agent cannot read is invisible to it. chad-audit does not run a browser (most AI crawlers run no JavaScript), so it reports every raw route it tried and, when none works, asks the calling agent. PRD goal G7, reframed without Chromium.
- Link to revision
Unavailable raw captures and challenged URLs now yield per-target caller judgement instead of being omitted from an aggregate pass. Sampled routes require complete, unchallenged evidence; rendered DOM never establishes agent access. Checking/recording instructions live in catalogue guidance. Unscored; capable of changing observations, not scores.
Agent Answerability
Link to this checkWhether an agent can answer real questions about a business from its site is the outcome AI visibility is for. Only a model can judge it; chad-audit makes that judgement repeatable (pinned questions), checkable (quotes verified against the crawl) and trackable (per-question movement). PRD goal G8.
API Catalog (RFC 9727)
Link to this checkAgents look for a site's APIs at /.well-known/api-catalog (RFC 9727). A published catalog has to be a real Linkset to be usable, and an advertised one has to resolve. PRD goal G5, first agent-capability surface.
Content Signals in robots.txt
Link to this checkSites increasingly state AI search, input and training preferences in robots.txt; a malformed value states nothing a crawler can read. PRD goal G5.
Markdown Alternate
Link to this checkReports whether a page advertises a markdown representation an agent can fetch. Weighted 1, the lowest in the catalog, because most AI crawlers read HTML only today — a page with good HTML and no markdown alternate is not deficient. It is checked because it costs no request. Deliberately does NOT report Vary: Accept as markdown support: a site can send that header and serve HTML to everything, so it is a claim about caching rather than a capability, and proving real negotiation would need a second conditional request per page.
- Link to revision
Vary now matches exact comma-separated Accept tokens; Accept-Encoding no longer produces misleading negotiation evidence. Verdicts and scoring unchanged.
- Link to revision
Clarified catalogue guidance: alternate-link absence does not establish absence of negotiated Markdown. Delivery evidence applies only to the sampled URL. Verdicts, weights and scores unchanged.
OAuth Protected Resource Metadata (RFC 9728)
Link to this checkMCP servers must publish RFC 9728 metadata, and agents use it to find where to authenticate; a document naming a different resource must not be used. PRD goal G5.
OAuth Authorization Server Metadata (RFC 8414)
Link to this checkAgents authenticating to a site's APIs (including MCP clients) discover its authorization server from this document; a published one that is malformed or names another issuer must not be used. PRD goal G5.
Analytics Tracking
Link to this checkChecks for Google Tag Manager or analytics implementation
- Link to revision
Analytics is now also recognised by tag attributes and bundled-provider markers, not only vendor hostnames: proxied/self-hosted Plausible (data-domain), Fathom (data-site), Umami (data-website-id), bundled PostHog (PostHogProvider), plus Vercel, Cloudflare, Simple Analytics, Pirsch, Mixpanel, Amplitude, Heap and Vibeloft. When nothing is found the message says no known script was seen, not that there is none. Measured on identical captures: inboxplease.com none→Plausible, networthtrackr.com none→PostHog, babra.ai none→PostHog (+Vibeloft); other reference sites unchanged; no score moved.
Unrecognised third-party hosts
Link to this checkTechnology detection is a hand-written fingerprint list, so a tool without an entry is invisible. This hands the hosts nothing recognised to a model as unscored leads, so it can say what they are and the fingerprint list can grow from the answers.
Redirect Chains
Link to this checkPages are reached without passing through multiple redirects
- Link to revision
A page revalidated with a 304 (unchanged since the last crawl) lost its redirect chain, so a repeat audit of a site that still redirects reported the redirect as resolved (inboxplease.com: apex still 301s to www). The fetcher now builds the chain the same way on both paths. Capable of moving a score on repeat audits of redirecting sites; first audits are unaffected.
Redirect Chains
Link to this checkDetects URLs that redirect and links pointing to redirects
- Link to revision
Same fetcher fix as crawl/redirect-chain: a 304-revalidated page now keeps its redirect chain, so a repeat audit no longer reports a live redirect as resolved.
Sampled resource delivery
Link to this checkCaptures status, decoded bytes, compression and caching headers for up to three same-origin stylesheet/script resources from sampled pages. Does not infer transfer bytes or whole-site resource weight. Captured experiments are unscored and independently request-bounded.
- Link to revision
Visibility probes now retain missing/refused robots policy as unavailable rather than permission. Independent agent fallback shares the existing request budget, so remaining resource requests can be explicitly budget-limited. Resource verdict logic and scoring unchanged.
- Link to revision
Probe body limit raised from 64 KiB to 2 MiB, so the sampled page is read and its resources observed. Measured: not_checked to pass on all five reference sites. Unscored, so no score moved.
- Link to revision
Treat explicit identity-only Content-Encoding lists as uncoded while retaining unknown declared codings as coded; partial captures preserve known header facts without establishing complete delivery. Unscored behavior, capable of changing observations; not measured on live reference resource responses.
Schema Deprecated for Google Rich Results
Link to this checkNotes when a page uses a schema type (HowTo, FAQPage) that no longer earns Google rich results, so the loss of that specific placement is visible rather than silently absorbed into 'schema present, no findings'. Informational only, at low weight: the markup still helps non-Google AI engines parse the content, so this is a record of a platform change, not an instruction to remove anything.
- Link to revision
Each finding now carries its schema type as its item locator. A page with two retired types (inboxplease.com: FAQPage and HowTo) had no stable finding identity, so every repeat audit listed both as new and not rechecked. Verdicts and score are unchanged; finding keys for this rule change once.
Entity Identity
Link to this checkMakes the captured names and identifiers of eligible Organization declarations available for review. A shared stable @id establishes the declared identity; distinct IDs and explicit aliases may describe legitimate organizations or names. Name differences alone do not establish a contradiction or lost authority.
- Link to revision
Anonymous declarations now expose bounded captured names and source paths for publisher identity review. Checks remain unscored; score and grade unchanged.
- Link to revision
Extends the unscored captured-declaration review to URL, logo, sameAs, telephone, email, inline postal address and type properties under exact stable entity IDs. Values declared together remain alternatives; phone formatting, email-domain case and compatible partial address components normalize without merging unrelated identities. Different singleton declarations carry source pages and stable per-property keys for review rather than asserting a contradiction or visibility loss. Unsupported references, uncertain membership and extraction/report limits cannot produce clean consistency verdicts. No points, grade caps or default v7 weights change.
- Link to revision
Retires the unverified scored premise that different Organization names necessarily split authority. Captured declarations are now grouped only by resolved stable @id, with explicit name/alternateName links and source URLs; legitimate distinct identities are preserved. Name differences and missing identifiers remain checked, unscored review observations, while unsupported contexts and bounded traversal are explicit. Reach now counts distinct observed declaring pages rather than Organization nodes. Measured on identical historical inputs from 35 public projects (2,883 stored pages, 2,852 available): with other current-native findings held fixed, trychad.ai moves 81/C to 97/B and arrosqd.com 78/C to 93/B; networthtrackr.com stays 92/B, babra.ai 79/C and skatecred.com 85/B. A broader historical sensitivity case moves quotes.toscrape.com 71/C to 70/C because excluding an old scored pass changes the existing scorer denominator, with no new scored failure. These are engine corrections, not evidence of website changes; missing inputs and unknown historic rubrics remain qualified.
Access Keys
Link to this checkReports an accessibility defect detected by axe-core: Access Keys.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Allowed Attributes
Link to this checkReports an accessibility defect detected by axe-core: ARIA Allowed Attributes.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Command Name
Link to this checkReports an accessibility defect detected by axe-core: ARIA Command Name.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Deprecated ARIA Roles
Link to this checkReports an accessibility defect detected by axe-core: Deprecated ARIA Roles.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Dialog Name
Link to this checkReports an accessibility defect detected by axe-core: ARIA Dialog Name.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Input Field Name
Link to this checkReports an accessibility defect detected by axe-core: ARIA Input Field Name.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Meter Name
Link to this checkReports an accessibility defect detected by axe-core: ARIA Meter Name.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Progressbar Name
Link to this checkReports an accessibility defect detected by axe-core: ARIA Progressbar Name.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Required Attributes
Link to this checkReports an accessibility defect detected by axe-core: ARIA Required Attributes.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Required Children
Link to this checkReports an accessibility defect detected by axe-core: ARIA Required Children.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Required Parent
Link to this checkReports an accessibility defect detected by axe-core: ARIA Required Parent.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Valid Roles
Link to this checkReports an accessibility defect detected by axe-core: ARIA Valid Roles.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Text
Link to this checkReports an accessibility defect detected by axe-core: ARIA Text.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Toggle Field Name
Link to this checkReports an accessibility defect detected by axe-core: ARIA Toggle Field Name.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Tooltip Name
Link to this checkReports an accessibility defect detected by axe-core: ARIA Tooltip Name.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Treeitem Name
Link to this checkReports an accessibility defect detected by axe-core: ARIA Treeitem Name.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Valid Attributes
Link to this checkReports an accessibility defect detected by axe-core: ARIA Valid Attributes.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
ARIA Valid Attribute Values
Link to this checkReports an accessibility defect detected by axe-core: ARIA Valid Attribute Values.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Color Contrast
Link to this checkReports an accessibility defect detected by axe-core: Color Contrast.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. This rule cannot be decided here (it needs layout, or axe does not run it by default), so it stays not checked. Measured on the five reference sites (106 pages): not checked on every page.
Definition List Structure
Link to this checkReports an accessibility defect detected by axe-core: Definition List Structure.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Definition List Item
Link to this checkReports an accessibility defect detected by axe-core: Definition List Item.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Duplicate ID Active
Link to this checkReports an accessibility defect detected by axe-core: Duplicate ID Active.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. This rule cannot be decided here (it needs layout, or axe does not run it by default), so it stays not checked. Measured on the five reference sites (106 pages): not checked on every page.
Duplicate ID ARIA
Link to this checkReports an accessibility defect detected by axe-core: Duplicate ID ARIA.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Empty Headings
Link to this checkReports an accessibility defect detected by axe-core: Empty Headings.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Multiple Labels
Link to this checkReports an accessibility defect detected by axe-core: Multiple Labels.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Frame Title
Link to this checkReports an accessibility defect detected by axe-core: Frame Title.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Heading Order
Link to this checkReports an accessibility defect detected by axe-core: Heading Order.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): failed on 40 pages.
HTML Lang Valid
Link to this checkReports an accessibility defect detected by axe-core: HTML Lang Valid.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
HTML XML Lang Mismatch
Link to this checkReports an accessibility defect detected by axe-core: HTML XML Lang Mismatch.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Identical Links Same Purpose
Link to this checkReports an accessibility defect detected by axe-core: Identical Links Same Purpose.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. This rule cannot be decided here (it needs layout, or axe does not run it by default), so it stays not checked. Measured on the five reference sites (106 pages): not checked on every page.
Redundant Image Alt
Link to this checkReports an accessibility defect detected by axe-core: Redundant Image Alt.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Input Image Alt
Link to this checkReports an accessibility defect detected by axe-core: Input Image Alt.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Label Content Name Mismatch
Link to this checkReports an accessibility defect detected by axe-core: Label Content Name Mismatch.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. This rule cannot be decided here (it needs layout, or axe does not run it by default), so it stays not checked. Measured on the five reference sites (106 pages): not checked on every page.
One Main Landmark
Link to this checkReports an accessibility defect detected by axe-core: One Main Landmark.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. This rule cannot be decided here (it needs layout, or axe does not run it by default), so it stays not checked. Measured on the five reference sites (106 pages): not checked on every page.
Link in Text Block
Link to this checkReports an accessibility defect detected by axe-core: Link in Text Block.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
List Item Context
Link to this checkReports an accessibility defect detected by axe-core: List Item Context.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Meta Refresh
Link to this checkReports an accessibility defect detected by axe-core: Meta Refresh.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Object Alt Text
Link to this checkReports an accessibility defect detected by axe-core: Object Alt Text.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Select Name
Link to this checkReports an accessibility defect detected by axe-core: Select Name.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Skip Link
Link to this checkReports an accessibility defect detected by axe-core: Skip Link.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Tabindex Values
Link to this checkReports an accessibility defect detected by axe-core: Tabindex Values.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Table Duplicate Name
Link to this checkReports an accessibility defect detected by axe-core: Table Duplicate Name.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Table Cell Headers
Link to this checkReports an accessibility defect detected by axe-core: Table Cell Headers.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
TH Has Data Cells
Link to this checkReports an accessibility defect detected by axe-core: TH Has Data Cells.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Valid Lang Attributes
Link to this checkReports an accessibility defect detected by axe-core: Valid Lang Attributes.
- Link to revision
Out of scope, no longer scored or reported: chad-audit covers technical SEO and agent/LLM visibility, so accessibility findings no longer count toward the score or grade. The check still runs; remove the exclusion to bring it back. Measured on a stored 25-page trychad.ai crawl: score and grade unchanged (98, B). Capable of moving a score by about a point on a site with accessibility failures.
- Link to revision
Began producing results. Until this date the rule returned nothing on any crawl, because axe-core could not run against our DOM, so a missing accessibility finding and a passing page looked identical. It now runs on a jsdom DOM; a page with nothing for it to assess is reported as not applicable, and where it needs layout we do not have it is reported as not checked, never as a pass. Measured on the five reference sites (106 pages): no failures.
Duplicate Title
Link to this checkReports page titles shared across the captured pages.
- Link to revision
Now the single owner of duplicate-title findings; core/title-unique, which duplicated it, is retired. Behaviour of this rule is unchanged.
core/title-unique
Link to this checkReported page titles shared across the site.
- Link to revision
Retired. It performed the same exact-trim duplicate-title comparison as content/duplicate-title, so one fault produced two findings of different weight. content/duplicate-title is kept. Measured on stored captures of five reference sites: no score or grade moved; one outstanding warning fewer on three of them. Capable of moving a score by about a point on a site with duplicate titles, because the duplicate finding no longer counts twice.
Disclaimers
Link to this checkChecks for appropriate disclaimers on sensitive content
- Link to revision
Uses the same YMYL detection as eeat/ymyl-detection (one shared detector; it had its own looser single-keyword list). Measured: warn to pass on trychad.ai, arrosqd.com and skatecred.com.
Privacy Policy
Link to this checkChecks for privacy policy page linked from footer
- Link to revision
A privacy link whose destination was not captured is now not_checked (insufficient input) instead of a warning: an uncrawled page is missing evidence, not a missing policy. Measured: trychad.ai warn to not_checked; its /privacy/ returns 200.
YMYL Detection
Link to this checkDetects Your Money Your Life (YMYL) content
- Link to revision
A YMYL category now needs density: a page counts with 3+ distinct terms of that category, and the site only when a quarter of captured pages (min 2) do. One word on one page ('site health', 'brand safety') had classed marketing, restaurant and skate sites as medical or legal. Measured: warn to pass on trychad.ai, arrosqd.com, babra.ai and skatecred.com.
links/broken-external-links
Link to this checkReported external links that returned an error.
- Link to revision
Retired. It filtered the same external-link list with the same isBrokenLink test as links/broken-links, at lower severity, so a broken link was reported twice. links/broken-links is kept. Measured on stored captures of five reference sites: no score or grade moved. Capable of moving a score by about a point on a site with broken external links.
Broken Links
Link to this checkReports external links that returned an error.
- Link to revision
Now the single owner of broken external link findings; links/broken-external-links, which duplicated it, is retired. Behaviour of this rule is unchanged.
Orphan Pages
Link to this checkFinds pages that are indexable but have no internal links pointing at them. Nothing else in the audit could see these: they crawl fine and pass every page-level check, while receiving no internal authority and giving crawlers no path to reach them.
- Link to revision
When the crawl captured fewer pages than the sitemap lists, the finding is unscored and says so: only captured pages are link sources, so a sample cannot establish an orphan. The message now names the pages. Measured on identical captures, with the other 2026-10-06 accuracy fixes: unscored on trychad.ai (97 to 98), arrosqd.com (86 to 87) and skatecred.com (61, unchanged) quick crawls.
Canonical Clustering
Link to this checkDetects groups of pages that canonicalise to a single other URL. Below five pages this is usually a deliberate duplicate; above it, it is almost always a canonical set on a shared layout and inherited by every page beneath it — which instructs search engines to drop all of them. This is loss of indexation rather than a quality defect, so it is the first check that can escalate a finding to critical.
- Link to revision
Canonical clusters now count distinct captured final documents and declare the number of observed canonical-bearing, non-noindex documents assessed. Conflicting alias evidence remains explicitly not checked. Redirect aliases cannot inflate affected counts; v8 uses this assessed total instead of unrelated crawl pages. This can change severity when duplicate aliases previously crossed a cluster threshold and change score reach; fixed reference replay has no critical cluster change.
- Link to revision
It no longer asks the customer whether the pages are duplicates — it compares them against the canonical target and says which it is. A cluster below five pages that IS a genuine duplicate set now passes instead of warning, so a site whose canonical tags were always correct may score slightly higher than before with nothing changed on it.
- Link to revision
The canonical it reads now recognises rel="alternate canonical" (rel is a token list, not a fixed string) as well as a plain rel="canonical" — a site using that combined form, previously invisible to this check, may now be clustered for the first time.
Canonical Form Review
Link to this checkAdds a bounded captured-source review with stable items and explicit matching passes. It is unscored while applicability and independent false-positive review remain outstanding; no default score or ranking consequence changes.
Observed Internal Link Sources
Link to this checkAdds a bounded captured-source review with stable items and explicit matching passes. It is unscored while applicability and independent false-positive review remain outstanding; no default score or ranking consequence changes.
- Link to revision
Exclude the single-source additional-link review when every observed incoming link explicitly declares prev/next pagination. Counts remain captured-only; mixed ordinary links still receive review, and not-applicable outcomes cannot verify a repair. Measured on the same 180 reference inputs: the two Babra pagination warnings become not applicable, with no score or grade change.
Captured Entity References
Link to this checkObserves @id reference objects with no declaration among supported JSON-LD nodes in this captured document; excludes sameAs and does not check network destinations or uncaptured pages. This is captured, bounded, unscored evidence for review and carries no ranking or AI citation outcome claim.
- Link to revision
A reference that remains present and gains a declaration in a complete supported captured document now emits a matching unscored pass under the same target identifier. A fresh compatible capture can verify that specific observation. Removing the reference or returning partial input does not invent a matching pass; rating-association judgement has no automatic resolved verdict. The check remains zero weight and has no score or grade effect.
LocalBusiness Schema
Link to this checkA declared local business can describe its physical location using structured data. Name and address are Google local-business eligibility fields; a city mention or a generic software company does not by itself establish that local-business markup applies.
- Link to revision
Absent LocalBusiness no longer penalizes generic SaaS sites or promises that publishing an address causes AI discovery. Named places are unscored captured candidates whose business association needs review. Existing declared name/address checks remain. Capable of increasing scores. Measured individually on the same captured inputs from five reference sites: rounded scores unchanged. The combined schema applicability corrections move skatecred 85 to 86; the other four rounded scores are unchanged.
Organization Schema
Link to this checkOrganization declarations provide explicit information about an organization on pages where that entity is described. Relevant properties are recommendations; a page-local omission cannot establish that the website has no publisher.
- Link to revision
Page-local omission no longer claims the whole site has no machine-readable publisher or that an AI assistant cannot attribute an answer. Missing declarations are not applicable; optional name and url suggestions are unscored. Google specifies no required Organization properties. Capable of increasing scores. Measured individually on the same captured inputs from five reference sites: rounded scores unchanged. The combined schema applicability corrections move skatecred 85 to 86; the other four rounded scores are unchanged.
Captured Rating Association
Link to this checkCarries bounded AggregateRating carrier associations, rating-like text and widget candidates for review; rendered presence, item correspondence and eligibility remain unverified. This is captured, bounded, unscored evidence for review and carries no ranking or AI citation outcome claim.
- Link to revision
An isolated decorative star no longer establishes a rating-like text hint; consecutive star glyphs and numeric rating/review phrases remain bounded candidates whose correspondence is unverified. Measured on the same captured reference inputs: two rating-text hints on the ArrosQD Fuego Bar page are removed, with no score change. Independent model review confirms repeated business ratings do not rate each page or prove rendered visibility.
Review Schema
Link to this checkReview and AggregateRating declarations need shape fields to describe their author, rating and count where those declarations are actually published. Their omission from an unrelated page is not a defect.
- Link to revision
Review markup is assessed when declared, including nested Review/AggregateRating shape fields. Absence is not applicable rather than a warning on every page. Unsupported contexts, forms and bounded partial inputs are not checked, not assumed absent. Capable of moving scores in either direction. Measured individually on the same captured inputs from five reference sites: rounded scores unchanged. The combined schema applicability corrections move skatecred 85 to 86; the other four rounded scores are unchanged.
Possible Encoding Artifacts
Link to this checkReports replacement characters and characteristic encoding sequences in captured prose as probable artifacts for review, without diagnosing original byte encoding. The check uses existing captured inputs and performs no additional requests.
Captured Template Artifacts
Link to this checkReports unresolved template expressions, stringified objects and escaped HTML patterns in captured document prose as unscored review observations. The check uses existing captured inputs and performs no additional requests.
Possible Soft 404 in Captured Response
Link to this checkReports a captured success response containing corroborating document-owned error signals. It is an unscored single-capture observation, not a confirmed Google soft-404 classification. The check uses existing captured inputs and performs no additional requests.
Review Captured Contextual Incoming Links
Link to this checkAdds bounded, unscored captured-source evidence for pages linked only from observed navigation/global header/footer markup. Missing source inputs prevent absence conclusions, and whole-site coverage is unknown. No new requests or ranking-loss premise.
LCP Optimization Hints
Link to this checkIdentifies captured image loading hints that merit review for largest contentful paint performance; static markup does not establish measured LCP.
- Link to revision
Associates priority and preload with an eligible captured content-image candidate instead of crediting unrelated document hints. Removes dimension and generic first-image lazy branches already assessed by other checks. Unknown responsive selection and input bounds stay not checked. Static markup does not establish measured LCP; behavior can move scores and is compared on fixed captures.
Review Captured Detail-Page Schema Coverage
Link to this checkCaptured comparable detail pages can reveal inconsistent schema or recurring sections worth reviewing. Observations require at least three captured detail pages and two positively marked peers, exclude generic SaaS absence assumptions, retain incomplete inputs as unknown, and carry no score penalty or search/citation outcome claim.
AI Search Crawler Directives
Link to this checkReports declared robots restrictions for documented AI search indexers, while preserving training and other crawler policies as separate evidence. Independent controls should be assessed by their documented purpose rather than treated as a universal citation block.
- Link to revision
Findings can now declare a shared report action with the indexability-conflict finding when one captured wildcard Disallow line uniquely controls all affected URLs. Named-agent controls, Allow exceptions, different winning lines and cross-origin targets are excluded. Individual verdicts and scoring are unchanged. Measured on 33 stored public projects: no changed check outputs or two-rule subset scores; no qualifying shared groups observed.
- Link to revision
Separates vendor-documented search indexers from training, archive, user-request and product controls. Training opt-outs and other controls are now unscored evidence; a scored warning requires a declared restriction for a relevant search indexer on assessed URLs. Repeated groups, wildcard fallback, path specificity and Allow exceptions are considered. An unavailable robots response is not a pass, and a policy declaration does not claim an HTTP refusal or universal loss of citation. This can change findings and scores without a site change. Measured on the five reference sites: the search-policy verdict was pass before and after on all five, and 50 unscored crawler-policy observations were added.
llms.txt
Link to this checkReports whether the site publishes the /llms.txt file the AI tooling ecosystem increasingly expects, and whether it follows the spec's shape rather than being prose at the right path. Added as info rather than a warning on purpose: the spec and its adoption are real, but no vendor has published documentation confirming their crawler consumes anyone else's llms.txt — OpenAI publishes one for its own docs, which evidences producing the format, not reading yours. Until a primary source for consumption exists this can honestly say 'you do not have the file the ecosystem expects', never 'you are losing citations'. Required a new capability: the crawler previously fetched no well-known path beyond robots.txt and sitemap.xml, so llms.txt was fetched during a crawl and then discarded as non-HTML.
- Link to revision
The optional file probe now runs only when an enabled rule needs it and within an explicit HTTP-attempt budget, including redirects. Skipped, failed, oversized or incomplete responses are not checked instead of being treated as file absence. Complete retained bodies are bounded to 64 KiB of streamed bytes. Offline request fixtures retain verdict parity when the probe runs; reduced budgets deliberately qualify the report.
Not Found Handling
Link to this checkFetches a deliberately nonexistent path and checks what the site does with a miss. A soft 404 — 200 for a path that does not exist — tells crawlers every URL on the domain is real, which is how an index fills with pages that were never published and how an agent ends up citing one; that case is reported as an error. A correct 404 with an empty body is the smaller problem and warns: the agent knows the path is wrong but has nothing to try instead, so it abandons the domain rather than recovering to a working URL. Needed the new well-known probe because a 404 can never reach a rule through the page set — the crawl loop only analyses 2xx responses.
- Link to revision
The optional nonexistent-path probe now runs only when an enabled rule needs it and within an explicit HTTP-attempt budget, including redirects. Skipped, failed, oversized or incomplete responses are not checked instead of producing a body-content verdict. Complete retained bodies are bounded to 64 KiB of streamed bytes. Offline request fixtures retain verdict parity when the probe runs; a one-request budget leaves this second probe not checked.
Indexability Conflicts
Link to this checkCross-references robots.txt Disallow rules against per-page noindex signals: a page robots.txt blocks from crawling but which ALSO carries noindex is a conflict a crawler can never even see, since it is never allowed to reach the page to read the noindex tag.
- Link to revision
Findings can now declare a shared report action with the search-policy finding when the same captured wildcard Disallow line uniquely controls every affected URL. Source URL, policy hash and exact control must agree; individual verdicts and score penalties are unchanged. Measured on 33 stored public projects: no changed check outputs or two-rule subset scores, and no qualifying shared groups observed. Synthetic regressions cover qualifying and refused groups.
- Link to revision
The noindex signal it reads is now the COMBINED value of every meta robots tag (see core/robots-meta), not just the first — a noindex directive in a second tag was previously invisible here. One-directional: this can only surface a conflict that existed but was missed, never retire one, since combining tags never removes a directive. Not measured on our reference sites — the one known multi-tag page (skatecred.com) is not blocked by robots.txt, so this rule's verdict there is unchanged — but the mechanism is real.
AI Crawler Shell
Link to this checkReports the observable risk of raw response HTML that has an empty framework container or little visible text alongside scripts. Useful content before JavaScript helps crawlers that cannot render; structured data and visible prose are assessed separately.
- Link to revision
Uses a separately captured raw response rather than treating the selected browser DOM as raw HTML. Missing legacy provenance, unavailable bytes, refused requests and challenges now produce not_checked instead of a raw-HTML pass. Normal content parsing continues to use the selected HTML. Findings state the measured shell heuristic without claiming universal assistant behavior. This can change findings and scores without a site change. Measured on identical captured inputs from the five reference sites (106 pages): 19 shell failures before and after, and no scored page finding changed; one noindex page now records an explicit not_applicable instead of emitting nothing.
- Link to revision
Structured data is now part of the verdict. A shell page whose JSON-LD still reaches the crawler is reported as identifiable-but-unquotable at warning severity rather than as an error, because the earlier wording — that the engine retrieves no content — was untrue of such a page and a customer viewing source could see it was untrue. Sites with server-rendered schema on thin pages may score slightly higher than before with nothing changed on them.
- Link to revision
A page that is genuinely noindex (per the core/robots-meta fix on the same date) is now DETERMINISTICALLY excluded from this check rather than sometimes evaluated — a noindex page's shell-ness is moot, since it was never going to be indexed regardless. Measured on skatecred.com: the one page with contradicting robots tags is now excluded from this check on every crawl instead of appearing in it on crawls where the permissive tag happened to be read first.
Site-wide AI Readability
Link to this checkAggregates the raw-response shell heuristic across the captured page set and reports its measured reach. Its conclusion depends on raw response evidence being available, with structured data distinguished from visible prose.
- Link to revision
Aggregates verified raw response observations and reports not_checked if any relevant captured page lacks assessable raw evidence. Browser-rendered content no longer establishes a clean raw-HTML aggregate. Pages excluded by observed raw noindex or non-HTML applicability are explicit. This can change findings and scores without a site change. Measured on identical captured inputs from the five reference sites: no site verdict changed (trychad.ai and networthtrackr.com pass, arrosqd.com and babra.ai warn, skatecred.com fail, before and after).
- Link to revision
One page without an assessable raw response (for example a WAF-challenged page) no longer voids the whole site result. The verdict now covers the pages that could be assessed and says how many, and the remainder is reported separately as not checked, so it is never read as a pass. This can change findings and scores without a site change; capable of moving, not observed on our reference sites, none of which had an unassessable page.
- Link to revision
The summary now separates pages sending nothing at all from pages whose structured data survives, rather than describing both as returning no content.
- Link to revision
The citable page set it measures now excludes a page the moment ANY of its robots tags says noindex (see core/robots-meta's combined-tag fix), not just the first — the citable set can only ever SHRINK from this, never grow, because combining tags only adds restrictions. Whether the reported share moves up or down depends on which kind of page that shrinks: excluding a page that was itself unreadable-without-JS lowers the share (fewer bad pages counted), excluding a readable page raises it (same bad pages, smaller base) — and because this check escalates to critical at 50% coverage, that share crossing the threshold in either direction is possible, most visible on a small site where one page is a large fraction of the total. Not measured on our reference sites — none of them has a multiply-tagged page whose exclusion moves this number — but the mechanism is real, capable, and will fire the first site that has one.
Content Freshness
Link to this checkIdentifies date signals that can tell readers when content was published or updated.
- Link to revision
Now reads datePublished and dateModified inside JSON-LD @graph. Previously a Yoast-style Article date was missed. Capable of turning a date warning into a pass; reproduced in a focused fixture, with no changed findings on five stored reference crawls.
Content Dates
Link to this checkMeasures the share of article-style pages with content date signals.
- Link to revision
Now reads datePublished and dateModified inside JSON-LD @graph. Previously a Yoast-style Article date was missed. Capable of increasing the dated-article share and turning a site warning into a pass; reproduced in a focused fixture, with no changed findings on five stored reference crawls.
Content Landmark
Link to this checkChecks whether an extractor can find the page's content at all, which is a different question from whether the words are in the HTML. Added after a research agent asked about a customer site, could not extract its product pages, and answered from third-party review sites instead — reporting that the site's own pricing could not be verified. Nothing was down and nothing was blocked: 50 of 90 pages simply had no <main> or <article>, so the extractor returned the wrong block. On the pricing page it pulled 463 characters of FAQ copy and a call to action, none of it pricing; adding <main> took the same page to 1,928 characters containing every figure. ai-visibility/crawler-shell already asked whether the words were present in the raw HTML — they were — but nothing asked whether they were findable.
Schema Content Mismatch
Link to this checkChecks that the answers a page declares in FAQPage markup are actually in the page. Added after a site was found serving nine FAQ questions with no answers under any of them: the answers were rendered only after a click, so they never reached the served HTML, while the JSON-LD carried all nine in full. A crawler parsing structured data got the answers and a person reading the page did not. Every other check passed — the markup was present, the questions were words, and the page was not an empty shell — because nothing compared what the schema asserted against what the page contained. Google's structured data guidelines state that content marked up must be described by the HTML body; note the scope is correspondence rather than CSS, so an answer that is in the page but collapsed behind an expandable section passes, which is what the retired FAQPage documentation called a valid use case.
Canonical URL
Link to this checkChecks that a page declares a canonical URL at all — its absence leaves search engines to guess which URL is authoritative for the content.
- Link to revision
The canonical link it reads now recognises rel="alternate canonical" (rel is a whitespace-separated token list, not a fixed string) as well as whitespace-padded rel="canonical" values — see crawl/canonical-cluster. One-directional and only ever de-escalating: this can only discover a canonical where none was visible before, moving a page from warning to pass, never the reverse. Not measured on our reference sites.
Canonical Header Validation
Link to this checkCompares the canonical declared in the HTTP Link header against the one in the page's own HTML — the two are meant to agree, and a mismatch leaves search engines to pick one arbitrarily.
- Link to revision
The HTML side of this comparison now recognises rel="alternate canonical" and whitespace-padded rel (see crawl/canonical-cluster), not only an exact rel="canonical" tag. This can move the verdict either way: a page that previously warned because the Link header set a canonical but no HTML canonical was found may now discover one and either match it (pass) or still mismatch it (warning, for a different reason); and on a page carrying both an exact rel="canonical" tag and an alternate-canonical tag in a different document order, the newly-recognised tag can become the one this check reads, changing which value it compares against the header. Not measured on our reference sites.
Multiple Canonical Tags
Link to this checkFlags a page declaring more than one rel=canonical tag, and distinguishes whether they agree. Tags that all name the same URL are a warning — duplicate declarations to tidy up, not a lost signal, and the most common way this happens is a CMS and a theme both emitting a correct canonical. Tags that name DIFFERENT URLs escalate to error: search engines discard the signal entirely when they disagree rather than guessing which is correct, the same consequence as declaring none at all. Compared via the same host+path equivalence used elsewhere (a www/apex or trailing-slash variant counts as agreement), so a page carrying both rel="canonical" and rel="alternate canonical" for its own URL warns rather than errors.
Nosnippet Directive
Link to this checkFlags a page whose meta robots or X-Robots-Tag header carries a nosnippet directive (or max-snippet:0), which tells search engines not to show a text snippet for it.
- Link to revision
It now reads the COMBINED value of every <meta name=robots> tag on the page (see core/robots-meta), not just the first — a nosnippet directive in a second or later tag was previously invisible to this check. One-directional: combining tags only ever adds directives, so this can only newly flag a page that passed before, never clear one that was already flagged. Not measured on our reference sites — the one page known to carry multiple robots tags (skatecred.com) does not use nosnippet in either — but the mechanism is real.
Robots Meta
Link to this checkReports whether a page is noindex via meta robots.
- Link to revision
It now reads EVERY <meta name=robots> tag on the page, combined, instead of only the first one cheerio's selector happened to return. Multiple robots tags are legal HTML and Google combines them under most-restrictive-wins semantics, so a page serving both an indexable and a noindex tag IS noindex regardless of which one appeared first in the markup. Measured impact: skatecred.com/athlete/esther-prasanna-athlete moved from 'Page is indexable' (pass) to 'Page is noindex' (warn) — the page genuinely serves both tags, in non-deterministic order, so this check previously reported pass or warn on that URL unpredictably between crawls of the same commit.
Contradicting Robots Meta Tags
Link to this checkFlags multiple <meta name=robots> tags whose directives contradict each other (index vs noindex, follow vs nofollow) — never multiple tags on their own; two complementary tags (noarchive + max-snippet:50) stay silent. Multiple robots tags are legal HTML and Google combines them under most-restrictive-wins semantics, so a page asserting both is genuinely noindex regardless of which tag looks like the 'real' one. Added after a live site (skatecred.com) was found serving both tags in non-deterministic order — the crawler previously read only the first, so the same page scored 46 on one crawl and 44 on the next depending on which tag it happened to see.
Canonical Chain
Link to this checkChecks that a page's own canonical is self-referencing and reached directly — a canonical pointing elsewhere, or arrived at through a redirect, tells search engines this page is not the authoritative version of itself.
- Link to revision
It now reads a canonical declared via rel="alternate canonical" or whitespace-padded rel (see crawl/canonical-cluster), not only an exact rel="canonical" tag. One-directional and only ever escalating: a page that previously read as 'no canonical declared (nothing to chain)' — the most lenient outcome this check gives — can now discover a canonical that points elsewhere or arrived via redirect, becoming a new warning; it cannot move the other way. Not measured on our reference sites.
Indexability Check
Link to this checkIdentifies pages blocked from indexing via meta robots or the X-Robots-Tag header.
- Link to revision
For the same reason as core/robots-meta: it reads the combined value of every robots meta tag, not just the first. Measured impact: the same skatecred.com page moved from 'Page is indexable' (pass) to 'Page is blocked from indexing via meta robots' (warn), and — unlike before — now reports that consistently across repeat crawls rather than depending on tag order.
Pagination
Link to this checkChecks that a page with pagination signals (rel=next/prev links, or a /page/N-shaped URL) either self-canonicalizes or is missing a canonical entirely, since a paginated page canonicalizing to page 1 tells search engines to drop it from the index.
- Link to revision
It now recognises a canonical declared via rel="alternate canonical" or whitespace-padded rel (see crawl/canonical-cluster), not only an exact rel="canonical" tag. Unlike crawl/canonical-chain, 'no canonical tag' is already an issue here — paginated pages are expected to self-canonicalize — so newly discovering one can only REMOVE that specific issue: resolving to pass if the discovered canonical is self-referencing, or replacing it with a different issue (canonical points away) if it is not. Not measured on our reference sites.
Robots Meta Conflict
Link to this checkCompares the meta robots tag against the X-Robots-Tag HTTP header for the same directive, and flags a page whose two channels disagree — index vs noindex, or follow vs nofollow — since a crawler reading only one of them gets a different answer than a crawler reading the other.
- Link to revision
The meta-robots side of this comparison is now the COMBINED value of every meta robots tag (see core/robots-meta), not just the first. Unlike the other robots-parsing fixes, this one is bidirectional: because it compares against a second, independent source (the header), a combined meta value can either surface a genuine conflict a partial read previously missed, or RETIRE a conflict that was itself an artifact of reading only the first tag — the header may have already agreed with the second tag, just not the one the old parser happened to see. Not measured on our reference sites — the one known multi-tag page (skatecred.com) has no X-Robots-Tag header to compare against, so this rule's verdict there is unaffected — but the mechanism can move a verdict either way on a site where a header is present.
Duplicate Entity Definitions
Link to this checkFinds JSON-LD nodes on one page that share an @id but conflict, are pointlessly redundant, or leave a singleton entity (Organization, WebSite, SoftwareApplication) unkeyed. Consumers of structured data merge nodes on @id, so two definitions under the same @id with different values for the same field hand them a contradiction rather than one clean fact.
FAQ Schema
Link to this checkReports a page whose question-and-answer content is not marked up as FAQPage, so an answer engine has to infer the pairs from prose rather than read them.
- Link to revision
Two changes. It now only applies to pages that actually carry a Q&A section, matching how the video, product and article checks were already gated — it had been reporting 'No FAQPage JSON-LD found' on 84 of 96 pages across our reference sites, which is not advice. And its stated reason changed: Google stopped showing FAQ rich results on 7 May 2026, so the rule is no longer about earning that feature. It is kept because FAQPage remains the clearest machine-readable form of a question and its answer, which is the unit an AI assistant extracts when citing a source. Pages with no Q&A content move from warn to pass, so most sites will see this warning disappear from most pages.
JSON-LD Valid
Link to this checkReports a page carrying no structured data at all.
- Link to revision
From a warning to a FAILURE: a page with none is machine-unreadable, not merely improvable, and it was ranked below a title-length check while an AI assistant had nothing to read. Absent fails; present-but-thin stays a warning. Sites with pages lacking schema will score lower than on their previous audit with nothing changed on them — measured, one site moved 94 to 87 with 9 of 16 pages affected.
WebSite Search Schema
Link to this checkReports whether a site declares itself with WebSite structured data. The rule originally existed for the sitelinks searchbox, which Google has since retired; what remains useful is the WebSite node itself, because that is how a site states its name in a form an engine can read.
- Link to revision
It no longer warns when a WebSite node has no SearchAction. Google removed the sitelinks searchbox globally starting 21 November 2024, so that warning was asking customers to add markup for a feature that no longer exists — our own catalog carrying exactly the staleness schema/deprecated-for-google reports on other people's. Google also states that removing searchbox markup is not required, so a page that still carries a SearchAction is passed without comment rather than told to strip it. Measured across five reference sites: no score moved.
Trailing Slash
Link to this checkChecks that a page's URL and its canonical agree on whether the path ends in a trailing slash — search engines can treat the two forms as different URLs, splitting ranking signal between them.
- Link to revision
It now reads a canonical declared via rel="alternate canonical" or whitespace-padded rel (see crawl/canonical-cluster), not only an exact rel="canonical" tag. One-directional and only ever escalating: a page with no canonical previously just reported its own trailing-slash state, always a pass; newly discovering a canonical can introduce a genuine mismatch and a new warning, but never remove one, since 'no canonical' was already the most lenient outcome this check gives. Not measured on our reference sites.