474143da81
Drop the injectable `topEdgePx` knob (one caller, one constant) so the threshold has a single home, and fold the two-branch tail of shouldAutoShowEarlier into one predicate. Comments keep the WHY: wheel is the only signal at a clamped scrollTop 0, and the gates name the states where scrollTop is near 0 without meaning "read earlier". Tests: collapse the 11-case matrix into one invariant test on the pure gate, and add a rendered-list test that mounts the real Thread against a transcript heavier than RENDER_BUDGET, escapes the bottom lock, wheels up at the clamped top and asserts more turn groups mount — while an upward wheel mid-transcript mounts none. Red on origin/main (28 groups stay 28), green with the fix.