feat: the redesigned Event Clock

The new reader app replaces the old UI: Checklist with a rail (focus
pills, Next to expire, today's dailies, pinned routines), Timeline in a
new and a classic look, Routines, Archive and a Settings area, in a
Structured (default) and a Relaxed interface. It follows the approved
Round 6 B and Round 7 mockups, corrected screen by screen with the owner.

Reader data moves to a v2 store (gacha-tracker:v2:*). Existing v1 data
is migrated on first load, a recovery copy is written first, and the v1
keys are never removed, so a rollback finds them unchanged. Redeem codes
for Genshin arrive as their own feed.

Also: live's urgency ramp, editable per theme; completion and
section-complete fireworks; a returning-user tour; the design mockups,
specs, plans, reviews and handoff record.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
Lucas Winther
2026-10-18 01:55:16 +02:00
co-authored by Claude Opus 5.5
parent ddd9673f86
commit 50c6e91b00
284 changed files with 45100 additions and 1628 deletions
+19
View File
@@ -640,3 +640,22 @@ fixture is the regression test proving the parser still handles the previous for
guessing, impossible calendar dates are rejected, ranges crossing New Year roll the start year back,
and abbreviated months parse. `test/merge.test.ts` covers cross-source agreement, disagreement, and
rerun disambiguation. These are the last line of defense before a wrong date reaches a user.
## Redeem codes source (2026-10-16)
Genshin codes use https://game8.co/games/Genshin-Impact/archives/304759, separately from events.
One descriptive-agent robots request and one page request returned HTTP 200 during capture; no
access workaround or repeated source fetch was used. The raw page and capture metadata are pinned
as fixtures/genshin/game8-codes-2026-10-16.*, with ten independently counted current codes. The
parser reads actual code inputs/current reward rows and excludes expired programme sections; a
future-dated programme fixture variant verifies that still-current programmes are admitted.
Unannounced expiry remains null. A printed calendar date is expiresOn, never a fabricated exact
expiresAt instant. Attribution is retained on every code.
src/ingest/codes/registry.ts registers a count-only refresh source. The existing runner shares robots,
six-hour floors, conditional requests, per-host spacing and snapshot gates across event/code sources.
Event adapter schemas are unchanged. scripts/build-codes.ts builds data/codes.v1.json offline from
snapshots or fixtures and preserves observation timestamps in snapshots/codes-first-seen.json.
Code newness is per game; redemption is per local game/server account and never clears newness by
itself. No code row is synthesized into the event feed.