Record the Honkai Impact 3rd source and what its dates are worth

SOURCES.md § 13 declined this game's only known source partly because every
boundary was a week bucket, and we have now built a different source with that
same objection standing. Leaving that contradiction unwritten is how a later
pass rediscovers the trade the expensive way, so § 14 records the decision
itself: the conduct evidence, which three of § 13's four objections arustats
answers, which one it does not, and that any source stating a date per event
retires it. § 13 is marked superseded rather than rewritten — its verdict on
marisaimpact.com still stands and was not re-tested.

AGENTS.md gets the same warning where a parser author will hit it, because the
estimate is not visible from the code: the numbers look like every other
day-precision date in the project.

Also corrects the counts this game made false — nine parsers, twenty sources,
nineteen games. The "stopped working at eighteen" passages are left alone: they
date the settings-panel redesign, and bumping them would falsify the history
rather than update a count.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
Lucas Winther
2026-08-27 01:28:05 +02:00
co-authored by Claude Opus 5
parent c272d9e93d
commit 7864ba6241
5 changed files with 132 additions and 13 deletions
+1 -1
View File
@@ -10,7 +10,7 @@ import { z } from "zod";
export const GameId = z.enum([
"genshin", "hsr", "zzz", "wuwa", "arknights", "endfield", "nte", "nikki", "p5x", "r1999",
"ba", "fgo", "holodori", "gfl2", "stellasora", "czn", "uma", "nikke",
"ba", "fgo", "holodori", "gfl2", "stellasora", "czn", "uma", "nikke", "hi3",
]);
export const EventType = z.enum([
+7
View File
@@ -56,11 +56,18 @@ Consequences worth internalising:
| `holodoriwiki` | holodori.wiki's rendered `/wiki/Events``Current Events` and `Past Events` wikitables over `Event \| Type \| Start Date \| End Date` | hololive Dreams |
| `iopwiki` | iopwiki.com's `gf-table event-period` tables — `Title \| Period (start/end) \| Server \| Type \| Comment`, one table per event and one row per server | Girls' Frontline 2 |
| `stellasorawiki` | stellasora.miraheze.org's front-page `Current Banners` module — `<time datetime>` pairs inside `stellasora-home-banner` blocks | Stella Sora |
| `arustats` | arustats.com's Next.js `__NEXT_DATA__` blob — a per-version week grid, with events carrying `startWeek`/`endWeek` **integers** rather than dates. **Estimated boundaries** — see AGENTS.md § Honkai Impact 3rd | Honkai Impact 3rd |
`wikigg` is the better shape by a distance: it emits ISO timestamps with one timer per server
region, so its events carry exact precision and real `regionEnds`. Prefer a source like that over a
prose wiki when both exist, and give it a higher `priority`.
`arustats` is the outlier on precision rather than on markup, and it is the only source in the
project that does not publish a date per event: its page schedules by week bucket and labels the grid
`ESTIMATED WEEK`, so every boundary it emits is an estimate. It carries `confidence: 0.4` for that
reason, against the 0.850.95 everything else earns, which is also what makes `mergeEvents` prefer
any real source that replaces it. Read AGENTS.md § Honkai Impact 3rd before changing it.
`fandom` is the only parser whose body is not HTML: it reads an `action=parse` JSON envelope and
takes the rendered wikitext out of `parse.text`. That is not a preference — the rendered page is
behind a Cloudflare challenge and the API is the surface the wiki's `robots.txt` allows, so the
+2 -2
View File
@@ -59,7 +59,7 @@ have a source — this table is the launch scope, not a roster to keep in sync.
Adding a game must require no change to `GachaEvent` — only a `GameId` entry, its `games.ts`
metadata, and a source registration. That is the test of whether the data model is right, and it has
held: the eighteen games here have cost the event schema nothing. Per-game *metadata* does occasionally
held: the nineteen games here have cost the event schema nothing. Per-game *metadata* does occasionally
grow (Reverse: 1999 needed `resetHourLocal` for a 05:00 reset), which is a different file and moves
no stored key. A game may have several sources; see `docs/INGESTION.md` § Three layers.
@@ -90,7 +90,7 @@ default `"game"` — the board every existing reader already has). Merged, the o
`endingSoonestFirst`, the same comparator behind the list's "Ending soonest" (F2), so the two views
cannot mean different things by the same words and an unannounced end still sorts behind every dated
one rather than claiming a place in the queue. Merged there is also no lane heading to say whose
event a bar is, and hue alone cannot answer that once eighteen games share a stack — so each bar
event a bar is, and hue alone cannot answer that once nineteen games share a stack — so each bar
carries its game's short name, with the full name in its tooltip. A bar too narrow for a tag and a
title both keeps the title: a chopped game name reads as a broken word, and the hue and the tooltip
still answer it.
+68 -1
View File
@@ -58,6 +58,7 @@ Two things this method cannot tell you, and both matter:
| Punishing: Gray Raven, Guardian Tales, Aether Gazer | Declined — see §§ 6, 7, 9 |
| Infinity Nikki | **Rebuilt** (2026-08-19) on `infinity-nikki.fandom.com` at day precision, replacing a Game8 page stale since August 2025 — see § 11 |
| Silver Palace | Unreleased |
| Honkai Impact 3rd | **Built** (2026-08-27) on `arustats.com`, and the only lane here whose dates are **estimates** — see § 14 |
## Summary of findings
@@ -467,7 +468,7 @@ table.
**One cost applies to both builds and should be in the commit message, not discovered later.** Both
candidates are game8.co, which does not answer the Actions runner (`AGENTS.md` § Scraping conduct).
Nine of the nineteen sources are game8 pages today, now that Infinity Nikki has moved to Fandom
Nine of the twenty sources are game8 pages today, now that Infinity Nikki has moved to Fandom
(§ 11); these would make ten and eleven. Each is a lane fixture-backed in CI from day one and only
ever as fresh as someone's last manual `bun run refresh`, and one more request to a single host every
cycle — the per-host arithmetic § Scraping conduct already calls uncomfortable.
@@ -674,6 +675,72 @@ an estimate over the CN one — plus a stable URL for the current version, or an
Any two of the three still leaves the other. No alternative HI3 source was looked for in this pass, so
the game is unsourced rather than declined outright.
**Superseded 2026-08-27.** The alternative this section did not look for exists — `arustats.com`,
§ 14 below — and it answers three of the four objections above. `marisaimpact.com` itself stays
declined on all four; nothing here has been re-tested and this verdict is not the live one for the
game.
## 14. Honkai Impact 3rd — BUILT 2026-08-27, on estimated week buckets, by decision
**Source:** `https://www.arustats.com/en-us/hi3/timeline` — AruStats' per-version timeline. Assessed
on request as an alternative to the `marisaimpact.com` page § 13 declined, and built with one of
§ 13's four objections still standing.
**Conduct is clean, and better than most things here.** `robots.txt` is `User-agent: *` / `Allow: /`
with `/hi3/*` and `/en-us/*` named explicitly, no `Disallow` anywhere, no `Content-Signal` header and
none of the named AI-crawler blocks; `Crawl-delay: 1`, far below our 6h floor. Verified through the
real `RobotsCache` and the runner's own User-Agent rather than `curl``robots.txt ok`,
`crawlDelayMs: 1000` — per AGENTS.md § Fandom on why the instrument matters. The page carries its own
"not affiliated with miHoYo" attribution line, and the host advertises a sitemap.
**Three of § 13's four objections are answered:**
| § 13 objection | Here |
|---|---|
| Dates are CN estimates redrawn for regions | The grid is headed `GLB/SEA` — our readers' server, not a CN schedule with an estimate over it |
| No year appears anywhere | `scheduleDates` states full dates with years — `2026-8-20`, `2026-10-22` |
| The URL is per-version with no stable route | **`/en-us/hi3/timeline` answers `307` to the live version.** The site names its own current version server-side; the runner follows it and no URL ever needs editing |
| The unit is a week column, not an event boundary | **Still true.** Unchanged, and it is the whole cost below |
**The objection that stands.** No event on the page states a date. Events are bars carrying
`startWeek` / `endWeek` *integers* into a nine-column week grid, and the header over that grid reads
`ESTIMATED WEEK`. So every boundary this source publishes is the edge of a bucket the site estimated.
That is weaker than the day-precision reading Game8 and Infinity Nikki get — there the page printed a
date per event and we declined only to invent a time of day for it — and § 13 declined
`marisaimpact.com` on exactly this ground.
**It was built anyway, and that is a decision rather than an oversight** (repository owner,
2026-08-27, with the cost stated before the adapter was written). The reasoning: Honkai Impact 3rd
had no source at all, this page is otherwise healthy and current, and a lane of approximate
six-week windows was judged better than no lane. Be exact about what that buys and what it costs:
- **What is honest about it.** The week grid's *outer* boundaries are real and independently
checkable: v8.9 reads `2026-6-25``2026-8-20` and v9.0 picks up at `2026-8-20``2026-10-22`,
which are the version's actual maintenance dates and chain exactly. Sixteen bars on the page yield
sixteen events, so nothing is silently dropped.
- **What is not.** Where a banner swaps *inside* a version is the estimated part, and those are most
of the boundaries. `startsAt` is also half of every event ID, so a week grid the site revises moves
IDs and orphans completion marks — a hazard no wiki source here carries.
- **How the fact is carried.** `ESTIMATE_CONFIDENCE` (0.4) on every event, against the 0.850.95 a
date-stating source earns. `mergeEvents` prefers the higher number, so a real HI3 source outranks
this one the moment one is added, with no cleanup step to forget.
- **The gap left open.** `confidence` is read nowhere in `src/client/`, so nothing on screen tells a
reader this lane is estimated while every other lane is announced. Closing that needs a schema
field or a client change — a design question, not adapter work — and it is the obvious next step
if this source stays.
**What would retire it:** any HI3 source that states a date per event. That is a strictly lower bar
than § 13's list, and this source outranks nothing — it is the floor, not the ceiling.
**The markup, so nobody re-derives it.** The site is Next.js and server-renders the whole schedule
into `__NEXT_DATA__` (`props.pageProps.timeline`), so `parsers/arustats.ts` reads JSON and ignores the
rendered grid entirely — the bars carry their geometry in Tailwind `col-span-N` classes and their
offsets in bare spacer `<div>`s, which a DOM reader would have to count positionally. `endWeek` is
exclusive and runs one past the grid to mean "to the end of the version". `scheduleBosses` is the
only exactly-dated material on the page (Abyss and Memorial Arena openings, three a week) and is
deliberately unread: a recurring rotation with no end is not a deadline, and `endsAt: null` on each
would render them live-with-unknown-end forever.
## What every one of these costs, beyond the source
Adding a game is never only a `SOURCES` entry: