forked from unom/punktfunk
WP1 continued — the Linux/Windows session client joins Android on the shared PresentIntervals. Apple is the remaining leg. The metric lives on LatchClock because that is where the on-glass stamps and the learned panel grid it quantises against already meet, so no new plumbing and no second source of truth about the grid. Every stamp is scored, including the sub-millisecond pairs the grid learner deliberately skips: two presents inside one refresh is not a grid step, but it is very much a cadence event. The period is taken seeded-or-learned rather than learned-only, so cadence is scored from the first window instead of waiting for the learner to converge. Judder also becomes a trigger for the 1 Hz presenter line. That line only fired on drops, gate holds or the debug env var — and a cadence defect produces none of those: no drops, no holds, healthy percentiles, visibly broken motion. Without this a desktop stream could judder for an entire session and never emit a line, which is the same blind spot the metric exists to close. One honest asymmetry, recorded in the code: these stamps are CLOCK_REALTIME (this module's domain), so a wall-clock step would forge a hitch that never happened. It lands in the stall/disordered counters rather than the judder ratio, which is part of why that split is worth having. Android feeds the metric a raw monotonic stamp and has no such exposure. Gates: cargo check + clippy --all-targets on pf-presenter clean; punktfunk-core clippy -D warnings clean; fmt clean.