---
title: "SEO audit changelog — How Chad's checks improve | Chad"
description: "Explore Chad's SEO, LLM readiness and agent discovery checks in separate tabs. See dated changes, why they happened, and the sources behind them."
canonical: https://trychad.ai/changelog/
---

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 2026-11-05

[Run a free audit →](https://trychad.ai/)[See our own site report →](https://trychad.ai/score/trychad.ai/)

Showing the saved catalogue.

Catalogue d6e379ab11aa · Snapshot assembled 2026-11-09

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.

Search rule history

136 rules · newest change first

Render-Blocking Resources2026-11-05[Link to this check](#rule-perf-2f-render-2d-blocking)

perf/render-blocking · Current category: perf · Current severity: warning

Counts the CSS and JavaScript that delay first render.

1. 2026-11-05[Link to revision](#rule-perf-2f-render-2d-blocking-2026-11-05-0)

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 response2026-10-31[Link to this check](#rule-ai-2d-visibility-2f-agent-2d-response)

ai-visibility/agent-response · Current category: ai-visibility · Current severity: info

Compares 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.

**External sources**[OpenAI crawler roles and independent search/training controls ↗](https://developers.openai.com/api/docs/bots)[Anthropic training, search and user-request bots ↗](https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler)

1. 2026-10-31[Link to revision](#rule-ai-2d-visibility-2f-agent-2d-response-2026-10-31-4)

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.

2. 2026-10-16[Link to revision](#rule-ai-2d-visibility-2f-agent-2d-response-2026-10-16-3)

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.

3. 2026-10-07[Link to revision](#rule-ai-2d-visibility-2f-agent-2d-response-2026-10-07-2)

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.

4. 2026-10-06[Link to revision](#rule-ai-2d-visibility-2f-agent-2d-response-2026-10-06-1)

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.

5. 2026-10-04[Link to revision](#rule-ai-2d-visibility-2f-agent-2d-response-2026-10-04-0)

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.

Check introduced 2026-10-04

Citation Information Gain2026-10-31[Link to this check](#rule-content-2f-information-2d-gain)

content/information-gain · Current category: content · Current severity: warning

Flags 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.

**Read more from Chad**[ChatGPT Cites Only 4.2% of Google's Top Results — Your SEO Strategy Is the Wrong Plan ↗](https://trychad.ai/blog/chatgpt-4-percent-serp-overlap-separate-strategy/)

1. 2026-10-31[Link to revision](#rule-content-2f-information-2d-gain-2026-10-31-0)

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.

Check introduced 2026-08-13

Latest captured article opening review2026-10-31[Link to this check](#rule-content-2f-latest-2d-article-2d-review)

content/latest-article-review · Current category: content · Current severity: info

Provides 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.

1. 2026-10-31[Link to revision](#rule-content-2f-latest-2d-article-2d-review-2026-10-31-0)

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.

Check introduced 2026-10-05

Semantic Completeness2026-10-31[Link to this check](#rule-content-2f-semantic-2d-completeness)

content/semantic-completeness · Current category: content · Current severity: warning

Scores 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.

1. 2026-10-31[Link to revision](#rule-content-2f-semantic-2d-completeness-2026-10-31-1)

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.

2. 2026-10-09[Link to revision](#rule-content-2f-semantic-2d-completeness-2026-10-09-0)

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.

Check introduced 2026-08-01

Article Schema2026-10-31[Link to this check](#rule-schema-2f-article)

schema/article · Current category: schema · Current severity: warning

Article 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.

**External sources**[Google Search Central: Article structured data ↗](https://developers.google.com/search/docs/appearance/structured-data/article)

1. 2026-10-31[Link to revision](#rule-schema-2f-article-2026-10-31-4)

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).

2. 2026-10-09[Link to revision](#rule-schema-2f-article-2026-10-09-3)

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.

3. 2026-10-02[Link to revision](#rule-schema-2f-article-2026-10-02-0)

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.

4. 2026-10-02[Link to revision](#rule-schema-2f-article-2026-10-02-1)

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.

5. 2026-10-02[Link to revision](#rule-schema-2f-article-2026-10-02-2)

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 Signals2026-10-31[Link to this check](#rule-schema-2f-article-2d-citability)

schema/article-citability · Current category: schema · Current severity: info

Checks 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.

**Read more from Chad**[AI Overviews Now Cover Half of US Searches. Only 17% Cite Top-10 Organic Pages. ↗](https://trychad.ai/blog/ai-overviews-17-percent-organic-citation-decoupling/)[Schema.org Just Published Its First Usage Dataset — Here's What It Reveals ↗](https://trychad.ai/blog/schema-org-usage-dataset-2026/)

1. 2026-10-31[Link to revision](#rule-schema-2f-article-2d-citability-2026-10-31-0)

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.

Check introduced 2026-08-02

Article Identity Consistency2026-10-31[Link to this check](#rule-schema-2f-article-2d-identity)

schema/article-identity · Current category: schema · Current severity: warning

Checks 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.

**External sources**[Schema.org: mainEntityOfPage ↗](https://schema.org/mainEntityOfPage)[Google Search Central: Article structured data ↗](https://developers.google.com/search/docs/appearance/structured-data/article)

1. 2026-10-31[Link to revision](#rule-schema-2f-article-2d-identity-2026-10-31-0)

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.

Check introduced 2026-08-13

About Page2026-10-30[Link to this check](#rule-eeat-2f-about-2d-page)

eeat/about-page · Current category: eeat · Current severity: warning

Checks for an about/company page with content

1. 2026-10-30[Link to revision](#rule-eeat-2f-about-2d-page-2026-10-30-0)

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 Page2026-10-30[Link to this check](#rule-eeat-2f-contact-2d-page)

eeat/contact-page · Current category: eeat · Current severity: warning

Checks for contact page with multiple contact methods

1. 2026-10-30[Link to revision](#rule-eeat-2f-contact-2d-page-2026-10-30-0)

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 Consistency2026-10-30[Link to this check](#rule-local-2f-nap-2d-consistency)

local/nap-consistency · Current category: local · Current severity: warning

Checks for consistent Name, Address, Phone across site

1. 2026-10-30[Link to revision](#rule-local-2f-nap-2d-consistency-2026-10-30-0)

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 Scroll2026-10-30[Link to this check](#rule-mobile-2f-horizontal-2d-scroll)

mobile/horizontal-scroll · Current category: mobile · Current severity: warning

Checks for elements that may cause horizontal scrolling

1. 2026-10-30[Link to revision](#rule-mobile-2f-horizontal-2d-scroll-2026-10-30-0)

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 sites2026-10-16[Link to this check](#rule-ai-2d-visibility-2f-agent-2d-docs)

ai-visibility/agent-docs · Current category: ai-visibility · Current severity: info

Developer 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.

Check introduced 2026-10-16

Facts that need JavaScript2026-10-16[Link to this check](#rule-ai-2d-visibility-2f-js-2d-dependent-2d-facts)

ai-visibility/js-dependent-facts · Current category: ai-visibility · Current severity: info

A page that shows 0+ to a reader without scripts states something false. The comparison needs no new request when the page was rendered.

Check introduced 2026-10-16

llms.txt links2026-10-16[Link to this check](#rule-ai-2d-visibility-2f-llms-2d-txt-2d-links)

ai-visibility/llms-txt-links · Current category: ai-visibility · Current severity: info

A 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.

Check introduced 2026-10-16

Optional Markdown delivery2026-10-16[Link to this check](#rule-ai-2d-visibility-2f-markdown-2d-negotiation)

ai-visibility/markdown-negotiation · Current category: ai-visibility · Current severity: info

Requests 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.

**External sources**[HTTP Semantics: Accept ↗](https://www.rfc-editor.org/rfc/rfc9110.html#section-12.5.1)

1. 2026-10-16[Link to revision](#rule-ai-2d-visibility-2f-markdown-2d-negotiation-2026-10-16-4)

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.

2. 2026-10-07[Link to revision](#rule-ai-2d-visibility-2f-markdown-2d-negotiation-2026-10-07-2)

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.

3. 2026-10-07[Link to revision](#rule-ai-2d-visibility-2f-markdown-2d-negotiation-2026-10-07-3)

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.

4. 2026-10-06[Link to revision](#rule-ai-2d-visibility-2f-markdown-2d-negotiation-2026-10-06-1)

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.

5. 2026-10-04[Link to revision](#rule-ai-2d-visibility-2f-markdown-2d-negotiation-2026-10-04-0)

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.

Check introduced 2026-10-04

Decision pages for your rivals2026-10-16[Link to this check](#rule-content-2f-decision-2d-pages)

content/decision-pages · Current category: content · Current severity: info

Buyers 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.

Check introduced 2026-10-16

Near-identical templated pages2026-10-16[Link to this check](#rule-content-2f-templated-2d-near-2d-duplicates)

content/templated-near-duplicates · Current category: content · Current severity: info

Programmatic 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.

Check introduced 2026-10-16

All Non-Indexed Pages2026-10-16[Link to this check](#rule-crawl-2f-all-2d-noindex-2d-pages)

crawl/all-noindex-pages · Current category: crawl · Current severity: info

Lists pages blocked from indexing across the captured site.

1. 2026-10-16[Link to revision](#rule-crawl-2f-all-2d-noindex-2d-pages-2026-10-16-1)

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.

2. 2026-10-06[Link to revision](#rule-crawl-2f-all-2d-noindex-2d-pages-2026-10-06-0)

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 hygiene2026-10-16[Link to this check](#rule-crawl-2f-sitemap-2d-hygiene)

crawl/sitemap-hygiene · Current category: crawl · Current severity: info

Sitemaps 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.

Check introduced 2026-10-16

Image Dimensions2026-10-16[Link to this check](#rule-images-2f-dimensions)

images/dimensions · Current category: images · Current severity: info

Reports images missing explicit width and height.

1. 2026-10-16[Link to revision](#rule-images-2f-dimensions-2026-10-16-1)

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.

2. 2026-10-06[Link to revision](#rule-images-2f-dimensions-2026-10-06-0)

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 Card2026-10-07[Link to this check](#rule-ai-2d-visibility-2f-a2a-2d-agent-2d-card)

ai-visibility/a2a-agent-card · Current category: ai-visibility · Current severity: info

Agents discover another agent's capabilities from its card at a fixed path; a published card missing required fields cannot be used. PRD goal G5.

**External sources**[Agent2Agent (A2A) Protocol Specification 1.0 ↗](https://a2a-protocol.org/v1.0.0/specification/)

Check introduced 2026-10-07

Agent Readability2026-10-07[Link to this check](#rule-ai-2d-visibility-2f-agent-2d-readability)

ai-visibility/agent-readability · Current category: ai-visibility · Current severity: info

A 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.

1. 2026-10-07[Link to revision](#rule-ai-2d-visibility-2f-agent-2d-readability-2026-10-07-0)

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.

Check introduced 2026-10-07

Agent Answerability2026-10-07[Link to this check](#rule-ai-2d-visibility-2f-answerability)

ai-visibility/answerability · Current category: ai-visibility · Current severity: info

Whether 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.

Check introduced 2026-10-07

API Catalog (RFC 9727)2026-10-07[Link to this check](#rule-ai-2d-visibility-2f-api-2d-catalog)

ai-visibility/api-catalog · Current category: ai-visibility · Current severity: info

Agents 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.

**External sources**[RFC 9727: api-catalog ↗](https://www.rfc-editor.org/rfc/rfc9727.html)[RFC 9264: Linkset media types (application/linkset+json) ↗](https://www.rfc-editor.org/rfc/rfc9264.html)

Check introduced 2026-10-07

Content Signals in robots.txt2026-10-07[Link to this check](#rule-ai-2d-visibility-2f-content-2d-signals)

ai-visibility/content-signals · Current category: ai-visibility · Current severity: info

Sites increasingly state AI search, input and training preferences in robots.txt; a malformed value states nothing a crawler can read. PRD goal G5.

**External sources**[Cloudflare: managed robots.txt and the Content Signals Policy ↗](https://developers.cloudflare.com/bots/additional-configurations/managed-robots-txt/)

Check introduced 2026-10-07

Markdown Alternate2026-10-07[Link to this check](#rule-ai-2d-visibility-2f-markdown-2d-alternate)

ai-visibility/markdown-alternate · Current category: ai-visibility · Current severity: info

Reports 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.

1. 2026-10-07[Link to revision](#rule-ai-2d-visibility-2f-markdown-2d-alternate-2026-10-07-0)

Vary now matches exact comma-separated Accept tokens; Accept-Encoding no longer produces misleading negotiation evidence. Verdicts and scoring unchanged.

2. 2026-10-07[Link to revision](#rule-ai-2d-visibility-2f-markdown-2d-alternate-2026-10-07-1)

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.

Check introduced 2026-08-24

OAuth Protected Resource Metadata (RFC 9728)2026-10-07[Link to this check](#rule-ai-2d-visibility-2f-oauth-2d-resource-2d-metadata)

ai-visibility/oauth-resource-metadata · Current category: ai-visibility · Current severity: info

MCP 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.

**External sources**[RFC 9728: OAuth 2.0 Protected Resource Metadata ↗](https://www.rfc-editor.org/rfc/rfc9728.html)

Check introduced 2026-10-07

OAuth Authorization Server Metadata (RFC 8414)2026-10-07[Link to this check](#rule-ai-2d-visibility-2f-oauth-2d-server-2d-metadata)

ai-visibility/oauth-server-metadata · Current category: ai-visibility · Current severity: info

Agents 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.

**External sources**[RFC 8414: OAuth 2.0 Authorization Server Metadata ↗](https://www.rfc-editor.org/rfc/rfc8414.html)

Check introduced 2026-10-07

Analytics Tracking2026-10-07[Link to this check](#rule-analytics-2f-gtm-2d-present)

analytics/gtm-present · Current category: analytics · Current severity: info

Checks for Google Tag Manager or analytics implementation

1. 2026-10-07[Link to revision](#rule-analytics-2f-gtm-2d-present-2026-10-07-0)

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 hosts2026-10-07[Link to this check](#rule-analytics-2f-tech-2d-candidates)

analytics/tech-candidates · Current category: analytics · Current severity: info

Technology 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.

Check introduced 2026-10-07

Redirect Chains2026-10-07[Link to this check](#rule-crawl-2f-redirect-2d-chain)

crawl/redirect-chain · Current category: crawl · Current severity: warning

Pages are reached without passing through multiple redirects

1. 2026-10-07[Link to revision](#rule-crawl-2f-redirect-2d-chain-2026-10-07-0)

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 Chains2026-10-07[Link to this check](#rule-links-2f-redirect-2d-chains)

links/redirect-chains · Current category: links · Current severity: warning

Detects URLs that redirect and links pointing to redirects

1. 2026-10-07[Link to revision](#rule-links-2f-redirect-2d-chains-2026-10-07-0)

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 delivery2026-10-07[Link to this check](#rule-perf-2f-resource-2d-delivery)

perf/resource-delivery · Current category: perf · Current severity: info

Captures 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.

**External sources**[HTTP Semantics: Content-Encoding ↗](https://www.rfc-editor.org/rfc/rfc9110.html#section-8.4)

1. 2026-10-07[Link to revision](#rule-perf-2f-resource-2d-delivery-2026-10-07-2)

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.

2. 2026-10-06[Link to revision](#rule-perf-2f-resource-2d-delivery-2026-10-06-1)

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.

3. 2026-10-04[Link to revision](#rule-perf-2f-resource-2d-delivery-2026-10-04-0)

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.

Check introduced 2026-10-04

Schema Deprecated for Google Rich Results2026-10-07[Link to this check](#rule-schema-2f-deprecated-2d-for-2d-google)

schema/deprecated-for-google · Current category: schema · Current severity: info

Notes 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.

**External sources**[Google Search Central: Changes to HowTo and FAQ rich results (August 2023) ↗](https://developers.google.com/search/blog/2023/08/howto-faq-changes)[Google Search Central: removing the FAQ rich result (7 May 2026) ↗](https://developers.google.com/search/updates#removing-faq-rich-result)

1. 2026-10-07[Link to revision](#rule-schema-2f-deprecated-2d-for-2d-google-2026-10-07-0)

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.

Check introduced 2026-08-13

Entity Identity2026-10-07[Link to this check](#rule-schema-2f-entity-2d-identity)

schema/entity-identity · Current category: schema · Current severity: warning

Makes 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.

**External sources**[Schema.org: name and multiple language values ↗](https://schema.org/name)[Schema.org: alternateName identifies an alias ↗](https://schema.org/alternateName)[W3C JSON-LD 1.1: multiple property values ↗](https://www.w3.org/TR/json-ld11/#sets-of-values)[Google Search Central: Organization structured data ↗](https://developers.google.com/search/docs/appearance/structured-data/organization)[Schema.org: Organization properties ↗](https://schema.org/Organization)[Schema.org: PostalAddress components ↗](https://schema.org/PostalAddress)

**Read more from Chad**[AI Overviews Now Cover Half of US Searches. Only 17% Cite Top-10 Organic Pages. ↗](https://trychad.ai/blog/ai-overviews-17-percent-organic-citation-decoupling/)[62% of AI Citations Never Name Your Brand — You're Getting Traffic Without Recognition ↗](https://trychad.ai/blog/ghost-citations-62-percent-brand-invisible/)

1. 2026-10-07[Link to revision](#rule-schema-2f-entity-2d-identity-2026-10-07-2)

Anonymous declarations now expose bounded captured names and source paths for publisher identity review. Checks remain unscored; score and grade unchanged.

2. 2026-10-03[Link to revision](#rule-schema-2f-entity-2d-identity-2026-10-03-0)

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.

3. 2026-10-02[Link to revision](#rule-schema-2f-entity-2d-identity-2026-10-02-1)

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.

Check introduced 2026-08-02

Access Keys2026-10-06[Link to this check](#rule-a11y-2f-accesskeys)

a11y/accesskeys · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: Access Keys.

1. 2026-10-06[Link to revision](#rule-a11y-2f-accesskeys-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-accesskeys-2026-10-01-0)

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 Attributes2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-allowed-2d-attr)

a11y/aria-allowed-attr · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: ARIA Allowed Attributes.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-allowed-2d-attr-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-allowed-2d-attr-2026-10-01-0)

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 Name2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-command-2d-name)

a11y/aria-command-name · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Command Name.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-command-2d-name-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-command-2d-name-2026-10-01-0)

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 Roles2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-deprecated-2d-role)

a11y/aria-deprecated-role · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: Deprecated ARIA Roles.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-deprecated-2d-role-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-deprecated-2d-role-2026-10-01-0)

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 Name2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-dialog-2d-name)

a11y/aria-dialog-name · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Dialog Name.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-dialog-2d-name-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-dialog-2d-name-2026-10-01-0)

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 Hidden Body2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-hidden-2d-body)

a11y/aria-hidden-body · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Hidden Body.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-hidden-2d-body-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-hidden-2d-body-2026-10-01-0)

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 Hidden Focus2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-hidden-2d-focus)

a11y/aria-hidden-focus · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Hidden Focus.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-hidden-2d-focus-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-hidden-2d-focus-2026-10-01-0)

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 Name2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-input-2d-field-2d-name)

a11y/aria-input-field-name · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Input Field Name.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-input-2d-field-2d-name-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-input-2d-field-2d-name-2026-10-01-0)

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 Name2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-meter-2d-name)

a11y/aria-meter-name · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Meter Name.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-meter-2d-name-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-meter-2d-name-2026-10-01-0)

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 Name2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-progressbar-2d-name)

a11y/aria-progressbar-name · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Progressbar Name.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-progressbar-2d-name-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-progressbar-2d-name-2026-10-01-0)

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 Attributes2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-required-2d-attr)

a11y/aria-required-attr · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Required Attributes.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-required-2d-attr-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-required-2d-attr-2026-10-01-0)

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 Children2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-required-2d-children)

a11y/aria-required-children · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Required Children.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-required-2d-children-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-required-2d-children-2026-10-01-0)

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 Parent2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-required-2d-parent)

a11y/aria-required-parent · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Required Parent.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-required-2d-parent-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-required-2d-parent-2026-10-01-0)

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 Roles2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-roles)

a11y/aria-roles · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Valid Roles.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-roles-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-roles-2026-10-01-0)

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 Text2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-text)

a11y/aria-text · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: ARIA Text.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-text-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-text-2026-10-01-0)

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 Name2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-toggle-2d-field-2d-name)

a11y/aria-toggle-field-name · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Toggle Field Name.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-toggle-2d-field-2d-name-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-toggle-2d-field-2d-name-2026-10-01-0)

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 Name2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-tooltip-2d-name)

a11y/aria-tooltip-name · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Tooltip Name.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-tooltip-2d-name-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-tooltip-2d-name-2026-10-01-0)

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 Name2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-treeitem-2d-name)

a11y/aria-treeitem-name · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Treeitem Name.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-treeitem-2d-name-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-treeitem-2d-name-2026-10-01-0)

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 Attributes2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-valid-2d-attr)

a11y/aria-valid-attr · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Valid Attributes.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-valid-2d-attr-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-valid-2d-attr-2026-10-01-0)

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 Values2026-10-06[Link to this check](#rule-a11y-2f-aria-2d-valid-2d-attr-2d-value)

a11y/aria-valid-attr-value · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: ARIA Valid Attribute Values.

1. 2026-10-06[Link to revision](#rule-a11y-2f-aria-2d-valid-2d-attr-2d-value-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-aria-2d-valid-2d-attr-2d-value-2026-10-01-0)

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.

Button Name2026-10-06[Link to this check](#rule-a11y-2f-button-2d-name)

a11y/button-name · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: Button Name.

1. 2026-10-06[Link to revision](#rule-a11y-2f-button-2d-name-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-button-2d-name-2026-10-01-0)

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 22 pages.

Color Contrast2026-10-06[Link to this check](#rule-a11y-2f-color-2d-contrast)

a11y/color-contrast · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: Color Contrast.

1. 2026-10-06[Link to revision](#rule-a11y-2f-color-2d-contrast-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-color-2d-contrast-2026-10-01-0)

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 Structure2026-10-06[Link to this check](#rule-a11y-2f-definition-2d-list)

a11y/definition-list · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: Definition List Structure.

1. 2026-10-06[Link to revision](#rule-a11y-2f-definition-2d-list-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-definition-2d-list-2026-10-01-0)

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 Item2026-10-06[Link to this check](#rule-a11y-2f-dlitem)

a11y/dlitem · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: Definition List Item.

1. 2026-10-06[Link to revision](#rule-a11y-2f-dlitem-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-dlitem-2026-10-01-0)

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 Active2026-10-06[Link to this check](#rule-a11y-2f-duplicate-2d-id-2d-active)

a11y/duplicate-id-active · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: Duplicate ID Active.

1. 2026-10-06[Link to revision](#rule-a11y-2f-duplicate-2d-id-2d-active-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-duplicate-2d-id-2d-active-2026-10-01-0)

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 ARIA2026-10-06[Link to this check](#rule-a11y-2f-duplicate-2d-id-2d-aria)

a11y/duplicate-id-aria · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: Duplicate ID ARIA.

1. 2026-10-06[Link to revision](#rule-a11y-2f-duplicate-2d-id-2d-aria-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-duplicate-2d-id-2d-aria-2026-10-01-0)

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 Headings2026-10-06[Link to this check](#rule-a11y-2f-empty-2d-heading)

a11y/empty-heading · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: Empty Headings.

1. 2026-10-06[Link to revision](#rule-a11y-2f-empty-2d-heading-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-empty-2d-heading-2026-10-01-0)

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 Labels2026-10-06[Link to this check](#rule-a11y-2f-form-2d-field-2d-multiple-2d-labels)

a11y/form-field-multiple-labels · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: Multiple Labels.

1. 2026-10-06[Link to revision](#rule-a11y-2f-form-2d-field-2d-multiple-2d-labels-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-form-2d-field-2d-multiple-2d-labels-2026-10-01-0)

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 Title2026-10-06[Link to this check](#rule-a11y-2f-frame-2d-title)

a11y/frame-title · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: Frame Title.

1. 2026-10-06[Link to revision](#rule-a11y-2f-frame-2d-title-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-frame-2d-title-2026-10-01-0)

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 Order2026-10-06[Link to this check](#rule-a11y-2f-heading-2d-order)

a11y/heading-order · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: Heading Order.

1. 2026-10-06[Link to revision](#rule-a11y-2f-heading-2d-order-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-heading-2d-order-2026-10-01-0)

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 Valid2026-10-06[Link to this check](#rule-a11y-2f-html-2d-lang-2d-valid)

a11y/html-lang-valid · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: HTML Lang Valid.

1. 2026-10-06[Link to revision](#rule-a11y-2f-html-2d-lang-2d-valid-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-html-2d-lang-2d-valid-2026-10-01-0)

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 Mismatch2026-10-06[Link to this check](#rule-a11y-2f-html-2d-xml-2d-lang-2d-mismatch)

a11y/html-xml-lang-mismatch · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: HTML XML Lang Mismatch.

1. 2026-10-06[Link to revision](#rule-a11y-2f-html-2d-xml-2d-lang-2d-mismatch-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-html-2d-xml-2d-lang-2d-mismatch-2026-10-01-0)

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 Purpose2026-10-06[Link to this check](#rule-a11y-2f-identical-2d-links-2d-same-2d-purpose)

a11y/identical-links-same-purpose · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: Identical Links Same Purpose.

1. 2026-10-06[Link to revision](#rule-a11y-2f-identical-2d-links-2d-same-2d-purpose-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-identical-2d-links-2d-same-2d-purpose-2026-10-01-0)

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 Alt2026-10-06[Link to this check](#rule-a11y-2f-image-2d-redundant-2d-alt)

a11y/image-redundant-alt · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: Redundant Image Alt.

1. 2026-10-06[Link to revision](#rule-a11y-2f-image-2d-redundant-2d-alt-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-image-2d-redundant-2d-alt-2026-10-01-0)

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 Alt2026-10-06[Link to this check](#rule-a11y-2f-input-2d-image-2d-alt)

a11y/input-image-alt · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: Input Image Alt.

1. 2026-10-06[Link to revision](#rule-a11y-2f-input-2d-image-2d-alt-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-input-2d-image-2d-alt-2026-10-01-0)

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 Mismatch2026-10-06[Link to this check](#rule-a11y-2f-label-2d-content-2d-name-2d-mismatch)

a11y/label-content-name-mismatch · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: Label Content Name Mismatch.

1. 2026-10-06[Link to revision](#rule-a11y-2f-label-2d-content-2d-name-2d-mismatch-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-label-2d-content-2d-name-2d-mismatch-2026-10-01-0)

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 Landmark2026-10-06[Link to this check](#rule-a11y-2f-landmark-2d-one-2d-main)

a11y/landmark-one-main · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: One Main Landmark.

1. 2026-10-06[Link to revision](#rule-a11y-2f-landmark-2d-one-2d-main-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-landmark-2d-one-2d-main-2026-10-01-0)

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 Block2026-10-06[Link to this check](#rule-a11y-2f-link-2d-in-2d-text-2d-block)

a11y/link-in-text-block · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: Link in Text Block.

1. 2026-10-06[Link to revision](#rule-a11y-2f-link-2d-in-2d-text-2d-block-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-link-2d-in-2d-text-2d-block-2026-10-01-0)

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 Context2026-10-06[Link to this check](#rule-a11y-2f-listitem)

a11y/listitem · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: List Item Context.

1. 2026-10-06[Link to revision](#rule-a11y-2f-listitem-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-listitem-2026-10-01-0)

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 Refresh2026-10-06[Link to this check](#rule-a11y-2f-meta-2d-refresh)

a11y/meta-refresh · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: Meta Refresh.

1. 2026-10-06[Link to revision](#rule-a11y-2f-meta-2d-refresh-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-meta-2d-refresh-2026-10-01-0)

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 Text2026-10-06[Link to this check](#rule-a11y-2f-object-2d-alt)

a11y/object-alt · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: Object Alt Text.

1. 2026-10-06[Link to revision](#rule-a11y-2f-object-2d-alt-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-object-2d-alt-2026-10-01-0)

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 Name2026-10-06[Link to this check](#rule-a11y-2f-select-2d-name)

a11y/select-name · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: Select Name.

1. 2026-10-06[Link to revision](#rule-a11y-2f-select-2d-name-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-select-2d-name-2026-10-01-0)

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 Link2026-10-06[Link to this check](#rule-a11y-2f-skip-2d-link)

a11y/skip-link · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: Skip Link.

1. 2026-10-06[Link to revision](#rule-a11y-2f-skip-2d-link-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-skip-2d-link-2026-10-01-0)

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 Values2026-10-06[Link to this check](#rule-a11y-2f-tabindex)

a11y/tabindex · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: Tabindex Values.

1. 2026-10-06[Link to revision](#rule-a11y-2f-tabindex-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-tabindex-2026-10-01-0)

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 Name2026-10-06[Link to this check](#rule-a11y-2f-table-2d-duplicate-2d-name)

a11y/table-duplicate-name · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: Table Duplicate Name.

1. 2026-10-06[Link to revision](#rule-a11y-2f-table-2d-duplicate-2d-name-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-table-2d-duplicate-2d-name-2026-10-01-0)

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 Headers2026-10-06[Link to this check](#rule-a11y-2f-td-2d-headers-2d-attr)

a11y/td-headers-attr · Current category: a11y · Current severity: error

Reports an accessibility defect detected by axe-core: Table Cell Headers.

1. 2026-10-06[Link to revision](#rule-a11y-2f-td-2d-headers-2d-attr-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-td-2d-headers-2d-attr-2026-10-01-0)

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 Cells2026-10-06[Link to this check](#rule-a11y-2f-th-2d-has-2d-data-2d-cells)

a11y/th-has-data-cells · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: TH Has Data Cells.

1. 2026-10-06[Link to revision](#rule-a11y-2f-th-2d-has-2d-data-2d-cells-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-th-2d-has-2d-data-2d-cells-2026-10-01-0)

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 Attributes2026-10-06[Link to this check](#rule-a11y-2f-valid-2d-lang)

a11y/valid-lang · Current category: a11y · Current severity: warning

Reports an accessibility defect detected by axe-core: Valid Lang Attributes.

1. 2026-10-06[Link to revision](#rule-a11y-2f-valid-2d-lang-2026-10-06-1)

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.

2. 2026-10-01[Link to revision](#rule-a11y-2f-valid-2d-lang-2026-10-01-0)

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 Title2026-10-06[Link to this check](#rule-content-2f-duplicate-2d-title)

content/duplicate-title · Current category: content · Current severity: warning

Reports page titles shared across the captured pages.

1. 2026-10-06[Link to revision](#rule-content-2f-duplicate-2d-title-2026-10-06-0)

Now the single owner of duplicate-title findings; core/title-unique, which duplicated it, is retired. Behaviour of this rule is unchanged.

core/title-unique2026-10-06[Link to this check](#rule-core-2f-title-2d-unique)

core/title-unique · Current category: unspecified · Current severity: unspecified

Reported page titles shared across the site.

1. 2026-10-06[Link to revision](#rule-core-2f-title-2d-unique-2026-10-06-0)

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.

Disclaimers2026-10-06[Link to this check](#rule-eeat-2f-disclaimers)

eeat/disclaimers · Current category: eeat · Current severity: info

Checks for appropriate disclaimers on sensitive content

1. 2026-10-06[Link to revision](#rule-eeat-2f-disclaimers-2026-10-06-0)

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 Policy2026-10-06[Link to this check](#rule-eeat-2f-privacy-2d-policy)

eeat/privacy-policy · Current category: eeat · Current severity: warning

Checks for privacy policy page linked from footer

1. 2026-10-06[Link to revision](#rule-eeat-2f-privacy-2d-policy-2026-10-06-0)

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 Detection2026-10-06[Link to this check](#rule-eeat-2f-ymyl-2d-detection)

eeat/ymyl-detection · Current category: eeat · Current severity: info

Detects Your Money Your Life (YMYL) content

1. 2026-10-06[Link to revision](#rule-eeat-2f-ymyl-2d-detection-2026-10-06-0)

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-links2026-10-06[Link to this check](#rule-links-2f-broken-2d-external-2d-links)

links/broken-external-links · Current category: unspecified · Current severity: unspecified

Reported external links that returned an error.

1. 2026-10-06[Link to revision](#rule-links-2f-broken-2d-external-2d-links-2026-10-06-0)

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 Links2026-10-06[Link to this check](#rule-links-2f-broken-2d-links)

links/broken-links · Current category: links · Current severity: error

Reports external links that returned an error.

1. 2026-10-06[Link to revision](#rule-links-2f-broken-2d-links-2026-10-06-0)

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 Pages2026-10-06[Link to this check](#rule-links-2f-orphan-2d-pages)

links/orphan-pages · Current category: links · Current severity: warning

Finds 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.

1. 2026-10-06[Link to revision](#rule-links-2f-orphan-2d-pages-2026-10-06-0)

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.

Check introduced 2026-08-01

Social Profiles2026-10-06[Link to this check](#rule-social-2f-social-2d-profiles)

social/social-profiles · Current category: social · Current severity: info

Checks for links to social media profiles

1. 2026-10-06[Link to revision](#rule-social-2f-social-2d-profiles-2026-10-06-0)

Profile patterns are now matched against the link's hostname and path; they had been tested against the full URL, so a profile without www (https://linkedin.com/company/...) was never recognised and pages with real profiles or sameAs warned. Measured: trychad.ai 25 of 25 pages warn to pass, networthtrackr.com 24 of 25.

Canonical Clustering2026-10-05[Link to this check](#rule-crawl-2f-canonical-2d-cluster)

crawl/canonical-cluster · Current category: crawl · Current severity: warning

Detects 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.

1. 2026-10-05[Link to revision](#rule-crawl-2f-canonical-2d-cluster-2026-10-05-2)

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.

2. 2026-08-13[Link to revision](#rule-crawl-2f-canonical-2d-cluster-2026-08-13-0)

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.

3. 2026-08-13[Link to revision](#rule-crawl-2f-canonical-2d-cluster-2026-08-13-1)

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.

Check introduced 2026-08-01

Canonical Form Review2026-10-04[Link to this check](#rule-core-2f-canonical-2d-form-2d-drift)

core/canonical-form-drift · Current category: core · Current severity: info

Adds 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.

**External sources**[Google Search Central: Consolidate duplicate URLs ↗](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)

Check introduced 2026-10-04

Observed Internal Link Sources2026-10-04[Link to this check](#rule-links-2f-weak-2d-internal-2d-links)

links/weak-internal-links · Current category: links · Current severity: info

Adds 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.

**External sources**[Google Search Central: Link best practices ↗](https://developers.google.com/search/docs/crawling-indexing/links-crawlable)

1. 2026-10-04[Link to revision](#rule-links-2f-weak-2d-internal-2d-links-2026-10-04-0)

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.

Check introduced 2026-10-04

Captured Entity References2026-10-04[Link to this check](#rule-schema-2f-entity-2d-dangling)

schema/entity-dangling · Current category: schema · Current severity: info

Observes @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.

**External sources**[W3C JSON-LD 1.1: Node Identifiers ↗](https://www.w3.org/TR/json-ld11/#node-identifiers)

1. 2026-10-04[Link to revision](#rule-schema-2f-entity-2d-dangling-2026-10-04-0)

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.

Check introduced 2026-10-04

LocalBusiness Schema2026-10-04[Link to this check](#rule-schema-2f-local-2d-business)

schema/local-business · Current category: schema · Current severity: warning

A 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.

**External sources**[Google Search Central: Local Business Structured Data ↗](https://developers.google.com/search/docs/appearance/structured-data/local-business)

1. 2026-10-04[Link to revision](#rule-schema-2f-local-2d-business-2026-10-04-0)

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 Schema2026-10-04[Link to this check](#rule-schema-2f-organization)

schema/organization · Current category: schema · Current severity: info

Organization 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.

**External sources**[Google Search Central: Organization structured data ↗](https://developers.google.com/search/docs/appearance/structured-data/organization)

**Read more from Chad**[Entity Disambiguation Is Now the #1 AI Citation Signal ↗](https://trychad.ai/blog/entity-disambiguation-schema-number-one-ai-citation-signal/)

1. 2026-10-04[Link to revision](#rule-schema-2f-organization-2026-10-04-0)

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 Association2026-10-04[Link to this check](#rule-schema-2f-rating-2d-scope)

schema/rating-scope · Current category: schema · Current severity: info

Carries 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.

**External sources**[Google Search Central: Review Snippet Structured Data ↗](https://developers.google.com/search/docs/appearance/structured-data/review-snippet)

1. 2026-10-04[Link to revision](#rule-schema-2f-rating-2d-scope-2026-10-04-0)

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.

Check introduced 2026-10-04

Review Schema2026-10-04[Link to this check](#rule-schema-2f-review)

schema/review · Current category: schema · Current severity: warning

Review 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.

**External sources**[Google Search Central: Review Snippet Structured Data ↗](https://developers.google.com/search/docs/appearance/structured-data/review-snippet)

1. 2026-10-04[Link to revision](#rule-schema-2f-review-2026-10-04-0)

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 Artifacts2026-10-03[Link to this check](#rule-content-2f-mojibake)

content/mojibake · Current category: content · Current severity: info

Reports 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.

**External sources**[WHATWG Encoding Standard: decoding and error handling ↗](https://encoding.spec.whatwg.org/)

Check introduced 2026-10-03

Captured Template Artifacts2026-10-03[Link to this check](#rule-content-2f-placeholder-2d-text)

content/placeholder-text · Current category: content · Current severity: info

Reports 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.

Check introduced 2026-10-03

Possible Soft 404 in Captured Response2026-10-03[Link to this check](#rule-crawl-2f-soft-2d-404)

crawl/soft-404 · Current category: crawl · Current severity: info

Reports 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.

**External sources**[Google Search Central: soft 404 errors ↗](https://developers.google.com/search/docs/crawling-indexing/troubleshoot-crawling-errors#soft-404-errors)

Check introduced 2026-10-03

Review Captured Contextual Incoming Links2026-10-03[Link to this check](#rule-links-2f-no-2d-contextual-2d-inbound)

links/no-contextual-inbound · Current category: links · Current severity: info

Adds 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.

**External sources**[Google Search Central: Link best practices ↗](https://developers.google.com/search/docs/crawling-indexing/links-crawlable)

Check introduced 2026-10-03

LCP Optimization Hints2026-10-03[Link to this check](#rule-perf-2f-lcp-2d-hints)

perf/lcp-hints · Current category: perf · Current severity: warning

Identifies captured image loading hints that merit review for largest contentful paint performance; static markup does not establish measured LCP.

**External sources**[Google web.dev: optimize LCP resource priority ↗](https://web.dev/articles/optimize-lcp)

1. 2026-10-03[Link to revision](#rule-perf-2f-lcp-2d-hints-2026-10-03-0)

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 Coverage2026-10-03[Link to this check](#rule-schema-2f-template-2d-coverage)

schema/template-coverage · Current category: schema · Current severity: info

Captured 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.

**External sources**[Google Search Central: Article structured data ↗](https://developers.google.com/search/docs/appearance/structured-data/article)[Google Search Central: single-product page scope ↗](https://developers.google.com/search/docs/appearance/structured-data/product-snippet)[Google Search Central: General structured data guidelines ↗](https://developers.google.com/search/docs/appearance/structured-data/sd-policies)[Schema.org: SoftwareApplication and its properties ↗](https://schema.org/SoftwareApplication)

Check introduced 2026-10-03

AI Search Crawler Directives2026-10-02[Link to this check](#rule-ai-2d-visibility-2f-crawler-2d-directives)

ai-visibility/crawler-directives · Current category: ai-visibility · Current severity: warning

Reports 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.

**External sources**[OpenAI crawler roles and independent search/training controls ↗](https://developers.openai.com/api/docs/bots)[Anthropic training, search and user-request bots ↗](https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler)[Perplexity search crawler and user-request fetcher ↗](https://docs.perplexity.ai/docs/resources/perplexity-crawlers)[Google-Extended product control and Google Search exclusion ↗](https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers)[Common Crawl CCBot purpose and robots policy ↗](https://commoncrawl.org/faq)[Robots Exclusion Protocol group and path matching ↗](https://www.rfc-editor.org/rfc/rfc9309.txt)

1. 2026-10-02[Link to revision](#rule-ai-2d-visibility-2f-crawler-2d-directives-2026-10-02-1)

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.

2. 2026-10-01[Link to revision](#rule-ai-2d-visibility-2f-crawler-2d-directives-2026-10-01-0)

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.

Check introduced 2026-08-10

llms.txt2026-10-02[Link to this check](#rule-ai-2d-visibility-2f-llms-2d-txt)

ai-visibility/llms-txt · Current category: ai-visibility · Current severity: info

Reports 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.

**External sources**[The /llms.txt file ↗](https://llmstxt.org/)

1. 2026-10-02[Link to revision](#rule-ai-2d-visibility-2f-llms-2d-txt-2026-10-02-0)

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.

Check introduced 2026-08-24

Not Found Handling2026-10-02[Link to this check](#rule-ai-2d-visibility-2f-not-2d-found-2d-handling)

ai-visibility/not-found-handling · Current category: ai-visibility · Current severity: warning

Fetches 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.

1. 2026-10-02[Link to revision](#rule-ai-2d-visibility-2f-not-2d-found-2d-handling-2026-10-02-0)

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.

Check introduced 2026-08-24

Indexability Conflicts2026-10-02[Link to this check](#rule-crawl-2f-indexability-2d-conflicts)

crawl/indexability-conflicts · Current category: crawl · Current severity: warning

Cross-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.

1. 2026-10-02[Link to revision](#rule-crawl-2f-indexability-2d-conflicts-2026-10-02-1)

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.

2. 2026-08-13[Link to revision](#rule-crawl-2f-indexability-2d-conflicts-2026-08-13-0)

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 Shell2026-10-01[Link to this check](#rule-ai-2d-visibility-2f-crawler-2d-shell)

ai-visibility/crawler-shell · Current category: ai-visibility · Current severity: error

Reports 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.

**External sources**[Google: server-side rendering and pre-rendering help crawlers that cannot execute JavaScript ↗](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics)

1. 2026-10-01[Link to revision](#rule-ai-2d-visibility-2f-crawler-2d-shell-2026-10-01-2)

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.

2. 2026-08-13[Link to revision](#rule-ai-2d-visibility-2f-crawler-2d-shell-2026-08-13-0)

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.

3. 2026-08-13[Link to revision](#rule-ai-2d-visibility-2f-crawler-2d-shell-2026-08-13-1)

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.

Check introduced 2026-08-10

Site-wide AI Readability2026-10-01[Link to this check](#rule-ai-2d-visibility-2f-ssr-2d-coverage)

ai-visibility/ssr-coverage · Current category: ai-visibility · Current severity: warning

Aggregates 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.

**External sources**[Google: server-side rendering and pre-rendering help crawlers that cannot execute JavaScript ↗](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics)

1. 2026-10-01[Link to revision](#rule-ai-2d-visibility-2f-ssr-2d-coverage-2026-10-01-2)

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).

2. 2026-10-01[Link to revision](#rule-ai-2d-visibility-2f-ssr-2d-coverage-2026-10-01-3)

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.

3. 2026-08-13[Link to revision](#rule-ai-2d-visibility-2f-ssr-2d-coverage-2026-08-13-0)

The summary now separates pages sending nothing at all from pages whose structured data survives, rather than describing both as returning no content.

4. 2026-08-13[Link to revision](#rule-ai-2d-visibility-2f-ssr-2d-coverage-2026-08-13-1)

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.

Check introduced 2026-08-10

Author Info2026-10-01[Link to this check](#rule-content-2f-author-2d-info)

content/author-info · Current category: content · Current severity: info

Identifies machine-readable or marked-up author information on a page.

1. 2026-10-01[Link to revision](#rule-content-2f-author-2d-info-2026-10-01-0)

Now reads author nodes inside JSON-LD @graph and follows an Article author's @id reference. Previously a Yoast-style Article and linked Person were missed. Replaying the latest stored reference crawls turned 51 page warnings to pass on trychad.ai; the other four sites had no changed findings. No final score moved.

Content Freshness2026-10-01[Link to this check](#rule-content-2f-freshness)

content/freshness · Current category: content · Current severity: info

Identifies date signals that can tell readers when content was published or updated.

1. 2026-10-01[Link to revision](#rule-content-2f-freshness-2026-10-01-0)

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.

Author Bylines2026-10-01[Link to this check](#rule-eeat-2f-author-2d-byline)

eeat/author-byline · Current category: eeat · Current severity: warning

Measures whether article-style pages carry author attribution across the site.

1. 2026-10-01[Link to revision](#rule-eeat-2f-author-2d-byline-2026-10-01-0)

Now reads author fields inside JSON-LD @graph. Previously a Yoast-style Article author was missed. Replaying the latest stored reference crawls turned the trychad.ai site warning to pass; the other four sites had no changed findings. No final score moved.

Author Expertise2026-10-01[Link to this check](#rule-eeat-2f-author-2d-expertise)

eeat/author-expertise · Current category: eeat · Current severity: info

Looks for author credentials or expertise signals on crawled pages.

1. 2026-10-01[Link to revision](#rule-eeat-2f-author-2d-expertise-2026-10-01-0)

Now follows an Article author's @id reference to a Person in JSON-LD @graph and reads that person's expertise fields. An unlinked Person in @graph does not count. Capable of turning a site warning into a pass; reproduced in focused fixtures, with no changed findings on five stored reference crawls.

Content Dates2026-10-01[Link to this check](#rule-eeat-2f-content-2d-dates)

eeat/content-dates · Current category: eeat · Current severity: warning

Measures the share of article-style pages with content date signals.

1. 2026-10-01[Link to revision](#rule-eeat-2f-content-2d-dates-2026-10-01-0)

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 Landmark2026-08-24[Link to this check](#rule-content-2f-landmark)

content/landmark · Current category: content · Current severity: warning

Checks 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.

Check introduced 2026-08-24

Schema Content Mismatch2026-08-24[Link to this check](#rule-schema-2f-content-2d-mismatch)

schema/content-mismatch · Current category: schema · Current severity: warning

Checks 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.

**External sources**[Google Search Central: General structured data guidelines ↗](https://developers.google.com/search/docs/appearance/structured-data/sd-policies)

Check introduced 2026-08-24

Canonical URL2026-08-13[Link to this check](#rule-core-2f-canonical)

core/canonical · Current category: core · Current severity: warning

Checks that a page declares a canonical URL at all — its absence leaves search engines to guess which URL is authoritative for the content.

**External sources**[Google Search Central: What Is URL Canonicalization ↗](https://developers.google.com/search/docs/crawling-indexing/canonicalization)

1. 2026-08-13[Link to revision](#rule-core-2f-canonical-2026-08-13-0)

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 Validation2026-08-13[Link to this check](#rule-core-2f-canonical-2d-header)

core/canonical-header · Current category: core · Current severity: warning

Compares 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.

**External sources**[Google Search Central: Consolidate duplicate URLs ↗](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)

1. 2026-08-13[Link to revision](#rule-core-2f-canonical-2d-header-2026-08-13-0)

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 Tags2026-08-13[Link to this check](#rule-core-2f-canonical-2d-multiple)

core/canonical-multiple · Current category: core · Current severity: warning

Flags 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.

**External sources**[Google Search Central: 5 common mistakes with rel=canonical ↗](https://developers.google.com/search/blog/2013/04/5-common-mistakes-with-relcanonical)

Check introduced 2026-08-13

Nosnippet Directive2026-08-13[Link to this check](#rule-core-2f-nosnippet)

core/nosnippet · Current category: core · Current severity: warning

Flags 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.

1. 2026-08-13[Link to revision](#rule-core-2f-nosnippet-2026-08-13-0)

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 Meta2026-08-13[Link to this check](#rule-core-2f-robots-2d-meta)

core/robots-meta · Current category: core · Current severity: warning

Reports whether a page is noindex via meta robots.

**External sources**[Google Search Central: Robots Meta Tags Specifications ↗](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag)

1. 2026-08-13[Link to revision](#rule-core-2f-robots-2d-meta-2026-08-13-0)

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 Tags2026-08-13[Link to this check](#rule-core-2f-robots-2d-multiple)

core/robots-multiple · Current category: core · Current severity: error

Flags 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.

**External sources**[Google Search Central: Robots Meta Tags Specifications ↗](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag)

Check introduced 2026-08-13

Canonical Chain2026-08-13[Link to this check](#rule-crawl-2f-canonical-2d-chain)

crawl/canonical-chain · Current category: crawl · Current severity: warning

Checks 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.

1. 2026-08-13[Link to revision](#rule-crawl-2f-canonical-2d-chain-2026-08-13-0)

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 Check2026-08-13[Link to this check](#rule-crawl-2f-indexability)

crawl/indexability · Current category: crawl · Current severity: info

Identifies pages blocked from indexing via meta robots or the X-Robots-Tag header.

**External sources**[Google Search Central: Robots Meta Tags Specifications ↗](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag)

1. 2026-08-13[Link to revision](#rule-crawl-2f-indexability-2026-08-13-0)

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.

Pagination2026-08-13[Link to this check](#rule-crawl-2f-pagination)

crawl/pagination · Current category: crawl · Current severity: info

Checks 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.

1. 2026-08-13[Link to revision](#rule-crawl-2f-pagination-2026-08-13-0)

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 Conflict2026-08-13[Link to this check](#rule-crawl-2f-robots-2d-meta-2d-conflict)

crawl/robots-meta-conflict · Current category: crawl · Current severity: warning

Compares 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.

1. 2026-08-13[Link to revision](#rule-crawl-2f-robots-2d-meta-2d-conflict-2026-08-13-0)

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 Definitions2026-08-13[Link to this check](#rule-schema-2f-duplicate-2d-entity)

schema/duplicate-entity · Current category: schema · Current severity: warning

Finds 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.

**Read more from Chad**[AI Overviews Now Cover Half of US Searches. Only 17% Cite Top-10 Organic Pages. ↗](https://trychad.ai/blog/ai-overviews-17-percent-organic-citation-decoupling/)[Entity Disambiguation Is Now the #1 AI Citation Signal ↗](https://trychad.ai/blog/entity-disambiguation-schema-number-one-ai-citation-signal/)[62% of AI Citations Never Name Your Brand — You're Getting Traffic Without Recognition ↗](https://trychad.ai/blog/ghost-citations-62-percent-brand-invisible/)

Check introduced 2026-08-13

FAQ Schema2026-08-13[Link to this check](#rule-schema-2f-faq)

schema/faq · Current category: schema · Current severity: warning

Reports 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.

**External sources**[Schema.org: FAQPage type definition ↗](https://schema.org/FAQPage)[Google Search Central: removing the FAQ rich result (7 May 2026) ↗](https://developers.google.com/search/updates#removing-faq-rich-result)

1. 2026-08-13[Link to revision](#rule-schema-2f-faq-2026-08-13-0)

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 Valid2026-08-13[Link to this check](#rule-schema-2f-json-2d-ld-2d-valid)

schema/json-ld-valid · Current category: schema · Current severity: warning

Reports a page carrying no structured data at all.

**External sources**[Google Search Central: Intro to Structured Data ↗](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data)

1. 2026-08-13[Link to revision](#rule-schema-2f-json-2d-ld-2d-valid-2026-08-13-0)

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 Schema2026-08-13[Link to this check](#rule-schema-2f-website-2d-search)

schema/website-search · Current category: schema · Current severity: info

Reports 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.

**External sources**[Google Search Central: Farewell, Sitelinks Search Box (21 November 2024) ↗](https://developers.google.com/search/blog/2024/10/sitelinks-search-box)

1. 2026-08-13[Link to revision](#rule-schema-2f-website-2d-search-2026-08-13-0)

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.

OG URL Match2026-08-13[Link to this check](#rule-social-2f-og-2d-url-2d-match)

social/og-url-match · Current category: social · Current severity: warning

Checks that a page's og:url meta tag matches its canonical URL — the two are meant to name the same authoritative address, and platforms that read og:url expect it to agree with the URL search engines already trust.

1. 2026-08-13[Link to revision](#rule-social-2f-og-2d-url-2d-match-2026-08-13-0)

The canonical it compares og:url against now includes one declared via rel="alternate canonical" or whitespace-padded rel (see crawl/canonical-cluster), not only an exact rel="canonical" tag; absent any canonical, this check falls back to the page's own URL. Bidirectional: a page whose og:url previously matched only by falling back to its own URL can start failing if a newly-discovered canonical differs from that URL, and a page that previously failed against its own URL can start passing if the newly-discovered canonical happens to match og:url instead. Not measured on our reference sites.

Trailing Slash2026-08-13[Link to this check](#rule-url-2f-trailing-2d-slash)

url/trailing-slash · Current category: url · Current severity: info

Checks 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.

1. 2026-08-13[Link to revision](#rule-url-2f-trailing-2d-slash-2026-08-13-0)

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.
