feat(codes): mark a code dead once the owner confirms it in game

Game8 still lists Y1INABQB6DEX, 2BJ64QRZ7RT8 and PLDXIB886Y1S as active
Genshin codes after the game refused them. CODE_CHECKS records the
owner's in-game check; build-codes stamps the matching code confirmedDead,
and the Codes tab shows it expired: "Confirmed expired in game, 2026-10-20."

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas WintherandClaude Opus 5.5 committed 2026-10-20 03:34:52 +02:00
1 parent 7569aa6395
commit b8e8d44816
12 files changed
+178 -12

No files matched your search

+2 -1
View File
@@ -644,7 +644,8 @@ legend on the same baseline as "Next: …".
date-only expiry counts as passed only once that date has ended everywhere (12:00 UTC the next
day). Settings → Your games marks a followed game with "N new codes" until its Codes tab is opened
(`codeSeen`); codes already expired or redeemed are not counted. Games the reader does not follow
get no marker.
get no marker. A code the owner confirmed dead in game (2026-10-20) is expired whatever the source
says, and reads "Confirmed expired in game, YYYY-MM-DD." in place of its expiry.
- **The tour (2026-10-18, owner).** Every reader takes it once before using the app: new readers
straight after setup, returning readers on their first visit, and readers who saw the earlier tour
once more. The order is the owner's (2026-10-18): a welcome on its own over the dimmed Checklist,
+10
View File
@@ -694,3 +694,13 @@ so it shows the in-game route only.
**Refreshing.** These are game8 pages, so the CI caveat in AGENTS.md § Scraping conduct applies: if the
runner is refused, they refresh by hand like the event pages.
## Codes confirmed dead in game (2026-10-20)
A source can keep a dead code in its active table: on 2026-10-20 Game8 still listed three Genshin
codes the game refused. `CODE_CHECKS` (`src/shared/codeChecks.ts`) records each code the owner
tried and found dead, with the date. `scripts/build-codes.ts` runs `applyCodeChecks` after parsing,
which sets `confirmedDead` on the matching code (by its `["game","CODE"]` id) and returns the checks
that matched nothing; the build logs those so they can be pruned. Nothing else about the code
changes, and the check is never used to add a code. The field is optional, so `schemaVersion`
stays 1.