New `fandomtable` parser (src/ingest/parsers/fandomTable.ts) reads Fandom's
dated pass-history table by its Name/Start/End headings and emits runs not
yet ended by ctx.now, at day precision. Titles come from a per-source
PASS_SOURCES table so the next pass pages are one entry each.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
build-feed globbed fixtures by site (`fandom-*`), so a second Fandom page
for a game, such as Genshin's Miliastra Pass beside its event page, would
have handed its fixture to the events parser. pickFixture matches the
source's whole name followed by a date. Every fixture already follows
that name, and the built feed is unchanged (206 events, same ids).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Beyond the Rails rolls on Asia's reset, and the header took the soonest
reset of every chip, so a Europe NTE reader read "next reset in 1h" at
20:00 UTC when their day rolls in seven. The countdown now counts the
reader's own clocks. Found in the whole-branch review.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
It printed the unticked days left, so ticking a cycle off dropped its
figure by one, and on the last day read 0d. Tasks now carry daysLeft, the
period's days from today, and the chip prints that. Found in the
whole-branch review.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Entries for be3c140 (Every N days in Add a task) and 524b6f2 (the cycle
built-ins), and the cycle-routines release note.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Both fortnightly. Beyond the Rails is ticked once a cycle and rolls on
the Asia server's reset for every reader: on Europe the owner read it
ending Wednesday 21:00 UTC, Asia's Thursday 05:00. The Fund counts fons
against the guide's base cap of 1,000,000; the note says a reader's own
cap is higher and how to set it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The Hazard Zone on a 28-day cycle, ticked once, anchored on the reset the
owner read in game (Monday 2026-11-09). The source says "roughly", and
the note says so.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Both every two weeks on alternating Fridays, ticked once a cycle,
anchored on the owner's in-game readings: Shiyu rolled 2026-10-16,
Deadly Assault rolls a week later.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Pure Fiction, Memory of Chaos and Apocalyptic Shadow on their six-week
rotation, two weeks apart, each ticked once a cycle and anchored on the
owner's in-game end dates; and the Divergent Universe / Currency Wars
pool, weekly since 4.2, at the owner's 18,000.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A corrupt import is stored as it came, and "2026-13-01" passed the
pattern, then threw in periodOf on every render. "2026-02-30" rolled into
March instead and moved the cycle. The schema now round-trips the date,
so either is kept on disk and left off screen like any unreadable task.
Found by the schema-guardian review.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Routine gains clock?: Region, code only. Its day key, its countdown and
its catch-up days are cut on that server's reset rather than the
reader's: for a cycle that ends at one instant on every server. Make it
mine leaves it behind.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Add a task gains "Every N days": a length of 2 to 366 days and the date a
cycle began. Editing one keeps its length and start, and "days needed" is
capped at the cycle's length.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A third period, { unit: "cycle", days, from }, cut in day-key space like
weeks and months, so each game's per-server reset carries over. Tasks on
it are tallied and switched apart (showCycleTasks, on by default), show
the days left in their chip, and the lower row's heading now names the
periods it holds.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The spec and plan say what shipped and what is still open. TODO.md gains the
next two sub-projects with the facts already gathered, the design questions to
settle and the sources to check, and a default check-in goal for To Temper
Thyself and Journey Far.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Game-Time-Master lists NTE Europe on UTC+1, but the game disagrees: on
2026-10-16 two in-game timers ran out at 03:00 UTC — one on 26 Oct, after the
clocks change — and Realm of Greed says "resets every Monday at 5:00". Only a
fixed UTC+2 fits all three.
Re-labels the hour 03:00-04:00 UTC of every European reader's NTE day.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The design spec (entries with the sentence each rests on, what was looked for
and not shipped, and the facts gathered for N-week cycles and dated pass
windows), the plan, PRD F12 and F17, DATA-MODEL's prefs, and TODO.md's open
in-game checks.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Most shops sell both banners' pulls. A shop's premium line is offered like any
built-in; its standard line (Acquaint Fates, Star Rail Pass, Master Tapes,
Resonite Crystals) only when the reader switches on Include standard-banner
pulls under the built-ins switch. A new pref, standardPulls, absent meaning
off, so no install gains anything until it asks.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Mira Journey's weekly EXP cap and the Resonance Store's Revelation Crystals on
the 1st, confirmed in game, and Realm of Breakthrough from the wiki, which the
owner could not check yet (TODO.md). The wiki answers again after refusing
every request with HTTP 402.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Anomaly Pilgrimage (3 claims in total, settling a source conflict), City
Stamina (700), Realm of Greed and the Special City Commission, beside the
Season Pass weekly EXP cap — all confirmed in game by the owner.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Weekly Challenge, Pioneer Podcast weekly EXP and Weekly Activities, confirmed
in game. The Podcast cap is 12,000 — the wiki's newest season page (v3.1)
still says 10,000.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Etchspace Salvage: Focus Commissions, 3 a week, from the wiki; the owner could
not check it in game yet (TODO.md). The Weekly Routine and Endfield's EU reset
hour are confirmed in game.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Bounty Commissions (one 8,000-point cap shared by Lost Void and Enigma of the
Labyrinth), Notorious Hunt, the New Eridu City Fund's weekly EXP cap, and the
Signal Shop's Encrypted Master Tapes and Boopons on the 1st — all confirmed in
game by the owner.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The wiki recorded 2,100 on 2026-01-05 and the owner confirmed it in game;
Game8's page still says 1,300. Same id, so logged numbers are kept — a week
logged at 1,300 now reads 1,300 of 2,100.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Nameless Honor's weekly EXP cap (8,000, which no page states; confirmed in
game) and the Embers Exchange's Star Rail Special Passes on the 1st, beside
Echo of War, now confirmed in game. The EU reset hour is confirmed too.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Weekly Bosses, Battle Pass weekly EXP, Reputation Bounties and Requests, the
Realm Depot, Paimon's Bargains (Intertwined Fates), Spiral Abyss and
Imaginarium Theater, each from a dated wiki page and confirmed in game by the
owner. Records the one exception to "a page states it": a figure the owner
confirmed in game says so in its note, with the day, and a test holds it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Built-ins now include monthly items, so the strip's question, Settings and Your
own say "weekly and monthly". The per-game tooltip quotes the oldest source
date when a game has several.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The strip's Edit panel lists each game's chore, then its built-ins, then its
events, each with Stop tracking, and Track · N offers everything a game could
track and does not. Your own lists every built-in of the games that are on,
untracked ones included and marked, so none is off with no way back.
Renames Remove from dailies / Add an event to Stop tracking / Track.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A new pref, routinesHidden, lists built-ins stopped one at a time by id. It
narrows the game's answer and never widens it, so stopping one changes nothing
else, and a built-in shipped later still arrives. Tracking one of a game that
is off turns the game on with that item alone (trackRoutinePatch).
Absent means none; ticks and numbers stay under the id.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The owner's rule, recorded so the next agent does not squash a multi-part fix to keep the changelog to one line: one coherent change per commit, each passing alone, ordered so each is safe to ship alone, with a single changelog entry naming the range.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Game8 and Fandom name Genshin's anniversary selectors with no word in common, and both run the same window, so the calendar showed each selector twice. Game8's own blurb names the Fandom event ("…limited 5-star selector, Tabletop Troupe: A Gathering on Adventure's Eve!"), which is how a person paired them, so merge now reads it the same way.
The rule is narrow on purpose: the whole title of two or more words, both boundaries within 24h, and never for a copy that already has a twin by title in the other source, since then the blurb is naming a neighbour such as a festival's shop. Measured on every two-source page held, it fires on the two selector pairs and otherwise only where titles already matched. Dates alone never pair: patch day puts about twenty Genshin events on one window. aliases.ts is the recorded-pair fallback for copies no page links; it is empty.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
titleExtends caught a source appending words ("Bedazzling Dawnstar Sign-In") but not prepending them, which is the shape Game8's "Battle Pass - …" label took. The same qualifier at the other end now pairs too. The two-word floor holds at both ends, because a one-word base would fuse half of a patch day.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
When merge fuses two sources' copies, the loser's id leaves the calendar, and it may already hold a reader's ticks from a day it was published alone. Until now that needed a hand-edited RETIRED_IDS entry per fusion.
The survivor now lists what it absorbed in an optional mergedIds field. When a feed arrives the client turns those into carry-forward pairs, skipping any id the feed still publishes, and an import takes the same table. Optional, so an older cached feed still validates and an older bundle drops it unread. RETIRED_IDS stays for parser changes, whose old ids no feed will name again.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Game8 heads Genshin's pass "Battle Pass - Moontrace"; Fandom lists "Moontrace" and files the category in a column. The label minted a second id for one event, so every battle pass since the Fandom source landed has been on the calendar twice, and a reader reported it.
Both sources now mint the same id and merge fuses them by id. The two Game8 ids that moved, Frostfarer and Moontrace (the only ones git history shows ever shipped), go in RETIRED_IDS so readers' marks follow.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
An event id is a localStorage key, so a fix that changes one orphans every tick, note and ignore filed under it. retiredIds.ts holds an explicit table of old id -> new id, and the progress, daily and ignored stores move entries across on load and on import.
It moves rather than copies: a copy left under the old id would be carried forward again on every load and bring back a mark the reader had cleared. When both ids hold an entry, each store's own import merge decides, except that progress keeps any field only the older row held. The table starts empty; the change that moves ids adds its entries.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
.impeccable/design.json was a derived copy of docs/DESIGN.md and the CSS,
read only by Impeccable's live panel, which this project does not use. It
had drifted two weeks behind while DESIGN.md stayed current, so DESIGN.md
is now the only design reference; /impeccable document regenerates the
sidecar if it is ever wanted.
The layout block's "1,099 tests" was 285 behind; it now names the suite
without a number, which only goes stale.
Co-Authored-By: Claude Opus 5.5 <[email protected]>