INP = input delay + processing time + presentation delay. Most teams only optimize processing and miss that a long task is blocking the main thread before your handler even runs.
The wins, in order of impact for us: (1) break up long tasks and yield to the main thread; (2) defer non-critical third-party JS until after first interaction; (3) cut hydration cost on JS-heavy templates; (4) shrink very large DOMs to reduce presentation delay. Target <200ms at p75 in CrUX — and remember it's field data, so fix first, then wait ~28 days for the metric to catch up.