What was requested, refined with what was actually negotiated once 'live'.
Refinement currently covers Rate only — ResolveRequestedTracks carries the more
restrictive of the requested and supported rates. Every other field (Encoding,
UsageBasis, RequiresConsent, …) is the REQUESTED value passed through untouched, so do
not read one of those off a live track expecting the model's answer. Widen the refinement
in ResolveRequestedTracks before relying on another field here.
OptionalReasonWhy the track is in a terminal state it did not ask for ('denied', 'unsupported', an
error-driven 'ended'). Never swallowed — a track that fails silently looks to the host
exactly like a track nobody asked for.
Current lifecycle state.
Stable id for this track within the session, so state changes can be correlated.
A track as it exists on a live session: what was asked for, and where it actually got to.