Why it matters
A component that re-renders when every prop is equal by value, with no state or context change, produced the same output for nothing. Usually the props are rebuilt each render (inline objects, arrays, arrow functions) or a parent re-renders the whole subtree. The check compares values, so treat each hit as a memo candidate to confirm, not proof.
How to fix it
Read changedByReference in the evidence: hoist constant objects out of render, wrap handlers in useCallback and derived values in useMemo, then memo() the component. Better still, move the state that changes down to the component that needs it, or enable the React Compiler.
Example
const rowStyle = { height: 60 }; // hoisted: same object every render
const onSelect = useCallback(() => pick(i), [i]);
<Row style={rowStyle} onSelect={onSelect} /> // with Row = memo(Row)References
More smoothness rules
void smooth reports 18 rules in this category. How the page feels after it loads: dropped frames during a scripted scroll, long animation frames, INP of real clicks, shifts after input, animated layout properties, idle rAF loops and reduced-motion handling.
reduced-motion-ignoredAnimations keep running with prefers-reduced-motionraf-loop-idlerequestAnimationFrame loop runs while idlescroll-timeline-no-fallbackContent is invisible without scroll-driven-animation supportmultiple-webgl-contextsMultiple WebGL contextsreact-commits-on-scrollReact re-renders while the page scrollsreact-render-stormOne React commit re-renders hundreds of componentsreact-idle-commitsReact keeps committing while the page is idlereact-no-namesReact component names are minified