Skill 145 · Signals Scout Web Vitals
Subchapter 145.2
references/remediation.mdMarkdown6 KBView on GitHub
Read this when you’re about to write a finding. Every reported web vitals finding must carry two things this file gives you: a metric-specific cause hypothesis (why the value is likely what it is) and a concrete remediation (what would move it). Pick the cause that fits the evidence you have — don’t list all of them; name the one the data points at and say what you’d check to confirm.
The p75 value tells you that a page is slow, not why. Before settling on a cause,
slice the same $web_vitals data:
$device_type — mobile p75 is routinely 2–3× desktop (slower CPUs, networks). A
page that’s “poor” only because its mobile share grew is a composition story, not a code
regression. Report the split.$geoip_country_code — a page slow only for distant regions points at
origin/CDN distance, not page code.$browser — a regression isolated to one engine is often a polyfill, a CSS
feature, or a JS API doing extra work there.onset-correlation.md has that procedure; “stepped at
{time} UTC, matching {change}, confirmed by the variant split” is the most actionable
framing there is, and it’s usually reachable.A regression that holds across every device/region/browser slice is a real shared cause (a deploy, a CDN/edge change, a global third-party tag). A “regression” that lives in one slice is usually a population mix change — say so and lower the severity.
Time until the largest above-the-fold element (usually the hero image, a big heading, or a video poster) renders. Bands: good ≤ 2500ms, poor > 4000ms.
Common causes
<head> delaying first paint.Remediations
<link rel="preload"> the LCP image (or fetchpriority="high"); never loading="lazy"
the hero.async non-critical JS; inline critical CSS; remove render-blocking resources.preconnect to the origin serving the LCP asset.Responsiveness across the whole visit — the worst (near-worst) delay between a user interaction and the next visual update. Bands: good ≤ 200ms, poor > 500ms.
Common causes
Remediations
scheduler.yield() /
setTimeout); move heavy compute to a Web Worker.How much visible content shifts unexpectedly during the visit. Unitless score; bands: good ≤ 0.1, poor > 0.25.
Common causes
width/height (or aspect-ratio), so the
page reflows when they load.Remediations
aspect-ratio on media; reserve space for ad/embed slots.font-display: optional/swap plus preloading fonts to minimize swap reflow.transform animations (compositor-only) rather than ones that change layout.Time until the first text or image paints — the precursor to LCP. Bands: good ≤ 1800ms, poor > 3000ms. A poor FCP usually drags LCP with it; fix FCP first.
Common causes
Remediations
preconnect/dns-prefetch to critical third-party origins.The bands are defined for p75 (the Core Web Vitals field standard) — anchor findings
there. The product UI defaults to p90, and p99 is the tail. If p90/p99 is poor while
p75 is good, that’s a slow-tail story (a subset of slow sessions), not a page-wide
regression — worth a pattern: note, rarely a standalone finding.