docs: record the TBA drop and what a one-row source means

Two things the last two commits taught, written down where the next person
looking at a parser will hit them.

The date table now carries the slash-dated open range, and the prose beside it
says the year is required and why — that reader is tried last, so a guess there
reaches the feed unchallenged. It also names the second copy of the open-end
vocabulary, because the two lists being out of step is not a hypothetical
failure any more.

The second is the one worth having on record. `eventCount` in a snapshot's meta
is not a count of the page. Endfield's Game8 lane read 1 for a week — one row of
an *upcoming* table, while four live events sat in a card grid the parser cannot
read — so the first time the page moved, the lane read 0 and the gate reported a
shape change. Neither number described the page. A count far below what the page
shows is a shape being skipped, and it is worth finding before it reaches zero
and the gate has to guess on your behalf.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
Lucas Winther
2026-08-23 01:07:30 +02:00
co-authored by Claude Opus 5
parent 0307d24b92
commit dbcd14eb70
2 changed files with 24 additions and 5 deletions
+11 -3
View File
@@ -240,9 +240,17 @@ These come from how gacha games actually schedule things, and they cause most bu
- **Prefer a source that states machine-readable times.** wiki.gg emits ISO timestamps with a timer
per server region, which is the only reason `regionEnds` carries real data anywhere.
- **Silent drops are the dangerous failure.** A date format the parser does not recognise makes
events vanish with no error. Abbreviated months (`Apr. 29 - May 13, 2026`) are supported for
exactly this reason. When adding a source, compare the parser's event count against an
independent count of the page.
events vanish with no error. Abbreviated months (`Apr. 29 - May 13, 2026`) and slash-dated open
ends (`09/02/2026 - TBA`) are supported for exactly this reason. When adding a source, compare the
parser's event count against an independent count of the page.
- **A source resting on one row is a source about to read zero.** `eventCount` in a snapshot's
`.meta.json` is the count the whole lane depends on, and a small one is a warning rather than a
fact about the game. Endfield's Game8 page read `1` for a week — one row of an *upcoming* table,
while four live events sat in a card grid the parser cannot see — and when Game8 re-cut that table
for the next version in a notation `parseOpenRange` did not know, the source read `0` and the
refresh reported a shape change. Neither number was ever a count of the page. When a source's
count is far below what the page shows, find out which shape is being skipped before the count
reaches zero and the gate has to guess for you.
## Event IDs are localStorage keys
+13 -2
View File
@@ -146,7 +146,7 @@ All live in `src/ingest/dates.ts`, each returning null rather than inferring any
| `parseIsoOffsetInstant` | `2026-08-03T21:00-07:00` (a machine-readable `<time datetime>` attribute; **offset required**) | Stella Sora |
| `parseDayMonthYearClock` | `12 August 2026`, `10 September 202604:59:59` (day-first; the offset comes from the **column header**, and a clockless boundary keeps its printed day) | Nikke |
| `parseZonelessClockRange` | `July 20, 2026 04:00 August 10, 2026 03:49` (reads the clock and **discards** it — the page states no zone, so only the printed day is publishable) | Infinity Nikki |
| `parseOpenRange` | `Jul. 24, 2026 - End of 4.6`, `July 10, 2026 - Permanent` | Star Rail, Wuthering Waves |
| `parseOpenRange` | `Jul. 24, 2026 - End of 4.6`, `July 10, 2026 - Permanent`, `09/02/2026 - TBA` (**a year is required**, in either notation) | Star Rail, Wuthering Waves, Endfield |
**A day-precision result is 00:00Z, and that is a placeholder rather than a time.** Every reader
above returns `precision: "day"` when the source printed no clock, and stores the date at UTC
@@ -168,7 +168,18 @@ reader rather than for the earliest of them. Being generous by nine hours costs
the bottom of a list; being strict costs a live one.
`parseOpenRange` is tried last because it is the most permissive — it accepts any leading full date
and reports no end.
and reports no end. It reads **both** notations, month-name and slash, because which one a page uses
is house style rather than a statement about certainty: Star Rail writes `End of 4.6` after a month
name, and Endfield's Game8 page published its entire 1.5 schedule as `09/02/2026 - TBA`. Reading only
the first notation made all nine of those rows undatable, and an undatable row is dropped in silence —
the source went from one event to zero and the run reported a shape change. What it may never do is
infer a missing year: Game8's summary rows write `08/12 - 08/24`, and this being the last reader tried
means a year guessed here becomes a confidently dated event with nothing left to catch it.
The open-end vocabulary is listed in two places that must agree — `parseOpenRange` decides whether the
row is datable, and `RANGE_PREFIX` in `game8.ts` strips the range off the cell to recover the blurb. A
word the first knows and the second does not still yields the event, with the leftover end tacked onto
the front of its summary (`- TBA Sign-in to get extra pulls for Typhoeus!`).
`parseAdjacentFullRange` and `parseYearFirstSlashRange` are anchored at both ends and require a year
on each half, which is what keeps them from eating prose. `August 12, 2026 Day 3 rewards are doubled`