Move the "all-time" constant out of GameCalendarService (concrete) into a new
static class GameCalendarPeriods. Consumers using IGameCalendarService no
longer have to reach through the concrete class to name the lifetime bucket.
Migrates 5 callsites (mission progress/assembler, admin, item purchase, tests).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
New config-driven service that replaces JstPeriod. All timestamps are UTC;
one config value (GameCalendarConfig.DailyResetUtcHour, default 0 = midnight
UTC) drives both ResetReady checks and DayKey/WeekKey/MonthKey bucket keys.
Because both derive from the same MostRecentBoundary helper, they can never
disagree.
Prod parity is a config flip: set DailyResetUtcHour=17 in GameConfigs to get
the 02:00 JST boundary. No JST-flavored math anywhere in the code.
JstPeriod callsite migration + deletion follow in subsequent commits.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>