Split out of #459, which is closed.
Measured at 6.81.0 (c7e7adb5) on 2026-09-12, posted today (09-16); upstream is 7.1.0, eleven releases past it (6.82.0 → 7.1.0). Every engine region below is opened at both tags and says which moved. Its own issue rather than a #459 comment: #459 is closed completed and its residual #535 is the opposite direction — a label claiming more than the output carries, where this is a route claiming less after a pick. It borrows #459's vocabulary and nothing else.
The measurement
Office2, Apple TV 4K gen 3, tvOS 26.6 (23L773), Match Content on. At this pin our wrapper stopped asserting panelIsInHDRMode where the engine owns criteria ([Aether] panelIsInHDRMode not asserted …, 12:00:45.619), so the option is false and your readout decides. 3 from Hell (source probe: hevc 3840x2160 23.976fps hdr10 … audio=[1:truehd,2:dca,3:ac3,4:ac3]), resumed at 300 s, one audio pick to stream id 2 at +25 s (DEV-E6-hdr-after-audioswitch-shipped.log). Prefixes trimmed, URLs and unrelated fields elided (…); the rest verbatim.
09-12 12:00:46.158 [DisplayCriteria] panel readout before apply: currentEDR=1.00 potentialEDR=1.00 headroomLimit=unspecified switching=no matching=on hdrEligible=yes provenHDR=no
09-12 12:00:46.158 [DisplayCriteria] SET: format=hdr10 codec=hvc1 rate=23.976 extensions=HDR
09-12 12:00:46.587 [DisplayCriteria] panel proven to engage HDR (headroom 1.20); later sessions trust an accepted HDR write even after the headroom decays
09-12 12:00:48.259 [HLSVideoEngine] serving on …/master.m3u8 (… panelIsHDR=true displaySupportsHDR=true … useMaster=true videoRange=pq … audioLang=eng)
09-12 12:00:49.231 [NativeAVPlayerHost] #1 item videoFormat=hdr10 subType='hvc1' transfer=SMPTE_ST_2084_PQ rate=0.000
Then the pick, 25 s after started (route loopback, 4.2s):
09-12 12:01:14.763 [Aether] audio switch → id 2 (engine pipeline restart)
09-12 12:01:15.320 [HLSVideoEngine] serving on …/media.m3u8 (… panelIsHDR=false displaySupportsHDR=true … useMaster=false videoRange=pq … audioLang=eng)
09-12 12:01:16.205 [NativeAVPlayerHost] #2 item videoFormat=hdr10 subType='hvc1' transfer=SMPTE_ST_2084_PQ rate=0.000
Same panel, same title, still PQ on both sides, and panelIsHDR has gone true → false between them — that field is the panelIsInHDRMode the load was handed (6.81.0 HLSVideoEngine.swift:1972, 7.1.0 :1987, the emit line byte-identical), so the log is printing the gate's own input. The control is the same build, not an inference: JF_AETHER_PANEL_HDR=assert, our DEBUG rig restoring the pre-E-6 unconditional assertion for one launch, and both loads then serve the master (…-audioswitch-assert.log, useMaster=true at 12:02:18.675 and 12:02:45.492). Under our own previous panelIsInHDRMode: true the reload passed the same true and the drop could not happen, so this surfaced only when we stopped claiming — code-read, no audio-pick leg ran at the old pin.
Where it is, at both tags
|
fresh load |
reloadWithAudioOverride |
| 6.81.0 |
panelIsInHDRMode: panelHDRAfterHandshake — AetherEngine.swift:4307 |
panelIsInHDRMode: loadedOptions.panelIsInHDRMode — AetherEngine+Loading.swift:2209 |
| 7.1.0 |
panelIsInHDRMode: routingPanelHDR — AetherEngine.swift:4467 |
panelIsInHDRMode: loadedOptions.panelIsInHDRMode — AetherEngine+Loading.swift:2234 |
The reload line is byte-identical across the span while the load term widened. grep -n 'loadNative(' returns three hits at each tag: the two call sites whose argument lists those lines sit in (6.81.0 AetherEngine.swift:4297 and +Loading.swift:2195, 7.1.0 :4457 and :2220) and the definition (+Loading.swift:674 at both). The reload never re-enters the handshake block — no panelHDRAfterHandshake, no currentPanelIsHDR() anywhere inside reloadWithAudioOverride at either tag — so neither the readout nor the latch is consulted.
routingPanelHDR is sessionRoutesAsHDRPanel(panelPresentsHDR: panelHDRAfterHandshake, attemptWhenUnproven: options.attemptsHDRMasterOnUnprovenPanel && !options.isLive, …) (AetherEngine.swift:4122-4126), body if panelPresentsHDR { return true }; return attemptWhenUnproven && displayEligibleForHDR && !panelRefusedHDRMaster (AetherEngine+Probe.swift:738-739) — 7.1.0 only; neither name exists at 6.81.0. Since attemptsHDRMasterOnUnprovenPanel defaults true, from 6.82.0 an unproven-but-eligible VOD panel is served the master on the first load and drops to media on the audio-pick reload, so the population this bites got bigger, not smaller — code-read at the tag. Everything here above 6.81.0 is read, not run: our bench is pinned at 6.81.0, and the attempt fires only on a panel that has not proved itself, which on the evidence above is not this box — so Office2 could not exercise it even at 7.1.0.
The raw option is the master gate one layer down — let panelReadyForHDR = panelIsInHDRMode || (builtInPanelEngagesOnDemand && displaySupportsHDR) … return sourceIsHDR && panelReadyForHDR (7.1.0 HLSVideoEngine.swift:2049-2066, byte-identical to 6.81.0 :2034-2051) — and its only escape, builtInPanelEngagesOnDemand, is #if os(iOS) || os(macOS) (6.81.0 :1982-1988, 7.1.0 :1997-2003), so a tvOS reload has nothing else to answer from. Issue459MasterFirstRoutingTests.swift, added in this span and absent at 6.81.0, has nine @Test cases, none of which mounts an engine: seven call sessionRoutesAsHDRPanel directly, one covers the rejection-code set, one the published label. The file contains no reload, no loadNative and no panelIsInHDRMode.
What it costs
Your own list of what media-direct costs, written under the new term: "not the picture but the manifest: the SUBTITLES rendition, the AUDIO rendition that is the only place AVFoundation reads an HLS language from, and SUPPLEMENTAL-CODECS" (api.md, attemptsHDRMasterOnUnprovenPanel — 7.1.0; no such entry at 6.81.0). A media-direct reload spends the same thing with no refusal to justify it — the master's body is in that slice (12:00:48.277):
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aud",NAME="English",LANGUAGE="eng",DEFAULT=YES,AUTOSELECT=YES
The second load asks for media.m3u8 directly and fetches no master at all (zero master.m3u8 and zero EXT-X-MEDIA lines in the slice after the pick), so on our stack what goes is the AUDIO rendition's language — your own AE#458 — at exactly the moment a viewer has just made an audio choice. The audioLang=eng on both serving lines is servedAudioLanguage, what the engine knows, not a tag in the manifest it served second. What AVFoundation then reports for that track we did not read back: unmeasured. Subtitles are painter-drawn on this rung, so the WebVTT half the same gate comment names (#15, 6.81.0 HLSVideoEngine.swift:2041 / 7.1.0 :2056) costs us nothing; it would cost a host reading native renditions. This title is HDR10 (dvVariant=none), so SUPPLEMENTAL-CODECS is not in our slice at all; a P8.1 would lose it here too — code-read: it is written as an EXT-X-STREAM-INF attribute (HLSLocalServer.swift:1375, the same line at both tags), which exists only in a master.
Your own note on hasAudioRendition ends "Routing-safety still decides: an unready HDR panel is a -11848 rejection, and a language is not worth one." (6.81.0 HLSVideoEngine.swift:2007-2014, byte-identical at 7.1.0 :2022-2029.) The reload's routing-safety is computed from a value that never met the handshake, so it declines the language without the rejection risk that would have justified declining it.
Suggestion, not a request
If the reload carried the same routing answer the fresh load computed, this closes with no second readout. That answer is a let local to load and is stored nowhere, so the reload has nothing to read it back from — panelHDRAfterHandshake at 6.81.0 (AetherEngine.swift:3972), and at 7.1.0 routingPanelHDR (:4122), which has exactly three references in the file: declared, compared against the label, passed to loadNative. An audio pick has no other branch: selectAudioTrack always routes through reloadWithAudioOverride (6.81.0 AetherEngine.swift:5948, 7.1.0 :6184). selectTitle and reloadAtCurrentPosition reach that same call only on a custom source; their URL branches re-run the handshake through load (6.81.0 :6005 and :4594, 7.1.0 :6241 and :4754).
Your −11868
"One correction to what I wrote yesterday: the code is -11868, not -11848. Both are in isDisplayRejectionCode so the net caught it either way…" — read as scoped to that run rather than as a counter-reading, and not something our shipped path meets: this panel proves itself on both legs above (panel proven to engage HDR (headroom 1.20)), the master is accepted, and there is no rejection to read. We do hold one -11868 master rejection on Office2, and it is not the shipped path: AVPlayer rejected the master (code=-11868); falling back to media playlist (no CC/subtitle renditions) at 302.30s, under JF_AETHER_CRITERIA=matcher — where our own assertion is in force — on the in-place reload after an audio-route death, whose serving line read displaySupportsHDR=false (DEV-E6-hdr-after-matcher.log, 11:58:29). The engine still names -11848 for this cost at both tags (6.81.0 AetherEngine.swift:3969, 7.1.0 :4112).
Split out of #459, which is closed.
Measured at 6.81.0 (
c7e7adb5) on 2026-09-12, posted today (09-16); upstream is 7.1.0, eleven releases past it (6.82.0 → 7.1.0). Every engine region below is opened at both tags and says which moved. Its own issue rather than a #459 comment: #459 is closedcompletedand its residual #535 is the opposite direction — a label claiming more than the output carries, where this is a route claiming less after a pick. It borrows #459's vocabulary and nothing else.The measurement
Office2, Apple TV 4K gen 3, tvOS 26.6 (23L773), Match Content on. At this pin our wrapper stopped asserting
panelIsInHDRModewhere the engine owns criteria ([Aether] panelIsInHDRMode not asserted …, 12:00:45.619), so the option isfalseand your readout decides.3 from Hell(source probe: hevc 3840x2160 23.976fps hdr10 … audio=[1:truehd,2:dca,3:ac3,4:ac3]), resumed at 300 s, one audio pick to stream id 2 at +25 s (DEV-E6-hdr-after-audioswitch-shipped.log). Prefixes trimmed, URLs and unrelated fields elided (…); the rest verbatim.Then the pick, 25 s after
started (route loopback, 4.2s):Same panel, same title, still PQ on both sides, and
panelIsHDRhas gone true → false between them — that field is thepanelIsInHDRModethe load was handed (6.81.0HLSVideoEngine.swift:1972, 7.1.0:1987, the emit line byte-identical), so the log is printing the gate's own input. The control is the same build, not an inference:JF_AETHER_PANEL_HDR=assert, our DEBUG rig restoring the pre-E-6 unconditional assertion for one launch, and both loads then serve the master (…-audioswitch-assert.log,useMaster=trueat 12:02:18.675 and 12:02:45.492). Under our own previouspanelIsInHDRMode: truethe reload passed the sametrueand the drop could not happen, so this surfaced only when we stopped claiming — code-read, no audio-pick leg ran at the old pin.Where it is, at both tags
reloadWithAudioOverridepanelIsInHDRMode: panelHDRAfterHandshake—AetherEngine.swift:4307panelIsInHDRMode: loadedOptions.panelIsInHDRMode—AetherEngine+Loading.swift:2209panelIsInHDRMode: routingPanelHDR—AetherEngine.swift:4467panelIsInHDRMode: loadedOptions.panelIsInHDRMode—AetherEngine+Loading.swift:2234The reload line is byte-identical across the span while the load term widened.
grep -n 'loadNative('returns three hits at each tag: the two call sites whose argument lists those lines sit in (6.81.0AetherEngine.swift:4297and+Loading.swift:2195, 7.1.0:4457and:2220) and the definition (+Loading.swift:674at both). The reload never re-enters the handshake block — nopanelHDRAfterHandshake, nocurrentPanelIsHDR()anywhere insidereloadWithAudioOverrideat either tag — so neither the readout nor the latch is consulted.routingPanelHDRissessionRoutesAsHDRPanel(panelPresentsHDR: panelHDRAfterHandshake, attemptWhenUnproven: options.attemptsHDRMasterOnUnprovenPanel && !options.isLive, …)(AetherEngine.swift:4122-4126), bodyif panelPresentsHDR { return true }; return attemptWhenUnproven && displayEligibleForHDR && !panelRefusedHDRMaster(AetherEngine+Probe.swift:738-739) — 7.1.0 only; neither name exists at 6.81.0. SinceattemptsHDRMasterOnUnprovenPaneldefaultstrue, from 6.82.0 an unproven-but-eligible VOD panel is served the master on the first load and drops to media on the audio-pick reload, so the population this bites got bigger, not smaller — code-read at the tag. Everything here above 6.81.0 is read, not run: our bench is pinned at 6.81.0, and the attempt fires only on a panel that has not proved itself, which on the evidence above is not this box — so Office2 could not exercise it even at 7.1.0.The raw option is the master gate one layer down —
let panelReadyForHDR = panelIsInHDRMode || (builtInPanelEngagesOnDemand && displaySupportsHDR)…return sourceIsHDR && panelReadyForHDR(7.1.0HLSVideoEngine.swift:2049-2066, byte-identical to 6.81.0:2034-2051) — and its only escape,builtInPanelEngagesOnDemand, is#if os(iOS) || os(macOS)(6.81.0:1982-1988, 7.1.0:1997-2003), so a tvOS reload has nothing else to answer from.Issue459MasterFirstRoutingTests.swift, added in this span and absent at 6.81.0, has nine@Testcases, none of which mounts an engine: seven callsessionRoutesAsHDRPaneldirectly, one covers the rejection-code set, one the published label. The file contains noreload, noloadNativeand nopanelIsInHDRMode.What it costs
Your own list of what media-direct costs, written under the new term: "not the picture but the manifest: the SUBTITLES rendition, the AUDIO rendition that is the only place AVFoundation reads an HLS language from, and SUPPLEMENTAL-CODECS" (
api.md,attemptsHDRMasterOnUnprovenPanel— 7.1.0; no such entry at 6.81.0). A media-direct reload spends the same thing with no refusal to justify it — the master's body is in that slice (12:00:48.277):The second load asks for
media.m3u8directly and fetches no master at all (zeromaster.m3u8and zeroEXT-X-MEDIAlines in the slice after the pick), so on our stack what goes is the AUDIO rendition's language — your own AE#458 — at exactly the moment a viewer has just made an audio choice. TheaudioLang=engon both serving lines isservedAudioLanguage, what the engine knows, not a tag in the manifest it served second. What AVFoundation then reports for that track we did not read back: unmeasured. Subtitles are painter-drawn on this rung, so the WebVTT half the same gate comment names (#15, 6.81.0HLSVideoEngine.swift:2041/ 7.1.0:2056) costs us nothing; it would cost a host reading native renditions. This title is HDR10 (dvVariant=none), so SUPPLEMENTAL-CODECS is not in our slice at all; a P8.1 would lose it here too — code-read: it is written as anEXT-X-STREAM-INFattribute (HLSLocalServer.swift:1375, the same line at both tags), which exists only in a master.Your own note on
hasAudioRenditionends "Routing-safety still decides: an unready HDR panel is a -11848 rejection, and a language is not worth one." (6.81.0HLSVideoEngine.swift:2007-2014, byte-identical at 7.1.0:2022-2029.) The reload's routing-safety is computed from a value that never met the handshake, so it declines the language without the rejection risk that would have justified declining it.Suggestion, not a request
If the reload carried the same routing answer the fresh load computed, this closes with no second readout. That answer is a
letlocal toloadand is stored nowhere, so the reload has nothing to read it back from —panelHDRAfterHandshakeat 6.81.0 (AetherEngine.swift:3972), and at 7.1.0routingPanelHDR(:4122), which has exactly three references in the file: declared, compared against the label, passed toloadNative. An audio pick has no other branch:selectAudioTrackalways routes throughreloadWithAudioOverride(6.81.0AetherEngine.swift:5948, 7.1.0:6184).selectTitleandreloadAtCurrentPositionreach that same call only on a custom source; their URL branches re-run the handshake throughload(6.81.0:6005and:4594, 7.1.0:6241and:4754).Your −11868
"One correction to what I wrote yesterday: the code is -11868, not -11848. Both are in
isDisplayRejectionCodeso the net caught it either way…" — read as scoped to that run rather than as a counter-reading, and not something our shipped path meets: this panel proves itself on both legs above (panel proven to engage HDR (headroom 1.20)), the master is accepted, and there is no rejection to read. We do hold one-11868master rejection on Office2, and it is not the shipped path:AVPlayer rejected the master (code=-11868); falling back to media playlist (no CC/subtitle renditions) at 302.30s, underJF_AETHER_CRITERIA=matcher— where our own assertion is in force — on the in-place reload after an audio-route death, whose serving line readdisplaySupportsHDR=false(DEV-E6-hdr-after-matcher.log, 11:58:29). The engine still names-11848for this cost at both tags (6.81.0AetherEngine.swift:3969, 7.1.0:4112).