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:
co-authored by
Claude Opus 5
parent
c272d9e93d
commit
7864ba6241
+1
-1
@@ -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([
|
||||
|
||||
@@ -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.85–0.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
@@ -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
@@ -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.85–0.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:
|
||||
|
||||
Reference in New Issue
Block a user