.changelog/3080.md
PVThinLibretroFrontend) — RetroArch-free libretro frontend in PVCoreBridgeRetro using only libretro.h. Loads cores via dlopen/dlsym, handles the full libretro environment callback API (including GLES3 hw-render via IOSurface-backed FBO), and provides all 5 core callbacks without any RetroArch internal headers. Foundation for running libretro buildbot dylibs without the full RetroArch binary.PVDynamicLibretroCoreScanner) — PVCoreLoader class that scans Frameworks/ at runtime for *.libretro.framework and bare .dylib cores not already registered via static plists. Discovered cores are synthesised as EmulatorCoreInfoPlist sub-cores of a PVThinLibretro virtual parent. Includes CoreLoader.mergeDiscoveredLibretroCores(into:) integration point. Guarded by the dynamicLibretroScanner feature flag (off by default).dynamicLibretroScanner feature flag — Added PVFeature.dynamicLibretroScanner to PVFeatureFlags (all build types, disabled by default; enable via the PVFeatureFlags debug-override UI or UserDefaults.standard.set(true, forKey: "dynamicLibretroScanner")).RETRO_ENVIRONMENT_GET_VFS_INTERFACE, RETRO_ENVIRONMENT_GET_LED_INTERFACE, RETRO_ENVIRONMENT_GET_CURRENT_SOFTWARE_FRAMEBUFFER, and RETRO_ENVIRONMENT_GET_MIDI_INTERFACE to PVLibRetroCore.m; all return false with descriptive log messages so cores fall back gracefully.LibretroSystemInfo layout struct — LibretroSystemInfo (previously private in LibretroMetadataReader.swift) is now internal with default field values, so PVDynamicLibretroCoreScanner reuses it instead of maintaining a duplicate RawLibretroSystemInfo. Eliminates layout drift risk between the two readers.