docs/wiki/save-state-version-mismatches.md
Provenance records the emulator core version that was used when each save state was created. When you update the app (or switch cores), the version string stored with a save state may no longer match the currently installed core.
A mismatch does not necessarily mean the save state is broken — many minor core updates are forwards/backwards compatible. Provenance warns you so you can decide whether to load it.
Provenance stores the core version used when each save state was created. When you try to load a save state, the app compares:
If these differ, you may see a warning before loading.
Emulator cores are actively developed. Updates can:
Save states are not designed to be portable across core versions. They are a snapshot of internal state, not a standardized format.
Provenance shows a confirmation dialog before loading:
Save State Version Mismatch
This save state was created with <Core Name> version X.Y.Z, but the currently installed version is A.B.C. The save state may be incompatible.
[Load Anyway] · [Cancel]
If you see a version mismatch warning:
If you choose to load a save state despite a version mismatch:
When in doubt, create a new save state with the updated core.
Not in general. The libretro API treats save states as opaque binary blobs — there is no standard version header or migration hook that Provenance can use to transform a save state from one core version to another.
Some cores (e.g. Mednafen-based cores) embed their own version information and handle migration internally, but this is transparent to Provenance and is not guaranteed across major version bumps.
A future enhancement (tracked in #2951)
would require a retro_get_state_version() API addition to libretro and
per-core migration callbacks.
createdWithCoreVersion in Realm (stored in CloudKit as coreVersion from PVSaveState.createdWithCoreVersion).core.projectVersion before load.