.changelog/2730.md
CoreOptionsScope enum (.perCore / .perGame(md5:displayName:)) to express which storage key tier is active in CoreOptionsViewModel.CoreOptionsViewModel gains a primary init(md5:displayName:) / setGame(md5:displayName:) API plus PVGame convenience wrappers. All reads and writes are internally routed through the per-game key when an MD5 is set. No UI call sites are wired in this PR — this change provides the foundation that follow-up PRs will build on.CoreOptionsViewModel.hasPerGameOverride(for:) returns true when a per-game override key exists for the given option (groundwork for a future "overridden" badge in the options UI).CoreOptionsViewModel.resetToDefault(option:) removes the per-game override in .perGame scope, or writes the declared default value in .perCore scope (with correct single-title handling for .multi options).