feat: force re-auth when required scopes change
TestFlight users whose OAuth tokens were minted before a scope was
added to the client scope list don't have the new permissions, so
`getActorFavorites` (and any other newer-scoped endpoint) returns
403 and the UI silently lands in a broken state.
Capture the `scope` field from the OAuth token response and persist
it to Keychain alongside the access token, then at launch compare
the stored grant against a new `AuthManager.requiredScopes` constant
(extracted from the inline array in `login()`). If anything's
missing, log out and set `reauthReason` so `LoginView` can render
an explanatory banner above the handle input.
A versioned UserDefaults key (`scopeMigrationDone_v1`) guarantees
the migration runs at most once per install — even if a re-login
somehow returns another insufficient grant, we don't loop; the
user just lands on the regular error state instead. Bumping the
suffix is a one-line change next time we add a scope.
Also promotes `self.favoriteGalleries` in a logger autoclosure
inside `ProfileDetailViewModel.loadFavorites` to appease the
implicit-self warning.
authored by