- Section 6 _on_live_sample: buf.map() returns (ok, map_info) tuple;
accessing .size on the tuple caused AttributeError for every frame
(22 tracebacks in log). Fixed to unpack properly.
- Section 8 WARMUP raised from 5 to 30 frames (~1.25 s) so cold-DRM
DMA setup, network buffer fill, and lazy texture init all complete
before stats are recorded. Eliminates the 36ms first-upload spike
from post-warmup measurements.
- _stat() now shows mean / p95 / max so isolated spikes are visible
without inflating the headline figure.