Files
gacha-event-tracker/fixtures/nikki/fandom-events-2026-08-19.expected.json
Lucas WintherandClaude Opus 5 2985484883 feat: rebuild Infinity Nikki on a live source, at day precision
The Game8 page stopped being updated on 31 August 2025 and mentions 2026 zero
times, and it had been publishing five year-old events with endsAt: null — which
the app renders as live-with-unknown-end indefinitely. That is worse than an
empty lane, and nothing in the pipeline catches it, because a stale page is not
a broken one: it fetches, it parses, it passes every test.

The replacement is the game's Fandom wiki, permitted by the same standard
robots.txt that cleared Nikke, maintained to within two days, and shaped as
Current / Upcoming / Permanent / Past tables of Event | Duration | Description
| Type.

Its durations state a wall clock on both sides and no zone anywhere for that
column, so parseZonelessClockRange reads the clock and discards it, publishing
the printed date at day precision. That invents nothing and treats these cells
exactly as every Game8 date already is. Converting instead would mean picking an
offset, and the offset moves the day: July 16 20:00 read as UTC-7 is July 17,
and the start's day is half of every event ID this game will ever have.

The Game8 entry is removed rather than kept as a second opinion, since a source
whose every row is wrong is not corroboration. Its fixture stays: it is the only
page here carrying the labelled "Start: ... End: Permanent" shape, and the test
now drives it through the parser directly.

Titles come from a link's title attribute, which never passes through text(), so
they are entity-decoded by hand — otherwise "Alison's Travel Shop" becomes a
slug, and a slug is a localStorage key. The ingest sanitiser caught exactly that
during the build.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
2026-08-19 04:23:24 +02:00

150 lines
5.4 KiB
JSON

[
{
"id": "nikki:raised-your-shroomling-today:2026-07-11",
"game": "nikki",
"title": "Raised Your Shroomling Today?",
"type": "other",
"summary": "Unlock your Shroomling today! Complete tasks for rewards including Diamonds, Resonite Crystals, and Revelation Crystals.",
"startsAt": "2026-07-11T00:00:00.000Z",
"startPrecision": "day",
"endsAt": "2026-08-27T00:00:00.000Z",
"endPrecision": "day",
"regionScoped": false,
"regionEnds": null,
"sourceUrl": "https://infinity-nikki.fandom.com/wiki/Raised_Your_Shroomling_Today%3F",
"sourceId": "nikki-fandom-events",
"status": "published",
"confidence": 0.85,
"extractionMethod": "parser",
"version": 1,
"firstSeenAt": "2026-08-14T00:00:00.000Z",
"updatedAt": "2026-08-14T00:00:00.000Z"
},
{
"id": "nikki:dawnlit-gambit:2026-07-16",
"game": "nikki",
"title": "Dawnlit Gambit",
"type": "other",
"summary": "During the [Dawnlit Gambit] event, gain [Board Notes] via eligible purchases. When [Board Notes] reaches certain milestones, you can unlock corresponding rewards.",
"startsAt": "2026-07-16T00:00:00.000Z",
"startPrecision": "day",
"endsAt": "2026-08-27T00:00:00.000Z",
"endPrecision": "day",
"regionScoped": false,
"regionEnds": null,
"sourceUrl": "https://infinity-nikki.fandom.com/wiki/Dawnlit_Gambit",
"sourceId": "nikki-fandom-events",
"status": "published",
"confidence": 0.85,
"extractionMethod": "parser",
"version": 1,
"firstSeenAt": "2026-08-14T00:00:00.000Z",
"updatedAt": "2026-08-14T00:00:00.000Z"
},
{
"id": "nikki:lithe-prelude:2026-07-16",
"game": "nikki",
"title": "Lithe Prelude",
"type": "shop",
"summary": "The Grace and Rhythm Box is available for a limited time. Purchase to receive all the rewards in the Lithe Spin Box and the Gilded Melody Box!",
"startsAt": "2026-07-16T00:00:00.000Z",
"startPrecision": "day",
"endsAt": "2026-08-27T00:00:00.000Z",
"endPrecision": "day",
"regionScoped": false,
"regionEnds": null,
"sourceUrl": "https://infinity-nikki.fandom.com/wiki/Lithe_Prelude",
"sourceId": "nikki-fandom-events",
"status": "published",
"confidence": 0.85,
"extractionMethod": "parser",
"version": 1,
"firstSeenAt": "2026-08-14T00:00:00.000Z",
"updatedAt": "2026-08-14T00:00:00.000Z"
},
{
"id": "nikki:memory-hall:2026-07-16",
"game": "nikki",
"title": "Memory Hall",
"type": "shop",
"summary": "Visit the Store to shop reruns of limited-time products!",
"startsAt": "2026-07-16T00:00:00.000Z",
"startPrecision": "day",
"endsAt": "2026-08-27T00:00:00.000Z",
"endPrecision": "day",
"regionScoped": false,
"regionEnds": null,
"sourceUrl": "https://infinity-nikki.fandom.com/wiki/Memory_Hall/2026-07-16",
"sourceId": "nikki-fandom-events",
"status": "published",
"confidence": 0.85,
"extractionMethod": "parser",
"version": 1,
"firstSeenAt": "2026-08-14T00:00:00.000Z",
"updatedAt": "2026-08-14T00:00:00.000Z"
},
{
"id": "nikki:rainbow-colored-gift:2026-07-16",
"game": "nikki",
"title": "Rainbow-Colored Gift",
"type": "other",
"summary": "Complete the dyeing quest and infuse inspiration into your designs to receive the Rainbow-Colored Gift!",
"startsAt": "2026-07-16T00:00:00.000Z",
"startPrecision": "day",
"endsAt": "2026-08-27T00:00:00.000Z",
"endPrecision": "day",
"regionScoped": false,
"regionEnds": null,
"sourceUrl": "https://infinity-nikki.fandom.com/wiki/Rainbow-Colored_Gift/2026-07-17",
"sourceId": "nikki-fandom-events",
"status": "published",
"confidence": 0.85,
"extractionMethod": "parser",
"version": 1,
"firstSeenAt": "2026-08-14T00:00:00.000Z",
"updatedAt": "2026-08-14T00:00:00.000Z"
},
{
"id": "nikki:alisons-travel-shop:2026-08-06",
"game": "nikki",
"title": "Alison's Travel Shop",
"type": "shop",
"summary": "Stylists can visit Alison and exchange materials from the list for awesome rewards. The checklist refreshes daily at 04:00. Alison has brought extra special gifts this time! Unlock a bonus reward after completing 7 exchanges!",
"startsAt": "2026-08-06T00:00:00.000Z",
"startPrecision": "day",
"endsAt": "2026-08-27T00:00:00.000Z",
"endPrecision": "day",
"regionScoped": false,
"regionEnds": null,
"sourceUrl": "https://infinity-nikki.fandom.com/wiki/Alison%27s_Travel_Shop/2026-08-06",
"sourceId": "nikki-fandom-events",
"status": "published",
"confidence": 0.85,
"extractionMethod": "parser",
"version": 1,
"firstSeenAt": "2026-08-14T00:00:00.000Z",
"updatedAt": "2026-08-14T00:00:00.000Z"
},
{
"id": "nikki:inspiration-burst:2026-08-15",
"game": "nikki",
"title": "Inspiration Burst",
"type": "other",
"summary": "Get double rewards in the Realm of Eureka !",
"startsAt": "2026-08-15T00:00:00.000Z",
"startPrecision": "day",
"endsAt": "2026-08-22T00:00:00.000Z",
"endPrecision": "day",
"regionScoped": false,
"regionEnds": null,
"sourceUrl": "https://infinity-nikki.fandom.com/wiki/Inspiration_Burst/2026-08-15",
"sourceId": "nikki-fandom-events",
"status": "published",
"confidence": 0.85,
"extractionMethod": "parser",
"version": 1,
"firstSeenAt": "2026-08-14T00:00:00.000Z",
"updatedAt": "2026-08-14T00:00:00.000Z"
}
]