# 120 Hz zero-jank campaign — hypothesis log Target: sltest (minimal 100-row grid, no textures) on the phone's Mali G715. Definition of ZERO JANK (measured from PRES mon= + VSYNC ftn= lines): 1. no display-slot skip: for consecutive presents, slot_index(n+1) == slot_index(n)+1 (100%) 2. no same-slot double: two presents never land in the same display slot 3. phase stable: present phase within its slot varies < 0.5 ms Test: 2x `input swipe 640 1900 640 900 4000` (slow drags) + fling, ~10 s. A "burst" = consecutive presents with gaps < 20 ms; evaluate inside bursts only. ## Hypotheses (order = priority) - H6 [sltest confound]: sltest FileLogger is blocking (flush per line) on the render path (PRES/STG/IT at ~240 lines/s). FIX: non-blocking drain-thread logger. TEST: rebuild, re-measure baseline. - H1: early waker misses edges (thread descheduled / nanosleep jitter) → render starts late (edge+5 late wake wins) → present phase bimodal. TEST: render-start phase histogram vs edges; early-wake hit rate. - H2: Skia render core variance → present phase jitter. TEST: VK SKD distribution in sltest (trivial scene, expect <1.5 ms). - H3: wgpu/Mali submit+present latency variance (CLR/SKF/ORD/PRE). TEST: VK PRE / CLR / SKF distributions in sltest. - H4: event-loop overhead (timers, change tracker, spin iterations) eats the slot budget. TEST: IT poll/timers/ev/fe distributions; iters/s during scroll. - H5: CPU scheduling of the UI thread (deschedule mid-slot, core migration, frequency). TEST: wall vs CPU split for the render window (vkprobe thread_cpu_ns). - H7 [method confound]: adb `input swipe` motion is bursty (~20-60 Hz) → grid movement itself is non-uniform regardless of render cadence. TEST: pointer-location overlay + user finger, later. ## Rules - One hypothesis per build; keep the change minimal; measure before/after with the identical test; record numbers here. - A hypothesis is RULED OUT only when the measurement it predicts is absent (not "the fix didn't help"). - Phone hygiene before each run: clean task (sz=1), ResumedActivity, dismiss 16KB dialog (sltest is debuggable), record log byte offsets. ## Results (append below)