VitalSentinel
Inspector

Issues

How Inspector turns raw check data into a prioritized list of fixes - severities, categories, evidence, and recommendations.

The Issues panel is the user-facing payoff of every Inspector run. After all six checks settle, a rule engine walks the collected data and emits a prioritized list of findings - each with a severity, a category, the evidence we based it on, and a concrete recommendation.

This is not a passthrough of any single tool's audits. Inspector derives its own findings from CrUX field data, raw response headers, the SSL chain, WHOIS dates, the robots.txt parse tree, and the headless Chrome capture, then merges them into one consolidated view.

How It's Displayed

The Issues panel appears on every completed inspection. It opens with the count: Issues (24).

Three filter rows let you narrow the list:

  • Severity - All, Critical, Warning, Info, each with its own count
  • Category - dynamically generated from the categories that fired (e.g. SEO, SSL, CWV, Headers, Caching)

Each issue card shows:

  • A severity icon - red filled circle (critical), orange triangle (warning), blue info icon (info)
  • The title - short and action-oriented (e.g. "Largest Contentful Paint is poor", "SSL certificate expires in 12 days")
  • Severity and category badges
  • An estimated savings chip when available - e.g. "Save 340 KB" or "Save ~600 ms"
  • A description - one to three sentences explaining the finding
  • A recommendation - the concrete next step, marked with a lightbulb icon
  • An evidence block - the raw numbers we based the finding on, expandable on demand

Issues are sorted by severity descending, then by base deduction, then by estimated savings - the things that matter most are at the top.

Severities

SeverityMeaning
CriticalFundamental failure - the page is broken, insecure, or invisible to search engines
WarningSignificant problem - measurably harms users or search visibility
InfoMinor or advisory - best practice not followed but no immediate harm

Severity also caps how much a single issue can deduct from the Inspector Score: warnings are capped at 4 points each, info issues at 1.5 points each, and criticals can consume their full sub-pillar budget. See Inspector Score for the full deduction model.

Categories

Every issue is tagged with one of six categories:

CategoryWhat it covers
PerformanceSpeed, Core Web Vitals, lab vitals, page weight, code efficiency, main-thread health
SEOCrawlability, on-page fundamentals, JS rendering parity, structured data, rich results
SecuritySSL/TLS, security headers, mixed content, cookie hygiene, content security
InfrastructureCaching, compression, HTTP version, operational maturity (sourcemaps, manifest, service worker)
AvailabilityHTTP status, server response time, console errors, failed subresource requests
DomainWHOIS findings - advisory only, no score impact

Categories drive the filter pills at the top of the Issues panel and also map to the pillar breakdown on the score card.

Full Issue Catalog

The catalog below lists every issue Inspector can produce, grouped by sub-pillar to mirror the deduction model on the Inspector Score page. Each row is the title you'll see on the issue card in the Issues panel; the actual on-screen text often inlines specific numbers (e.g. "Largest Contentful Paint at 4820 ms").

An issue with multiple severity tiers is listed once per tier. Issues marked Fatal trigger the cross-pillar 0.85x score multiplier.

Performance - Core Web Vitals

IssueSeverityTrigger
LCP at p75 is poorCriticalCrUX p75 LCP > 4000 ms
LCP at p75 needs improvementWarningCrUX p75 LCP 2500-4000 ms
INP at p75 is poorCriticalCrUX p75 INP > 500 ms
INP at p75 needs improvementWarningCrUX p75 INP 200-500 ms
CLS at p75 is poorCriticalCrUX p75 CLS > 0.25
CLS at p75 needs improvementWarningCrUX p75 CLS 0.1-0.25
FCP is slow at p75WarningCrUX p75 FCP > 3000 ms
TTFB is slow at p75WarningCrUX p75 TTFB > 1800 ms
Mobile LCP is much slower than desktopWarningDesktop p75 LCP < 2000 ms but mobile p75 LCP > 4000 ms
No CrUX field data for this URLInfoURL has too little Chrome traffic for Google to publish field data
Largest Contentful Paint is slowCriticalLab LCP > 4000 ms
Largest Contentful Paint is slowWarningLab LCP 2500-4000 ms
First Contentful Paint is slowCriticalLab FCP > 3000 ms
First Contentful Paint is slowWarningLab FCP 1800-3000 ms
Cumulative Layout Shift is highCriticalLab CLS > 0.25
Cumulative Layout Shift is highWarningLab CLS 0.1-0.25
Simulated INP is slowCriticalSimulated INP > 500 ms
Simulated INP is slowWarningSimulated INP 200-500 ms
LCP has multiple contributing bottlenecksCriticalLCP breakdown shows multiple bottlenecks (> 4000 ms)
LCP has contributing bottlenecksWarningLCP breakdown shows bottlenecks (2500-4000 ms)
LCP element renders below the foldWarningLCP element is below the initial viewport
LCP element renders borderline below the foldInfoLCP element marginally below the initial viewport
Real users see much slower paints than the lab runInfoCrUX field LCP and Chrome lab metrics disagree noticeably

Performance - Page Weight & Assets

IssueSeverityTrigger
Page weight is highCriticalTotal page weight > 5 MB
Page weight is highWarningTotal page weight > 1.5 MB
Heavy JavaScript payloadCriticalTotal JS > 1500 KB
Heavy JavaScript payloadWarningTotal JS > 750 KB
Heavy CSS payloadWarningTotal CSS > 500 KB
Heavy CSS payloadInfoTotal CSS > 200 KB
Oversized imagesWarningIndividual images > 200 KB
Legacy-format imagesWarning5+ images in JPEG/PNG where AVIF/WebP would save > 25%
Legacy-format imagesInfo1-4 legacy-format images
Many HTTP requests on this pageCritical> 200 HTTP requests
Many HTTP requests on this pageWarning> 100 HTTP requests
Large DOMCriticalDOM > 3000 nodes or depth > 60
Large DOMWarningDOM > 1500 nodes or depth > 32
Heavy third-party payloadCriticalThird-party resources > 1500 KB
Heavy third-party payloadWarningThird-party resources > 250 KB
Many distinct origins contactedWarning20+ distinct origins contacted
Many web font files loadedWarning10+ font files
Many web font files loadedInfo6+ font files
Many JavaScript files loadedWarning50+ script elements (or 80+ for higher tier)
Many JavaScript files loadedInfo30+ script elements
Many iframes embedded on this pageWarningMany iframes embedded on the page
DOM dominated by structural wrapper elementsInfoLayoutObjects-to-DOM ratio < 30% on 500+ node pages

Performance - Code Efficiency

IssueSeverityTrigger
Unused JavaScript shipped to the browserCriticalUnused JavaScript > 500 KB
Unused JavaScript shipped to the browserWarningUnused JavaScript present
Unused CSS shipped to the browserWarningSignificant unused CSS
Duplicate JavaScript modules shippedCriticalDuplicate modules waste > 200 KB
Duplicate JavaScript modules shippedWarningDuplicate modules waste > 10 KB
Legacy / polyfill code shippedInfoLegacy polyfills or transpilation detected

Performance - Main Thread Health

IssueSeverityTrigger
Long tasks block the main threadCriticalTotal long-task time > 1000 ms or > 10 tasks
Long tasks block the main threadWarningLong tasks present (> 200 ms total)
Single script causes heavy main-thread blockingCriticalTop script blocking > 500 ms
Single script causes heavy main-thread blockingWarningTop script blocking > 100 ms
Render-blocking resources in <head>CriticalRender-blocking resources > 200 KB
Render-blocking resources in <head>WarningRender-blocking resources present
Layout thrashing detectedWarningForced synchronous layouts in trace
Third parties consume main-thread timeCriticalThird-party blocking > 500 ms
Third parties consume main-thread timeWarningThird-party blocking > 75 ms
Excessive style recalc / forced layoutsWarning> 500 style recalculations or > 200 forced layouts
window.load fires slowlyCriticalLoad event > 10 s
window.load fires slowlyWarningLoad event > 5 s
Slow web font loadingWarningFont download > 500 ms
JS heap grows during idleCriticalJS heap grows > 10 MB during idle
JS heap grows during idleWarningJS heap grows > 1 MB during idle
JS heap is heavily fragmentedInfoAllocated JS heap is 70%+ unused
High JavaScript heap usageCriticalJS heap usage critically high
High JavaScript heap usageWarningJS heap usage exceeds threshold
Same URL fetched more than onceWarningSame URL loaded 2+ times
Critical resources fetched at sub-optimal priorityWarningCritical resources missing priority hints
Preload / preconnect opportunities detectedWarningLate-discovered critical resources should use preload / preconnect

SEO - Crawlability

IssueSeverityTrigger
Page is set to noindexCritical (Fatal)Page has a noindex directive in meta or HTTP header
This URL is blocked by robots.txtCritical (Fatal)robots.txt disallows the URL for *
This URL is blocked specifically for GooglebotCritical (Fatal)robots.txt disallows the URL for Googlebot
robots.txt blocks a major search engineWarningBing, Yandex, Baidu, or DuckDuckGo blocked
Plain HTTP is not redirected to HTTPSCriticalhttp:// URL does not redirect to https://
Multiple redirects before reaching the final URLWarning3+ redirects before final URL
Redirects during page loadWarning5+ redirects in resource loading
Redirects during page loadInfo3+ redirects in resource loading
Robots directives disagree between meta tag and HTTP headerWarningX-Robots-Tag forces noindex while meta tag suggests indexable
Robots directives disagree between meta tag and HTTP headerInfoMeta-robots and X-Robots-Tag disagree on a minor directive
No robots.txt file foundInforobots.txt returns 404
robots.txt has no Disallow rulesInfoFile exists but contains no Disallow directives
All known AI crawlers are blockedInfoAll major AI crawlers (GPTBot, ClaudeBot, PerplexityBot, ...) blocked
No AI crawlers are blockedInfoNo AI crawlers in the blocked list

SEO - On-Page Fundamentals

IssueSeverityTrigger
Page has no <title> tagCriticalMissing title element
Title tag is outside the 20-70 character rangeWarningTitle length too short or too long
Page has no meta descriptionWarningMissing meta description
Meta description is outside the 50-170 character rangeInfoDescription length too short or too long
Page has no <h1> headingWarningZero H1 elements
Page has multiple <h1> headingsInfoMore than one H1 element
Page has no canonical linkWarningNo <link rel="canonical">
Canonical URL points to a different page than the one inspectedWarningCanonical mismatch
Page has no viewport meta tagWarningMissing <meta name="viewport">
<html> element has no lang attributeInfoMissing lang attribute
Heading levels skippedInfoHeading hierarchy jumps levels (e.g. H1 to H3)
Images missing alt textWarning50%+ images without alt text
Images missing alt textInfo20-50% images without alt text
Many links use generic anchor textInfo20%+ links use generic phrases ("click here", "read more")
External links lack rel="noopener"Info30%+ external links missing rel attribute
No favicon link declaredInfoNo <link rel="icon"> declared
Images without alt textCritical10+ images without alt text
Images without alt textWarningImages without alt text
Form fields without a labelWarningForm fields missing accessible labels
Links or buttons without an accessible nameWarning5+ links / buttons without accessible names
Links or buttons without an accessible nameInfoLinks / buttons without accessible names
Heading hierarchy skips levelsInfoHeading order violations

SEO - JS Rendering Parity

IssueSeverityTrigger
Robots directive changes after JavaScript runsCritical (Fatal)Robots directive differs between raw and rendered HTML
Rendered HTML has much more content than raw HTMLWarningRaw HTML contains < 1/5 of rendered text
Canonical URL differs between raw and rendered HTMLWarningCanonical changes after JavaScript
Page title changes after JavaScript runsWarning<title> rewritten by JavaScript
Most internal links only appear after JS runsWarningInternal links only present in rendered HTML
H1 heading differs between raw and rendered HTMLWarningH1 content changes after JavaScript
Structured data only appears after JS runsWarningJSON-LD injected by JavaScript

SEO - Rich Results

IssueSeverityTrigger
Content-rich page has no structured dataInfoWord-rich page without any JSON-LD
JSON-LD blocks fail to parseWarningInvalid JSON-LD detected
Structured data summaryInfoInformational summary, no deduction
Open Graph tags incompleteInfoMissing required og: tags (title, description, image)
No Twitter / X Card tagsInfoFalls back to Open Graph

Security - TLS/SSL

IssueSeverityTrigger
TLS certificate has expiredCritical (Fatal)Certificate past its expiry date
Certificate hostname doesn't match the URLCritical (Fatal)Certificate SAN does not cover the hostname
Deprecated TLS version negotiatedCriticalTLS 1.0 or 1.1 negotiated
Weak certificate signature algorithmCriticalSHA-1 or MD5 signature
Weak RSA key lengthCriticalRSA key < 2048 bits
TLS certificate expires soonCriticalCertificate expires within 14 days
TLS certificate expires soonWarningCertificate expires within 30 days
TLS certificate chain is incompleteWarningMissing intermediate certificates

Security - Security Headers

IssueSeverityTrigger
Security headers grade is lowCriticalSecurity headers grade F (< 40% present)
Security headers grade is lowWarningSecurity headers grade C/D (40-70% present)
Security headers grade is lowInfoSecurity headers grade B (70-90% present)
Missing HSTS headerWarningNo Strict-Transport-Security
Missing clickjacking protectionWarningNo X-Frame-Options, no CSP frame-ancestors
Missing Content-Security-PolicyInfoNo Content-Security-Policy header
Missing X-Content-Type-OptionsInfoNo X-Content-Type-Options: nosniff
Missing Referrer-PolicyInfoNo Referrer-Policy header
Missing Permissions-Policy headerInfoNo Permissions-Policy (Feature-Policy)
Server header reveals software versionInfoServer response header discloses version

Security - Content Security

IssueSeverityTrigger
Insecure (HTTP) sub-resources on an HTTPS pageCriticalMixed content detected
Content Security Policy weakened by unsafe directivesWarningCSP uses unsafe-inline, unsafe-eval, or wildcard sources
Third-party requests carry API keys in the URLInfoAPI keys visible in request URLs
IssueSeverityTrigger
Cookies use SameSite=None without SecureCriticalModern browsers reject these cookies
Cookies missing Secure flagWarningCookies set without the Secure attribute
Cookies missing SameSite attributeWarningCookies set without an explicit SameSite value
Oversized cookiesInfoCookies larger than 4 KB
Many cookies set on this pageCritical50+ cookies
Many cookies set on this pageWarning25+ cookies

Infrastructure - Caching

IssueSeverityTrigger
Static asset served without Cache-ControlWarningMain document or asset missing Cache-Control
Static asset cached for less than a dayInfomax-age < 86400
Static assets with missing or weak Cache-ControlWarningMultiple subresources without proper caching
Static assets with weak Cache-ControlWarningStatic resources with inadequate cache policy
Few responses have long-lived cache headersInfo< 10% of cacheable requests served from cache

Infrastructure - Compression

IssueSeverityTrigger
Text response served without compressionWarningMain document missing gzip / br / zstd
Text resources served without compressionCriticalSubresources > 500 KB total uncompressed text
Text resources served without compressionWarningUncompressed text subresources present
Text responses missing compressionWarningRecoverable bytes from compressing text resources

Infrastructure - Protocol & Transport

IssueSeverityTrigger
Main document served over an old HTTP versionInfoMain document over HTTP/1.x (uptime probe)
Main document served over HTTP/1.1InfoMain document over HTTP/1.1 (Chrome probe)
Slow DNS lookupsInfoDNS lookup > 200 ms
Slow TLS handshakesInfoTLS handshake > 300 ms
Slow server response (TTFB)CriticalTTFB > 1500 ms
Slow server response (TTFB)WarningTTFB > 600 ms
Large request header blockWarningRequest-header block unreasonably large
Large response headersWarningResponse-header block >= 8 KB
Excessive response headersCriticalResponse-header block >= 16 KB
Unreasonably large response headersCriticalResponse-header block >= 32 KB

Infrastructure - Operational Maturity

IssueSeverityTrigger
Production scripts ship without sourcemap referencesInfoSourcemap references absent
No Web App Manifest linked from this pageInfoNo <link rel="manifest">
Web App Manifest failed to fetch or parseWarningManifest linked but unreachable / invalid
Web App Manifest missing required fieldsInfoManifest incomplete for installability
No Service Worker registered on this originInfoNo active Service Worker
Deprecated browser APIs used by this pageInfoDevTools deprecation warnings
Legacy JavaScript libraries detectedInfoOld jQuery, Prototype, MooTools, etc.
Deprecation warnings in the browser consoleInfoConsole deprecation messages
Content-Type header does not match the response bodyWarningWrong Content-Type for served HTML

Availability - HTTP Status

IssueSeverityTrigger
Server returned an HTTP 5xx statusCritical (Fatal)5xx response from origin
Page not found (404)Critical (Fatal)404 from origin
Client error HTTP responseWarningOther 4xx (403, 410, 429, ...)
Network requests failed during loadWarningOne or more subresource requests failed
JavaScript errors thrown during loadCritical5+ console errors / uncaught exceptions
JavaScript errors thrown during loadWarning1-4 console errors

Availability - Response Time

IssueSeverityTrigger
Slow Time to First ByteWarningServer TTFB > 1500 ms
Slow total response timeWarningTotal response time > 5 s

Domain Health (advisory, no score deduction)

IssueSeverityTrigger
Domain registration expires soonCriticalDomain expires within 30 days
Domain registration expires soonWarningDomain expires within 90 days
Domain registered recentlyInfoDomain registered < 30 days ago
WHOIS privacy protection is enabledInfoRegistrant details hidden via privacy service
WHOIS lookup not available for this TLDInfoccTLD or restricted TLD without public WHOIS

The catalog evolves as new detection signals are added to the engine. Every issue above corresponds to a registered detector in app.services.inspector.rules (Python) or in the chrome-inspector Go analyzer; detectors without a registered rule are not surfaced.

Deduplication

When multiple rules fire on the same root cause from different angles, Inspector merges them into a single issue. The most common case is a metric that appears in both field and lab data:

  • LCP - crux.lcp.* (field) and chrome.lcp.slow (lab) coalesce. The highest-severity finding wins, and the surviving issue cites both data sources in its evidence.
  • CLS, INP, FCP - same coalescing pattern across CrUX and Chrome.
  • Image alt coverage - the page-wide SEO scan and the Chrome accessibility audit coalesce.
  • Heading hierarchy - same as above.
  • HTTP version - the uptime probe and the Chrome network log coalesce.
  • Subresource compression - multiple Chrome rules covering the same uncompressed-text problem coalesce.
  • Security headers - the composite Chrome grade and individual headers.* rules from the uptime check coalesce. Whichever approach deducts more is kept; the other is dropped.

The result: a slow LCP shows up once with both real-user and lab numbers in the evidence - not twice with the same finding from two angles.

TTFB is intentionally not coalesced across CrUX, Chrome, and Uptime. A consistently slow server should be confirmed from every vantage point - and the deduction is bounded so the total impact stays proportionate.

Evidence and Recommendations

Every issue carries an evidence block - the raw numbers that triggered the rule. For an LCP poor finding, evidence might include:

{ "p75_ms": 4820, "good_threshold_ms": 2500, "poor_threshold_ms": 4000, "form_factor": "PHONE" }

The recommendation is the human guidance - what to actually do. Recommendations are written for engineers, not auditors: they point to the specific subsystem to investigate (e.g. "Largest Contentful Paint is rendering below the fold - verify your hero image isn't being lazily loaded").

On this page