Related guides: How to appear in Google AI Overviews, How to rank in Google AI Mode, The free AI visibility checker.
48 of the hundred checks are in this group, 9 of them critical. Each is listed with its weight in the score and whether it affects AI search directly, and for each: why it matters, and what to do. The hub page has the other groups and how the score is made.
- robots.txt
- Sitemap directive
- sitemap.xml
- Sitemap contents
- Sitemap index
- Content feed
- www vs non-www
- <html lang>
- Schema completeness
- Heading structure
- Response time
- Redirect chain
- Trailing slash
- JavaScript dependence
- Mixed content
- Mobile rendering
- Page weight & blocking
- Image delivery
- On-page subject
- Core Web Vitals
- Critical path
- Layout stability
- Competing pages
- Caching & validators
- Entity assets crawlable
- Rating backed by page
- Listed URLs resolve
- Share image
- Canonical URL
- Title tag
- Meta description
- Meta robots
- Snippet & preview directives
- Open Graph tags
- hreflang
- Canonical target
- Viewport meta
- Title & description uniqueness
- Image alt text
- Page-level schema
- JSON-LD
- Organization schema
- WebSite schema
- BreadcrumbList schema
- FAQPage schema
- 404 status code
- HTTPS redirect
- Lab performance
robots.txt
criticalAI search needs this
Why it matters. The first file every crawler requests. Beyond blocking rules, it is where you point crawlers at your sitemap. Without it you lose that pointer, and AI crawlers — which are more conservative than Google — have less to go on.
What to do. Create /robots.txt containing "User-agent: *" then "Allow: /", plus a "Sitemap: https://yourdomain.com/sitemap.xml" line.
Sitemap directive
mediumAI search needs this
Why it matters. Crawlers guess at /sitemap.xml if you do not tell them. Declaring it in robots.txt removes the guesswork and lets you host it anywhere, including a CDN.
What to do. Add a line "Sitemap: https://yourdomain.com/sitemap.xml" to robots.txt. It can appear anywhere in the file.
sitemap.xml
criticalAI search needs this
Why it matters. Crawlers find most pages by following links, so anything nothing links to — new pages, deep pages, orphans — may never be discovered. A sitemap catches those and tells engines when each page changed.
What to do. Generate a sitemap listing only canonical, indexable, 200-status URLs. Most frameworks and CMSs do this automatically; make sure it is actually being regenerated on deploy.
Sitemap contents
highAI search needs this
Why it matters. lastmod is the one sitemap hint crawlers still trust — priority and changefreq are ignored entirely. Without lastmod, engines re-crawl on their own schedule, so fresh content can sit unseen for weeks. Freshness is a strong citation factor for answer engines.
What to do. Emit an accurate <lastmod> per URL, set from real content modification time — not the build timestamp, which makes every page look changed on every deploy.
Sitemap index
lowBarely affects AI search
Why it matters. Required above 50,000 URLs or 50MB. Below that it is still useful for segmenting by content type, so you can see indexing health per section instead of one opaque number.
What to do. Split into per-section sitemaps and list them in a <sitemapindex> file.
When it is not scored. Not present — only needed above 50,000 URLs or 50MB. Not scored.
Content feed
mediumAI search needs this
Why it matters. Feeds are clean, dated, structured full text with no navigation, no ads and no JavaScript — the easiest thing a crawler can possibly ingest. They also get syndicated by aggregators, and third-party mentions are what actually drive AI citation.
What to do. Publish RSS or Atom at /feed.xml with full content rather than excerpts, and link it from <head> with rel="alternate".
www vs non-www
mediumBarely affects AI search
Why it matters. If both www and the apex serve HTTP 200, crawlers see two copies of every page. Links, citations and authority split between the two hostnames and neither accumulates the full signal.
What to do. Pick one hostname and 301 the other to it at the server or CDN, then make sure your canonical tags and sitemap use the same one.
When it is not scored. Only one hostname resolves. Nothing to do.
<html lang>
mediumBarely affects AI search
Why it matters. Tells a model which language your content is in before it reads a word, and which locale to attribute you to. Cheap to add, and its absence makes multilingual classification guesswork.
What to do. Set it on the root element, e.g. <html lang="en"> or <html lang="en-IN">.
Schema completeness
highAI search needs this
Why it matters. A schema type that exists but carries no properties is not structured data — it is an empty envelope. Organization without sameAs cannot resolve you to an entity; Article without author or datePublished loses the two signals answer engines weigh most.
What to do. Fill the missing properties. For Organization, sameAs matters more than the rest combined — list every profile you genuinely control.
Heading structure
mediumAI search needs this
Why it matters. Extractors use the h1 to decide what a page is about before reading the body, and the heading tree to decide which section answers which question. No h1, or several competing ones, leaves the subject ambiguous.
What to do. One h1 per page stating the page's subject, then h2s for each real section. Do not use headings for visual sizing.
Response time
mediumBarely affects AI search
Why it matters. Crawlers work to a budget. A slow origin means fewer of your pages get fetched per visit, and a very slow one means requests time out entirely and the page is simply never read. Measured here as time to first byte on a single request from this server, which is what a crawler experiences — not Core Web Vitals, which describe what a browser does after the bytes arrive and need field data this scan does not collect.
What to do. Cache HTML at the edge, compress responses, and keep server-rendered pages under about a second to first byte.
Redirect chain
mediumBarely affects AI search
Why it matters. Every hop loses a little signal, and some crawlers stop following after a few. Chains usually accumulate accidentally — http to https, then non-www to www, then a trailing-slash rule.
What to do. Collapse the chain so the first request lands on the final URL in one hop.
Trailing slash
mediumBarely affects AI search
Why it matters. If /page and /page/ both return 200, that is the same content on two URLs. Signals split between them and neither accumulates fully.
What to do. Pick one form and 301 the other, then make canonical tags and the sitemap agree.
When it is not scored. Trailing-slash variants do not duplicate. Nothing to do.
JavaScript dependence
highAI search needs this
Why it matters. The one distinction this report used to collapse. Googlebot executes JavaScript; GPTBot, ClaudeBot, PerplexityBot and every other citation crawler documented today do not — they read the bytes off the wire and stop. So a client-rendered page is usually indexed by Google, on a delay and with some risk, and is simply blank to every answer engine. Reporting that single state as one verdict was the largest honest gap in this tool: it told a search audience their page was broken when Google handles it, and let an AI audience assume "Google sees it" meant they were fine.
What to do. Server-render or pre-render the content that matters — the text, the headings, the structured data. Frameworks that ship a hydration payload already have the content on the server; switching the route to SSR or SSG usually costs a config flag, not a rewrite. Where that is genuinely impossible, publish the same content at a static URL and reference it from the page.
Mixed content
highAI search needs this
Why it matters. A subresource fetched over http:// from an https:// page. Browsers block the active kind outright — the stylesheet never applies, the script never runs — while the page still returns 200 with a valid certificate. Every check in this tool passes, the HTML is fine, and the page renders unstyled or half-functional to real visitors. It is invisible to any head-tag check because the tags are all correct.
What to do. Change the URLs to https:// (almost every host now serves both), or make them protocol-relative by dropping the scheme entirely. Add "Content-Security-Policy: upgrade-insecure-requests" as a backstop so anything you miss is rewritten rather than blocked.
When it is not scored. The page is not served over HTTPS, so there is no mixed-content rule to break. Not scored.
Mobile rendering
highAI search needs this
Why it matters. Google has indexed the mobile version of every site since 2023 — the desktop page is not what gets ranked, and for most sites is not what gets crawled either. A missing or fixed-width viewport means the page is judged as it renders on a phone, which is scaled down to about a third of its intended size. Disabling zoom is a separate matter: it is a WCAG 1.4.4 failure and almost always a leftover from a 2015 template rather than a decision anyone made.
What to do. Set <meta name="viewport" content="width=device-width, initial-scale=1"> and nothing else — drop user-scalable and maximum-scale entirely. Then find whatever is pinned wider than the viewport; a single element forces horizontal scroll on the whole document.
Page weight & blocking
mediumBarely affects AI search
Why it matters. Crawlers work to a byte budget as well as a time one, and every render-blocking resource in <head> sits between the request and the first thing a visitor can read. This is not Core Web Vitals — LCP, INP and CLS describe what a browser does after the bytes arrive and need field data this scan does not collect — but it is the input those metrics are mostly made of, and unlike them it is readable from the source.
What to do. Defer or async every script that is not needed for the first paint, and move the rest below the fold. Load non-critical CSS with media="print" and flip it in onload. Inline only what the first screen genuinely needs — inlined bytes cannot be cached separately from the HTML, so a large critical-CSS block is paid on every page view forever.
Image delivery
mediumBarely affects AI search
Why it matters. Three properties, each with a measurable cost. Format decides bytes — AVIF and WebP run 25–50% smaller than the equivalent JPEG, on every request, forever. Explicit width and height decide layout stability: without them the browser cannot reserve the box, so the page reflows as each image lands, which is exactly what CLS measures. loading="lazy" decides whether images below the fold compete with the hero for the first paint — and marking the hero itself lazy delays the largest paint the page has.
What to do. Serve WebP or AVIF with the original as a <picture> fallback. Put width and height back on every <img> — CSS still controls the display size, the attributes only give the browser the aspect ratio to reserve. Add loading="lazy" below the fold and make sure the hero image is not one of them.
When it is not scored. No <img> elements found on the pages checked, so there is nothing to weigh. Not scored.
On-page subject
highAI search needs this
Why it matters. A page states what it is about in four places: the URL slug, the title, the h1 and the opening text. When those disagree, nothing downstream can resolve it — the engine picks, and a retriever embeds whichever passage it reached first. This is not a claim about what you rank for, which needs Search Console and is not knowable from a crawl. It is the narrower and more fixable question of whether the page makes one claim or several.
What to do. Pick the subject, then state it in all four. The slug is the one to get right first because it is the only one that needs a redirect to change later. The opening sentence matters most for citation: it is the passage a retriever embeds, so it should restate the subject rather than set the scene.
Core Web Vitals
mediumBarely affects AI search
Why it matters. The only figures in this report that are not measured here. Largest Contentful Paint, Interaction to Next Paint and Cumulative Layout Shift are what real Chrome users experienced on real connections over the last twenty-eight days, aggregated across every visit — no scan can produce them, and PageSpeed Insights does not measure them either, it reads them from this same dataset. They are a confirmed and small ranking input, they are what Search Console reports against, and they have no bearing at all on whether an answer engine can read the page: a crawler that never paints does not care how long painting took.
What to do. Read the p75 against the distribution beside it — a p75 of 2.4s hides that a quarter of visits were over four seconds, and the quarter is who complains. Then use the critical path and layout stability checks on this report to find the cause, because those are measured from your markup and say which change to make. Field data tells you whether the change worked; it never tells you what to change.
When it is not scored. Google has no field data for this site, which is the normal answer for anything small or new — CrUX only reports an origin once it has enough traffic to anonymise. Not scored.
Critical path
highBarely affects AI search
Why it matters. What a browser has to finish before it can paint anything, measured rather than estimated: the HTML, then every render-blocking stylesheet and parser-blocking script in <head>, then whatever those reference in turn. The depth matters more than the size, and depth is the thing a byte count cannot see — a 40 KB stylesheet that imports a 12 KB stylesheet that pulls two fonts is four sequential round trips before a single character is legible, and it loses to a 300 KB stylesheet that references nothing. This is lab measurement from one machine on one connection, so it is a floor rather than a prediction, and it is not Core Web Vitals: LCP, INP and CLS come from real Chrome users over twenty-eight days and cannot be produced by any scan, this one included.
What to do. Shorten the chain before you shrink the files. Remove @import entirely — it turns one round trip into two, and a build step can inline the same CSS for nothing. Give every @font-face a font-display:swap so text renders immediately in a fallback instead of waiting. Move scripts out of <head> or mark them defer. Then, and only then, worry about bytes.
Layout stability
mediumBarely affects AI search
Why it matters. What moves under the reader after the page has started rendering. Every cause of it is visible in the source: an image with no width and height leaves the browser guessing how tall it will be, so everything below jumps when it lands; an @font-face with no font-display holds text invisible and then reflows into it; an embed with no dimensions collapses to nothing and then expands. This is the input to Cumulative Layout Shift rather than the metric — the score itself is measured on real visitors, and what is listed here is the markup that causes it.
What to do. Put width and height back on every image, or set aspect-ratio in CSS — either reserves the box, and CSS still controls the displayed size. Add font-display:swap to every @font-face. Give embeds an explicit height or an aspect-ratio wrapper. None of these is a rewrite; all of them are template edits.
When it is not scored. Nothing in the markup reserves space badly. Not scored.
Competing pages
mediumAI search needs this
Why it matters. Two pages making the same claim. Not the same finding as a duplicate title — that is exact-match and already reported above; this is "Best Running Shoes for Men" against "Men's Running Shoes — Best of 2026", which no string comparison finds and which competes for one position just as hard. Neither page can hold it outright, so the engine chooses, usually not the one you would have chosen, and the links and citations that should have accumulated on one URL are split across two.
What to do. Decide which URL owns the subject. Merge the weaker page's unique content into it, 301 the weaker URL to the stronger, and re-point the internal links. Where both genuinely need to exist, narrow one of them until the two claims stop overlapping — different intent, different title, different h1.
Caching & validators
mediumBarely affects AI search
Why it matters. A crawler that cannot tell whether a page changed has to download it again to find out. ETag and Last-Modified let it ask instead, and a 304 costs a fraction of a full fetch — which across a large site is the difference between your whole catalogue being re-read each visit and only the part that moved. Cache-Control on HTML is the other half: no-store on every page tells every intermediary to keep nothing.
What to do. Emit an ETag or a Last-Modified header on HTML responses and honour If-None-Match / If-Modified-Since with a 304. Most frameworks and CDNs do this once switched on. Keep Cache-Control on HTML short rather than absent — s-maxage with stale-while-revalidate is the usual shape.
Entity assets crawlable
highAI search needs this
Why it matters. Declaring a logo and a share image is only half the job — the crawler still has to be allowed to fetch them. A robots.txt Disallow covering the directory they live in makes both invisible, and every other check still passes because the tags themselves are present and the file returns 200 to a browser. Organization without a fetchable logo does not resolve to a knowledge-graph entity, and a blocked og:image means no card renders anywhere your link is shared.
What to do. Either move the image out of the disallowed directory, or add an Allow rule above the Disallow that exempts it — "Allow: /assets/images/" ahead of "Disallow: /assets/". Under RFC 9309 the longest matching rule wins, so the more specific Allow takes precedence.
When it is not scored. No og:image or Organization.logo declared, so there is nothing to block. Not scored.
Rating backed by page
highAI search needs this
Why it matters. Google's structured-data policy requires a rating in markup to be visible on the same page, and self-serving ratings without visible reviews are the most common cause of a manual action against structured data. Answer engines discount them for the same reason. A rating that appears only inside JSON-LD reads as fabricated whether or not it is, and the risk is not that the rating is ignored — it is that the whole structured-data block is.
What to do. Either render the rating and the reviews behind it in visible page content, or remove aggregateRating from the markup. Do not mark up a rating you cannot show.
When it is not scored. No aggregateRating or Review markup, so there is nothing to substantiate. Not scored.
Listed URLs resolve
highAI search needs this
Why it matters. Your sitemap is the one place you state, unprompted, which URLs you want indexed. A dead entry spends crawl budget to reach an error page, and enough of them cost the whole file credibility for the URLs that are real. The usual cause is listing pages before building them — a plan committed to the sitemap and then not finished.
What to do. Either build the pages or remove the lines. Do not leave a URL claimed: an unbuilt page listed in the sitemap is strictly worse than one that was never mentioned. Generate the file from routes that exist rather than maintaining it by hand.
Share image
mediumBarely affects AI search
Why it matters. Controls what people see when your link is shared, and several AI interfaces now read Open Graph to build the preview card beside a citation. Without one the preview is blank or badly auto-scraped.
What to do. Create a 1200×630 image and reference it in og:image using an absolute URL — relative paths fail on most scrapers.
Canonical URL
criticalAI search needs this
Why it matters. Tells engines which URL is the real one when the same content is reachable several ways — with and without www, trailing slash, tracking parameters, print views. Without it your ranking signals split across duplicates and none of the copies rank properly.
What to do. Add a self-referencing <link rel="canonical"> with an absolute URL to every page.
Title tag
criticalAI search needs this
Why it matters. The strongest on-page relevance signal you control, and the line a person actually reads in results. Answer engines also use it to decide what a page is about before reading the body.
What to do. Write a unique, specific title per page, ideally under 60 characters so it is not truncated.
Meta description
highAI search needs this
Why it matters. Does not affect ranking directly, but it is frequently the first text an answer engine extracts from your page. Leading with a direct answer here rather than a marketing tagline hands extractors something immediately quotable. Length is part of it: past roughly 160 characters the tail is truncated and written for nobody, and under about 70 the description is routinely discarded and rewritten from page text — which wastes the one place you state the page's answer in your own words.
What to do. Write 120–160 characters that answer the page's core question in the first sentence.
Meta robots
criticalAI search needs this
Why it matters. A noindex directive removes the page from search entirely. When it appears unintentionally it is almost always left over from a staging deploy — and it is one of the most common causes of a site's traffic disappearing overnight with no other symptom.
What to do. Remove noindex from production pages. Check your CMS and framework env config, not just the template.
Snippet & preview directives
criticalAI search needs this
Why it matters. Being indexed and being quotable are two different permissions, and only one of them is what this report is about. "nosnippet" — and its numeric spelling "max-snippet:0" — leaves a page in the index and forbids any text being shown from it, which removes it from AI Overviews, from ChatGPT's retrieval through Bing and from every other answer built by showing a passage. Every indexing check on this report passes while it is set, because indexing is not what it refuses. It is usually inherited from a licensing or paywall template and applied far wider than anybody intended.
What to do. Remove "nosnippet" and "max-snippet:0" from any page you want quoted, and set "max-snippet:-1" to state that there is no limit. Check the header as well as the tag — a CDN rule setting X-Robots-Tag will not show up in your templates. Keep the restriction only where withholding the text is a deliberate decision.
When it is not scored. No snippet or preview directives are set, which is the permissive default — engines may quote from this page.
Open Graph tags
mediumBarely affects AI search
Why it matters. Controls the preview card everywhere your link travels — social, Slack, iMessage, and increasingly the citation chip in AI answers. Without them the preview is blank, which reads as low quality.
What to do. Add og:title, og:description, og:image and og:url to every page. Absolute URLs only.
hreflang
mediumNo effect on AI search
Why it matters. Tells engines which language version to serve which user. Only relevant for multi-locale sites — and incorrect hreflang is worse than none, because it actively misroutes users. Which is why counting the tags is not enough: a set naming invalid codes, repeating a locale, pointing every alternate at the same URL, or omitting its own self-reference is commonly discarded whole, and each of those states looks identical to a working set if you only count.
What to do. If you have multiple locales, add bidirectional hreflang links including a self-reference and an x-default. Every listed URL must carry the full set pointing back — return tags are not verified here, so check a couple by hand.
When it is not scored. Not present — only needed for multi-locale sites. Not scored.
Canonical target
criticalAI search needs this
Why it matters. A canonical tag is an instruction, not a hint: it names the URL that should be indexed instead of this one. Point it at a 404, a URL that itself redirects, or a staging domain left in a template, and you have told every engine to index something that does not exist — while the tag itself looks perfectly correct to any checker that only asks whether it is present. This is how a working page quietly leaves the index.
What to do. Fetch the URL your canonical names and confirm it returns 200 by itself. A page should normally name itself, spelled exactly as you want it indexed: same host, same scheme, same trailing-slash form. If it names another page, that is a decision to be indexed as a duplicate of it — make sure you meant it.
Viewport meta
mediumBarely affects AI search
Why it matters. Google indexes the mobile rendering of your site, not the desktop one. Without a viewport declaration a phone lays the page out at desktop width and scales the result down, which is the definition of not mobile-friendly. It is one line of HTML, so its absence is almost never a decision — it is a template that predates responsive design, or a tag lost in a migration.
What to do. Add <meta name="viewport" content="width=device-width, initial-scale=1"> to <head>. Leave out maximum-scale and user-scalable=no: they break pinch-zoom, which is an accessibility failure, and current browsers ignore them anyway.
Title & description uniqueness
highAI search needs this
Why it matters. A title is a per-page claim about what that page is. Emitted verbatim across a template it identifies the site instead, and engines are left with nothing to tell the pages apart — so they keep one and treat the rest as duplicates of it. Presence-only checking scores this perfect: every page has a title, and every title is the same.
What to do. Make the title and description functions of the page's own content rather than the site's. "<what this page is> — <brand>" for the title, and a one-sentence answer to that page's question for the description. If a CMS is generating them, fix the template once rather than each page.
Image alt text
mediumBarely affects AI search
Why it matters. Alt text is the only text an extractor ever gets from an image. Beyond the accessibility obligation, it is how a model learns that the screenshot on your pricing page is a pricing table, and it is what makes an image eligible to appear in image results at all. An <img> with no alt attribute is not decorative — it is unlabelled, and the difference is visible in the markup.
What to do. Give every meaningful image an alt attribute describing what it shows, not what the file is called. Purely decorative images take alt="" — explicitly empty, which tells a screen reader to skip it deliberately. Note that CSS background images carry no alt at all, so anything load-bearing belongs in an <img>.
Page-level schema
highAI search needs this
Why it matters. Organization and WebSite describe the site. They say nothing about any individual page, so markup can be flawless sitewide while every page an answer engine would actually cite — the article, the product, the service, the FAQ — is structurally anonymous. Page-level types carry the facts worth quoting, and they are what every rich result is built from.
What to do. Emit one type per template matching what the page is: Article or BlogPosting for posts, Product with a nested Offer for products, Service for service pages, FAQPage where you genuinely answer questions, Event, Recipe, HowTo or JobPosting where they fit. Match the visible content — marking a page as something it is not is a manual-action risk, not a shortcut.
JSON-LD
criticalAI search needs this
Why it matters. This is the machine-readable layer answer engines parse for facts about you. Prose can be misread or paraphrased wrongly; structured data cannot. It is the difference between a model inferring what you do and being told directly.
What to do. Add an application/ld+json block to <head>. Start with Organization and WebSite sitewide, then per-page types.
Organization schema
criticalAI search needs this
Why it matters. Establishes you as a single resolvable entity. The sameAs array — linking your socials, Crunchbase, LinkedIn and Wikidata — is how a model confirms that your brand mentioned in one source and another is the same company. Without it you fragment across the knowledge graph and every mention counts for less.
What to do. Add Organization with name, url, logo, foundingDate, address, and a thorough sameAs array. sameAs is the part that matters most.
WebSite schema
highAI search needs this
Why it matters. Names the site itself as an entity, and its potentialAction property can expose your internal search endpoint — one of the few ways an agent can query your content directly instead of crawling it.
What to do. Add WebSite with name, url, and a SearchAction pointing at your search URL template.
BreadcrumbList schema
mediumBarely affects AI search
Why it matters. Shows where a page sits in your hierarchy. Cheap to emit, and it helps engines understand your taxonomy rather than treating every page as an unrelated island.
What to do. Emit BreadcrumbList on every page below the homepage, matching your visible breadcrumb trail.
FAQPage schema
mediumAI search needs this
Why it matters. Google restricted the FAQ rich result to government and health sites in 2023, so most SEO guides now say skip it. For answer engines that advice is wrong — explicit question-to-answer pairing is exactly the structure they extract, and the markup is still parsed.
What to do. Add FAQPage where you genuinely have Q&A content. Do not fabricate questions to game it.
404 status code
highBarely affects AI search
Why it matters. When missing pages return HTTP 200, engines index thousands of near-identical empty pages, which dilutes your site's quality signals. It also means no tool — including this one — can reliably tell what genuinely exists on your site.
What to do. Return a real 404 or 410 status for unknown routes. On SPAs this needs explicit server config; the client-side router alone is not enough.
HTTPS redirect
highBarely affects AI search
Why it matters. Without a permanent redirect, http:// and https:// are two separate sites to a crawler, splitting your ranking signals between them. A temporary 302 is worse than useless here — it tells engines the move is provisional, so they keep indexing the insecure URL.
What to do. Redirect all HTTP traffic to HTTPS with a 301 or 308, and enable HSTS once you are confident.
Lab performance
mediumBarely affects AI search
Why it matters. Field data is the honest measure of performance and it is unavailable for most sites — CrUX only reports an origin once it has enough traffic to anonymise, so a small site gets nothing. A Lighthouse run always answers, and what it is good for is not the score but the audit list: which specific resources blocked rendering, what the largest element actually was, how much of the JavaScript went unused. Those are the things the markup-based estimate on this report can only model.
What to do. Work the opportunities in the order they are listed — they are sorted by the time each one costs. Ignore the score itself: it is one load on one emulated device and moves several points between runs on a page nobody touched. The audits are stable; the number is not.
When it is not scored. PageSpeed Insights was not run. Set PSI=1 to enable it — it uses the same CRUX_KEY, is free, and adds ten to thirty seconds to a scan.