AetherEngine 5.18.2
Patch release: two user-seek races on the VOD loopback-HLS path, both reported with a precise code-level analysis by @YangHanqing in #178.
Fixed
Seeks during the initial load window are no longer silently dropped (#178, mechanism 1)
seek(to:) no-oped for the whole state == .loading window (probe, native load, readiness gate; several seconds on slow sources) with no queuing or replay. Hosts that render the seek target optimistically watched playback snap back to the pre-seek position once the pending target cleared.
The latest loading-window seek is now stashed, published optimistically to the scrub clock, and replayed through the normal seek(to:) path once the session settles into a playable state; clamp and live-DVR guards re-run at replay against the then-known session. This covers autostart paths too, where readiness fires while state is still .loading (the pre-existing #127 replay could never trigger there). A load that dies discards the stash. The .loading spinner hold is unchanged.
An ordinary seek no longer lands on a stale recovery position while an authoritative restart is pending (#178, mechanism 2)
Once a seek-deadline reconcile parked an authoritative recovery re-anchor in the restart coalescer's pending slot (#79), a subsequent user seek's segment-driven producer restart was dropped outright. The provider's bookkeeping already recorded the fire, so its own "AVPlayer re-requests" recovery was suppressed by the same-index guard, and the producer stayed anchored on the recovery position (~13 s off the requested target in the field log) until the seek deadline reconciled the clock back to the rendered position.
A new user seek now releases the superseded authoritative claim before the host seek is dispatched, so its restart takes the pending slot normally. The #79 protection is unchanged for the case it was built for: without a fresh user seek, stale burst-tail scrubs are still blocked from clobbering an authoritative re-anchor, and live-reopen anchors are untouched.
Tests
Issue178LoadingSeekStashTests (stash, latest-wins, replay-on-settle, discard-on-death, resolution policy matrix) and extended RestartCoalescerTests (supersede semantics; all pre-existing #35/#79 expectations unchanged). Full suite: 933 tests green.
No public API changes.