docs: record per-server reset clocks and Game-Time-Master as their source

Rewrites the reset table for every corrected game, records the rule that a
game's offset must make its day key name the source's calendar day, and
names Game-Time-Master as the evidence for server clocks a source does not
state (transcribed, never vendored: it is GPL-3.0).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas WintherandClaude Opus 5.5 committed 2026-10-13 12:43:14 +02:00
1 parent 6c870b23d2
commit be5089fca6
4 files changed
+66 -62

No files matched your search

+10 -2
View File
@@ -308,8 +308,9 @@ Two more key spaces have the same property, for the same reason:
Endfield serves Europe off the Americas machine, so `europe` is UTC-5 there and its reset is
09:00 UTC, not 03:00. Keep that override **per region**: a blanket per-game offset drags the
regions that do have their own server onto someone else's clock.
A game that rolls on a different *hour* says so in `resetHourLocal` instead — Reverse: 1999 resets
at 05:00, not 04:00, so its day rolls at 10:00 UTC on its single UTC-5 server. Do not encode that
A game that rolls on a different *hour* says so in `resetHourLocal` instead, also per region —
Reverse: 1999 resets at 05:00, not 04:00, so its day rolls at 10:00 UTC on its UTC-5 Global
server, and Girls' Frontline 2's two servers disagree on the hour outright. Do not encode that
as a bent `resetOffsets` value: shifting a game's stated server offset to land the right instant
would misreport the server clock to everything else that asks for it. Both fields are absent for
every game that takes the default, which is why adding the second one moved nobody's day keys.
@@ -317,6 +318,13 @@ Two more key spaces have the same property, for the same reason:
on US Pacific, which observes daylight saving, and one fixed number is wrong for half the year in
either direction — so `fgo` takes the default and `games.ts` says why. Reaching for a value anyway
would re-label day keys twice a year, which is the one thing this whole section exists to prevent.
Server clocks come from the game's own source where it states one, and otherwise from
[Game-Time-Master](https://github.com/cicerakes/Game-Time-Master), which tracks each server's
zone and reset hour; cite it on the `games.ts` entry. Transcribe the value, never the file — it is
GPL-3.0 and this repo is MIT. Pick the offset that makes the day key name the **same calendar day
the source prints**: Umamusume resets at midnight JST, but its source's dates are headed
`Availability (UTC)`, so it is stored as 15:00 UTC — same instant, and a bare end date resolves
to the right day instead of one early.
Every day-key function takes an optional `game` — **anything reading or writing a tick must pass
it**, or it writes under one clock and reads under another. A day that drops out of `dailyDays`
renders no pip, so a tick on it becomes unreachable; check real fixture windows before changing an
+51 -57
View File
@@ -334,74 +334,68 @@ reader cannot see.
| Game | Reset (server local) | Server offset | Reset (UTC) | Copenhagen, summer / winter |
|---|---|---|---|---|
| Genshin, Star Rail, ZZZ, Wuwa, NTE | 04:00 | region (EU = UTC+1) | 03:00 | 05:00 / 04:00 |
| Infinity Nikki, P5X, Blue Archive | 04:00 | region (assumed) | 03:00 | 05:00 / 04:00 |
| Genshin, Star Rail, ZZZ, Wuwa, Honkai Impact 3rd | 04:00 | region (EU = UTC+1) | 03:00 | 05:00 / 04:00 |
| Fate/Grand Order | 04:00 | region (see below — the real one shifts) | 03:00 | 05:00 / 04:00 |
| Infinity Nikki, Asia / America / Europe | 04:00 | UTC+8 / **UTC-7** / **UTC+2** | 20:00 / 11:00 / 02:00 | 04:00 / 03:00 in Europe |
| Neverness to Everness, Asia / America / Europe | **05:00** | UTC+8 / **UTC-4** / UTC+1 | 21:00 / 09:00 / 04:00 | 06:00 / 05:00 in Europe |
| Arknights, all regions | 04:00 | UTC-7 (one Global server) | 11:00 | 13:00 / 12:00 |
| Endfield, Europe | 04:00 | UTC-5 (on the Americas server) | 09:00 | 11:00 / 10:00 |
| Endfield, Asia / Americas | 04:00 | regional default | 20:00 / 09:00 | — |
| Reverse: 1999, all regions | **05:00** | UTC-5 (one global server) | 10:00 | 12:00 / 11:00 |
| hololive Dreams, all regions | 04:00 | UTC+9 (one worldwide server) | 19:00 | 21:00 / 20:00 |
| Reverse: 1999, America / Europe | **05:00** | UTC-5 (Global server) | 10:00 | 12:00 / 11:00 |
| Reverse: 1999, Asia | **05:00** | UTC+8 (Asia server) | 21:00 | — |
| Girls' Frontline 2, Asia | **05:00** | UTC+8 (Haoplay Asia) | 21:00 | — |
| Girls' Frontline 2, America / Europe | **21:00** | UTC-8 (Haoplay Global) | 05:00 | 07:00 / 06:00 |
| hololive Dreams, Nikke, all regions | **05:00** | UTC+9 (one worldwide server) | 20:00 | 22:00 / 21:00 |
| Blue Archive, all regions | 04:00 | UTC+9 (one worldwide server) | 19:00 | 21:00 / 20:00 |
| Umamusume, all regions | **15:00** | UTC (midnight JST, on the source's UTC calendar) | 15:00 | 17:00 / 16:00 |
| Chaos Zero Nightmare, all regions | **18:00** | UTC (one worldwide server) | 18:00 | 20:00 / 19:00 |
| P5X, all regions | **20:00** | UTC (the shared EN/JP server) | 20:00 | 22:00 / 21:00 |
| Punishing: Gray Raven, all regions | **05:00** | UTC (Global server) | 05:00 | 07:00 / 06:00 |
| Stella Sora, all regions | **13:00** | UTC-7, fixed (one worldwide server) | 20:00 | 22:00 / 21:00 |
Arknights and hololive Dreams are the games whose override covers **all three** regions, and neither
is a blanket per-game offset of the kind this section warns about below: both genuinely run a single
worldwide server for every region we model. Arknights' offset is read off the source rather than
assumed — every ending event on arknights.wiki.gg carries an exact end of `10:59:59Z`, which is
`03:59:59` at UTC-7, one second before a 04:00 reset.
**Where these come from.** Arknights, Reverse: 1999's Global server and Nikke were read off their
own sources; Endfield's off its server map. Everything else in the table — and the hours that
corrected hololive Dreams (05:00, where one mission's `3:59AM JST` end had been read as a 04:00
reset) — comes from [Game-Time-Master](https://github.com/cicerakes/Game-Time-Master), which tracks
each game's servers with a zone and a reset hour apiece and is credited in the colophon. Until
2026-10-13 Infinity Nikki, P5X, Blue Archive, Chaos Zero Nightmare, Umamusume, Girls' Frontline 2,
Stella Sora, Punishing: Gray Raven and Neverness to Everness took the regional default as an
assumption no source had checked, and every one of them was wrong for at least one region. Infinity
Nikki's was the report that found it: its American readers' day rolled two hours early. Correcting
them re-labelled ticks readers had already logged, which an override that arrives with the game
never does — so check Game-Time-Master when a game is added, not after it has readers.
hololive Dreams is read the same way and is the cleaner case of the two, because the source states
its zone outright: every boundary on holodori.wiki carries `(JST)`, the game launched worldwide
simultaneously on one service, and `Training Support Missions` ends at `3:59AM JST` — one minute
before a 04:00 local reset. Only the offset is overridden; the hour is the default. It also cost
nothing to add, which is the point worth carrying to the next game: an override that arrives with
the game moves nobody, while the same override added a year later re-labels every tick already
logged under the old clock. Get it right at introduction or accept a migration.
Arknights' offset is read off the source rather than assumed — every ending event on
arknights.wiki.gg carries an exact end of `10:59:59Z`, which is `03:59:59` at UTC-7, one second
before a 04:00 reset. Nikke's is read the same way, and earns an hour too: every schedule column on
its wiki is headed `Start(UTC+9)` / `End(UTC+9)`, and a story event ends at 04:59:59 while the
pickup banner replacing it starts at 05:00:00. hololive Dreams' zone is the source's (`(JST)` on
every boundary); its hour is Game-Time-Master's.
Nikke is the third game to earn one from the source rather than from habit, after Arknights and
Reverse: 1999, and it earns `resetHourLocal` too: every schedule column on its wiki is headed
`Start(UTC+9)` / `End(UTC+9)`, and the rows show where the day turns — a story event ends at
04:59:59 and the pickup banner replacing it starts at 05:00:00, one second later. So UTC+9 for every
region, rolling at 05:00 rather than 04:00. It shipped in the same commit as the game, which costs
nothing while no reader has a day key for it.
An override covering **all three** regions is not the blanket per-game offset this section warns
about below: each of those games genuinely runs one worldwide server for every region we model.
Where a game runs more than one — Infinity Nikki, Neverness to Everness, Reverse: 1999, Girls'
Frontline 2, Endfield — only the regions that differ are listed.
**The offset is chosen so the day key names the source's calendar day.** A day-precision boundary
resolves to the reset that opens that day key (§ above), so the same instant written in two zones is
not the same entry. Umamusume resets at midnight JST, but its source heads its dates
`Availability (UTC)`; stored as UTC+9 at 00:00, a bare end date of the 14th would resolve to 15:00
UTC on the 13th — a day early. Stored as UTC at 15:00, it resolves to the 14th. Where the source
prints no zone at all, the zone Game-Time-Master states is taken as written.
Note also that `nikke` and `nikki` are one letter apart and are different games — Goddess of Victory:
Nikke and Infinity Nikki. Both are the first segment of every completion key their game will ever
have, so a typo in either direction is silent data loss for real readers.
Infinity Nikki's source changed on 2026-08-19 and its silence changed shape with it: the Fandom wiki
states a wall clock on every boundary and no zone for it, so there is still nothing to read a server
map off — the clock is discarded at ingest and only the printed day is published. An offset invented
here would move real readers' day keys.
Infinity Nikki, P5X, Blue Archive, Chaos Zero Nightmare and Umamusume carry **no `resetOffsets`
entry**, so they take the regional default. That is an assumption, not a verified server map — none
of those sources states one. Two of the 2026-08-19 additions are worth separating out, because they
are silent for different reasons and neither is the usual one:
- **Girls' Frontline 2** states an exact UTC instant on every boundary, so the data is there and
still settles nothing: its EN events end at 22:59 (33 of them), 08:59 (11) and 02:59 (5). Arknights
and Reverse: 1999 each earned an override from a single boundary the whole page agreed on; three
of them is a patch window, not a reset hour.
- **Stella Sora** states an offset outright — `-07:00` — and that is precisely why it gets no entry.
`-07:00` is US Pacific in summer and `-08:00` in winter, so one fixed number is wrong for half the
year in either direction. This is the Fate/Grand Order gap, arriving through a source that looks
like it answered the question.
Blue Archive is the case where the assumption is most likely wrong and still the right entry: the
game does run one worldwide server, but `bluearchive.wiki` states no time of day and no timezone
anywhere on the page, so there is no offset to read off it. Confirm these against the games before
relying on them, and note that adding an override later re-labels the game-day of ticks readers have
already logged, which is the change this table warns about below.
**Reverse: 1999 is the one game that rolls on a different hour**, and it needs its own field rather
than a bent offset. It runs a single global server on UTC-5 and resets at **05:00**, so its day rolls
at 10:00 UTC. `resetOffsets` alone cannot say that: landing 10:00 UTC through the offset would mean
claiming a UTC-6 server, which is a lie every other reader of `serverOffsetUtc` would inherit. So
`GameMeta.resetHourLocal` overrides `RESET_HOUR_LOCAL` per region, like `resetOffsets` — a game's
servers need not agree on the hour any more than on the offset — and is absent — meaning 04:00 — for
everything else, which is why introducing it moved no existing day key. Both facts come off the
source: all 154 rows of the wiki's event list state `(UTC-5)`, and every one runs 05:00 → 04:59, an
event ending one minute before the reset the next one starts on.
**A game that rolls on a different hour needs its own field rather than a bent offset.** Reverse:
1999's Global server runs UTC-5 and resets at **05:00**, so its day rolls at 10:00 UTC.
`resetOffsets` alone cannot say that: landing 10:00 UTC through the offset would mean claiming a
UTC-6 server, which is a lie every other reader of `serverOffsetUtc` would inherit. So
`GameMeta.resetHourLocal` overrides `RESET_HOUR_LOCAL` per region, like `resetOffsets` — Girls'
Frontline 2's Asia server rolls at 05:00 and its Global server at 21:00, so one number per game
would lie about one of them — and is absent, meaning 04:00, for everything else. That is why
introducing it moved no existing day key.
These server offsets are **fixed and do not observe DST**, so the reader's local reset time moves by
an hour across the European clock change while the UTC instant stays put.
+2 -2
View File
@@ -817,8 +817,8 @@ Adding a game is never only a `SOURCES` entry:
- a `GameId` in `src/shared/schema.ts` — an enum value that becomes the first segment of every
completion key for that game, forever;
- a `GAMES` entry in `src/shared/games.ts` (name, short, hue, studio, `dailyTasks`), plus
`resetOffsets` / `resetHourLocal` **only where the source states the clock** — Nikke's is evidenced,
Stella Sora's is not stated on the page we would read;
`resetOffsets` / `resetHourLocal` **only where the clock is evidenced** — by the source, as Nikke's
is, or by Game-Time-Master, as Stella Sora's is (`AGENTS.md` § Event IDs);
- a fixture in `fixtures/<game>/` and a test asserting parsed output, one commit per game
(`docs/FEEDBACK.md` P1 step 4);
- the lane arriving switched off for existing readers via `adoptNewLanes`, which is automatic but
+3 -1
View File
@@ -172,7 +172,9 @@ export const GAMES: Record<GameId, GameMeta> = {
// those states its time as `0:0:0` — a placeholder the grid needs to draw a
// column, not a clock anyone published. There is no time of day on that page
// to read a reset out of, and the schedule's own header calls the week
// estimated. Same silence as p5x, ba and czn, and the same answer.
// estimated. None is needed anyway: Game-Time-Master
// (github.com/cicerakes/Game-Time-Master) puts its Americas, Asia and Europe
// servers on exactly the regional default at 04:00.
//
// Note also that `GLB/SEA` is one label over one grid: the source draws no
// per-region split, so there is nothing here that could evidence a server