phase
WHEN this delivery happened, relative to the cue's own startTime: "parsed" when the carrying segment was demuxed (early — 20-30s on hls.js against the live NFL feed, which is what gives a break its preload window), "presented" when the playhead has just reached it (frame-accurate — p90 under 10ms, ADS-285).
ExoPlayer's onMetadata delivers at PRESENTATION, so this adapter's cues are "presented"; hls.js delivers at parse. One event name has meant both things depending on the platform, and that asymmetry is why native has no preload window at all (ADS-286: 6ms of lead measured on an S11).
null means unknown and MUST keep today's behaviour: mislabelling parsed as presented would fire every break 20-30s early, which is the one failure this distinction exists to prevent.