Drop the startup deferral gate, its kill switch and the deferred loads:
they lowered renderer.ipcCallsToFirstCard but moved neither
spawnToFirstCardMs nor load->card beyond drift, and they grew
renderer.initialBytes. Keep the shared in-flight inventory read, inline
it in PlaylistsService with short property names, and copy the joiner's
result with structuredClone (the Electron renderer has it; the services
test setup polyfills it for jsdom).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Journey J1 / renderer.ipcCallsToFirstCard: 12 -> 7.
- PlaylistsService.getAllPlaylists() shares one in-flight SQLite read
between concurrent callers (the playlist effect and the XMLTV source
reconciliation at startup). Settled reads are never reused and every
SQLite write detaches the pending read.
- getM3uFavoriteChannels() stops re-reading the write-once IndexedDB ->
SQLite migration receipt once it has been seen.
- StartupDeferralService holds the download list, app update status and
the dashboard's recent items and favorites until one task after the
render that reveals the routed content (5 s safety timeout).
IPTVNATOR_DISABLE_STARTUP_DEFERRAL=1 is the kill switch.
- reconcileEpgSources and the two distinct migration-flag reads stay on
the critical path: the first is the #1548 revision fence, the second
are different keys, not duplicates.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>