ENGLISH·COURSE API
    Preparing search index...
    PlaybackPosition: z.infer<typeof PlaybackPosition>

    The playback position for a single lesson. seconds is non-negative and finite — NaN and Infinity are rejected at the boundary so adapters never persist nonsense values.

    The port (PlaybackPositionRepository) keeps its raw-primitive signature because the adapter callsites are 1:1 with localStorage.setItem. The value object exists to make the use case signature self-documenting and to validate inputs that flow through the use case boundary.