From e1e5fc06c39fa657c7be902952305631403d8831 Mon Sep 17 00:00:00 2001 From: Lucas Winther Date: Fri, 16 Oct 2026 03:00:55 +0200 Subject: [PATCH] docs: record built-in routines, per-item tracking and standard pulls 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 --- TODO.md | 25 ++ docs/DATA-MODEL.md | 20 +- docs/PRD.md | 31 +- .../plans/2026-10-14-built-in-routines.md | 55 ++++ .../2026-10-14-built-in-routines-design.md | 306 ++++++++++++++++++ 5 files changed, 423 insertions(+), 14 deletions(-) create mode 100644 docs/superpowers/plans/2026-10-14-built-in-routines.md create mode 100644 docs/superpowers/specs/2026-10-14-built-in-routines-design.md diff --git a/TODO.md b/TODO.md index 7272238..8a5cfca 100644 --- a/TODO.md +++ b/TODO.md @@ -1,5 +1,30 @@ # TODO +- [ ] Move NTE's Europe server to UTC+2. `games.ts` rolls it at 05:00 UTC+1 (04:00 UTC), per + Game-Time-Master and GameWith, but the game disagrees. On 2026-10-16 the owner read: a weekly + timer of 3d 2h at 00:40 UTC (→ Monday 2026-10-19 **03:00 UTC**); Realm of Greed's own text, "Gold + Heist resets every Monday at 5:00"; and the Tycoon Incentive Fund at 10d 2h at 00:43 UTC (→ + Monday 2026-10-26 **03:00 UTC**, the day after the clocks change). Only 05:00 on a fixed UTC+2 + fits all three — 03:00 UTC all year, not a server that follows daylight saving. Fix: set + `resetOffsets.europe: 2` for `nte` with a test, as a day-key change under AGENTS.md § Event IDs, + and update `docs/DATA-MODEL.md`'s reset table and Game-Time-Master's place as the source. One + NTE timer read after 2026-10-25 would confirm it (it should still land on 03:00 UTC). See the + [built-in routines spec](docs/superpowers/specs/2026-10-14-built-in-routines-design.md). +- [ ] Confirm Infinity Nikki's *Realm of Breakthrough* in game: still two Phantom Trials (Wish + Master Chigda, Guardian Beast Whirls), once a week each, renewed at the Monday reset? The owner + could not check on 2026-10-16 ("insufficient story progress" — it unlocks after *Showdown with + Chigda!*). Until then the entry stands on infinity-nikki.fandom.com/wiki/Realm_of_Breakthrough + (as of 2026-01-01), whose "currently there are two Trials" is the oldest claim in the Nikki + list. If it differs, correct `routine:nikki:realm-of-breakthrough` in `src/shared/routines.ts` + and its row in the [spec](docs/superpowers/specs/2026-10-14-built-in-routines-design.md) + § Entries together, with the note `Confirmed in game, YYYY-MM-DD.` +- [ ] Confirm Endfield's *Etchspace Salvage: Focus Commissions* in game: still 3 commissions a + week, and does it reset on Monday with the *Weekly Routine* (EU: Monday 11:00 CEST, confirmed + 2026-10-14)? The owner could not check on 2026-10-14 ("due to mission progress"). Until then the entry stands on endfield.wiki.gg/wiki/Etchspace_Salvage (as of + 2026-09-01), whose "weekly" is read as Monday from the wiki's own weekly-reset box. If either + is wrong, correct `routine:endfield:focus-commissions` in `src/shared/routines.ts` and its row + in the [spec](docs/superpowers/specs/2026-10-14-built-in-routines-design.md) § Entries + together, with the note `Confirmed in game, YYYY-MM-DD.` - [x] Support check-in goals for events that require only some of the available days (for example, five check-ins per week). Keep unfinished events in Dailies, show progress against the required count, and distinguish finishing a week from finishing the event. diff --git a/docs/DATA-MODEL.md b/docs/DATA-MODEL.md index 02c6e06..bc03c07 100644 --- a/docs/DATA-MODEL.md +++ b/docs/DATA-MODEL.md @@ -259,7 +259,7 @@ Namespaced, versioned, and small. Nothing here ever goes to the server. // choresOn?, choresOff?, // showWeeklyTasks, showMonthlyTasks, showCompleted, showIgnored, theme, regionConfirmed, // onboarded, showRoutines?, routineGames?, routinesOff?, - // routinesAsked? } + // routinesAsked?, routinesHidden?, standardPulls? } // Chores and built-in weekly tasks are each one global // answer plus the games that differ (src/shared/perGame.ts): // an on-list wins, then an off-list, then the global answer. @@ -270,8 +270,13 @@ Namespaced, versioned, and small. Nothing here ever goes to the server. // routineGames is the games whose built-ins are on (the // on-list, unchanged from before showRoutines existed), // routinesOff the off-list, routinesAsked the games already - // asked about. Every list absent means none — built-ins are - // opt-in for every install. PRD F17. + // asked about. routinesHidden is routine ids stopped one by + // one: it narrows the game's answer and never widens it. + // standardPulls says whether a shop's standard-banner + // pulls are offered beside its premium ones; absent is + // false, premium only. + // Every list absent means none — built-ins are opt-in for + // every install. PRD F17. // showWeeklyTasks / showMonthlyTasks say whether tasks of // that period sit in the strip's row under the dailies. // Both default true, so an install from before them keeps @@ -574,9 +579,14 @@ removes the task record only. **Built-in tasks** (`src/shared/routines.ts`) are not stored: they ship in the bundle, each with a `source` URL and the `asOf` date that page gives, and their ticks and numbers are stored under their -`routine:` id exactly as a reader's task's are. Four prefs govern them: `showRoutines` (the answer +`routine:` id exactly as a reader's task's are. Six prefs govern them: `showRoutines` (the answer for every game; **absent means never answered**, read as off), `routineGames` and `routinesOff` -(games that differ from it, on and off), and `routinesAsked` (games the strip already asked about). +(games that differ from it, on and off), `routinesAsked` (games the strip already asked about), and +`routinesHidden` (single built-ins the reader stopped tracking, by id), and `standardPulls` (whether a +shop's standard-banner line, `pulls: "standard"`, is offered at all; absent is no). A built-in is shown +when its game is on, it is offered **and** it is not hidden, so hiding one never changes the game's answer and a built-in +shipped later still arrives. Tracking one of a game that is off turns the game on with that one +alone — its siblings join `routinesHidden` (`trackRoutinePatch`, `usePrefs.ts`). The lists are **absent meaning none**, so built-ins are opt-in for every install. `routineGames` predates `showRoutines` and kept its meaning when it became the on-list — nothing was migrated, and a tab still running an older shell reads it the same way. *Make it mine* adds a `mytask:` with `from: ` and copies diff --git a/docs/PRD.md b/docs/PRD.md index a2be4ae..71d5882 100644 --- a/docs/PRD.md +++ b/docs/PRD.md @@ -315,11 +315,14 @@ title — and a goal makes an event a daily even with detection off. are left; an unknown end leaves the days left unknown. - **Set up from the strip, not just the sheet.** Giving Temper Thyself its goal used to mean finding it in the list, opening it, saying it repeats and then setting the goal. The strip's **Edit** — - beside *Catch up*, and like it a mode of the section rather than a control on a chip — lists the - strip's events by game with each goal in words; one opens to the sheet's goal control, *Open - details* and *Remove from dailies*. Under each game, *Add an event · N* lists its running events - that are not in the strip yet; adding one opens its goal at once. It writes exactly what the sheet - writes, so nothing about a goal or an override changes meaning. + beside *Catch up*, and like it a mode of the section rather than a control on a chip — lists + everything the strip carries, by game: the game's standing chore, its built-in tasks (F17), then + its events with each goal in words. An event opens to the sheet's goal control, *Open details* and + *Stop tracking*; the chore and built-ins, which have no goal, carry *Stop tracking* on the row. + Under each game, *Track · N* lists what it could carry and does not — a chore or built-in that is + off, and running events not in the strip yet; tracking an event opens its goal at once. It writes + exactly what the sheet and settings write, so nothing about a goal, an override or a switch + changes meaning. **F13 — Your own games and your own events.** No feasible adapter set covers everyone. Fourteen games were named in the first release thread and @@ -591,14 +594,24 @@ examples to start from, held to the same bar as the event form's (F13, *Examples - **Theirs, kept and exported.** Deleting a task removes the task only; its ticks and numbers stay. Both travel in the export, and import never rolls a newer week back. -**Some games' weekly tasks are built in** — ZZZ's Ridu Weekly (1,300 points) and Endfield's Weekly -Routine (10 points) so far, each from a cited page and shown with the date that page gives, so a -figure from an old guide is visibly old. They are **off until the reader says yes**: the strip asks +**Some games' weekly and monthly tasks are built in** — weekly bosses, battle pass EXP caps, a +monthly shop buy-out, endgame resets; the list per game, with the sentence each figure rests on and +what was looked for and not found, is in `docs/superpowers/specs/2026-10-14-built-in-routines-design.md`. +Each comes from a cited page and is shown with the date that page gives, so a figure from an old +guide is visibly old, and an item no page states is not shipped. They are **off until the reader says yes**: the strip asks once, in one line, about a game on screen that has them — until the reader answers for every game — and *What you see* governs them after: one switch for all of them, and *Choose games* for the games that differ. The standing daily chores take the same shape, so a reader who wants Genshin's chore and not Star Rail's can say so without losing either game's events. Built-ins are not edited in place; **Make it mine** copies one into the reader's -own tasks with its ticks and numbers, and hides the original while the copy exists. +own tasks with its ticks and numbers, and hides the original while the copy exists. **Any single +built-in can be tracked or not** — Endfield's weekly items but not one of them — from the strip's +Edit panel or *Your own*, which lists every built-in of the games that are on, untracked ones +included, so none is ever off with no way back. Stopping one keeps its ticks and numbers and never +changes the game's switch. +**A shop's pulls come in two lines** — the premium (limited-banner) pulls, tracked with the other +built-ins, and the standard-banner pulls most shops sell beside them, added only when the reader +switches on *Include standard-banner pulls* under the built-ins switch. One answer for every game; +off by default, so the reader chooses between premium only and both. **F18 — What changed.** The app now says what changed, in two tiers, both tied to git. **Short entries** — one line each, diff --git a/docs/superpowers/plans/2026-10-14-built-in-routines.md b/docs/superpowers/plans/2026-10-14-built-in-routines.md new file mode 100644 index 0000000..737c46d --- /dev/null +++ b/docs/superpowers/plans/2026-10-14-built-in-routines.md @@ -0,0 +1,55 @@ +# Built-in routines and per-item tracking — plan + +Spec: `docs/superpowers/specs/2026-10-14-built-in-routines-design.md`. Branch `feat/built-in-routines`. + +**Hold:** nothing is committed or pushed until the owner has verified the entries by hand +(owner, 2026-10-14). The work below is done in the working tree; § Commits is the split to apply +after sign-off, each step green on its own (AGENTS.md § Conventions). + +## Tasks + +1. **Hide one built-in (model).** `activeRoutines(rule, copiedFrom, hidden?)` and + `hiddenAfter(hidden, id, track)` in `src/shared/routines.ts`; `routinesHidden?` on `Prefs` and in + `restorePrefsValue`'s list sanitiser. Tests first in `test/routines.test.ts`. ✅ +2. **Track one built-in (prefs).** `trackRoutinePatch(prefs, routine, track)` in `usePrefs.ts`: + stop → hide; track with game on → unhide; track with game off → game on via `setFor`, recorded + as asked, siblings hidden. Tests first. ✅ +3. **Edit panel.** `StripStanding` and `standing` / `onTrack` on `StripEditor`; `laneGroups` + generic; per game: chore, built-ins, events; *Stop tracking* on each; *Track · N* over all three + kinds; rename *Remove from dailies* / *Add an event*. Tests first in `test/edit-dailies.test.tsx`. ✅ +4. **App wiring.** Strip tasks exclude hidden built-ins; `standing` built from the strip's games + (chore unless a reader's own game, then that game's built-ins less copied ones); `onTrack` writes + `choresOn`/`choresOff` or `trackRoutinePatch`. ✅ +5. **Your own.** Every built-in of the games that are on, *Not tracked* marked, Track / Stop + tracking beside *Make it mine*. Test in `test/custom-ui.test.tsx`. ✅ +6. **Copy.** "weekly tasks" → "weekly and monthly tasks" for built-ins in `Dailies.tsx`, + `Controls.tsx`, `YourOwn.tsx`; per-game tooltip quotes the oldest source date. Tests updated. ✅ +7. **Entries.** Add the spec's § Entries to `ROUTINES`; correct Ridu Weekly to 2,100 with its new + source; per-game table test pinned to the spec. ✅ +8. **Review.** schema-guardian on the new pref — no blocking findings. ✅ +9. **Docs.** PRD F12 (Edit panel) and F17, DATA-MODEL prefs block and built-in paragraph. ✅ +10. **Browser check** of the Edit panel and *Your own* on a fresh port (AGENTS.md § Commands). +11. **Owner verification** of § Entries and § Not shipped — then apply any corrections to both the + entries and the spec table together. +12. **Changelog** — entry in a follow-up `chore(changelog)` commit naming the feature commit, then + `bun run scripts/check-changelog.ts`. +13. **Standard-banner pulls** (spec decision 10, owner 2026-10-16). Tests first: twin per standard + line, `activeRoutines` leaves standard out unless asked, `standardPulls` restore, Settings + switch. Then `pulls` on `RoutineSchema` and `offered()`; premium lines tagged; four standard + lines; `standardPulls` pref; App and Controls wiring; schema-guardian; PRD F17, DATA-MODEL. ✅ + Browser check with task 10. + +## Commits (after sign-off) + +1. `feat(routines): let a reader stop tracking one built-in` — tasks 1–2. +2. `feat(dailies): track or stop tracking anything in the strip from Edit` — tasks 3–5. +3. `feat(routines): say "weekly and monthly" for built-ins` — task 6. +4. One `feat(routines): …` commit per game for task 7 — Genshin, Star Rail, ZZZ (including the + Ridu correction, as its own `fix(routines)` commit), Endfield (with the reset-hour evidence in + `games.ts`), NTE, Wuthering Waves, Infinity Nikki — each with its rows of the test table. +5. `feat(routines): let a reader add standard-banner pulls beside the premium ones` — task 13, + after the per-game commits: it carries the `pulls` field, the `pulls: "premium"` tags on the + existing shop lines, and the four standard lines, so each per-game commit stays green without it. +6. `docs: …` — spec, plan, PRD, DATA-MODEL, and TODO.md's open checks. +7. `chore(changelog): …` — task 12. +8. Separately, if the owner agrees: `fix(games): …` moving NTE's Europe server to UTC+2 (TODO.md). diff --git a/docs/superpowers/specs/2026-10-14-built-in-routines-design.md b/docs/superpowers/specs/2026-10-14-built-in-routines-design.md new file mode 100644 index 0000000..6d1c898 --- /dev/null +++ b/docs/superpowers/specs/2026-10-14-built-in-routines-design.md @@ -0,0 +1,306 @@ +# More built-in routines, and tracking any one of them — design + +Date: 2026-10-14. Status: design approved (repository owner, 2026-10-14). Entries pending the +owner's manual verification before commit. Sub-project 1 of 3 — see § Scope. + +## Problem + +The owner asked for "the usual repeatable events" — weekly events, battle pass, shop resets — for +Genshin, Star Rail, ZZZ, Endfield, Infinity Nikki and NTE, and then Wuthering Waves. The app has one place these fit without +a new shape: built-in routines (`src/shared/routines.ts`, PRD F17), which shipped with two entries. + +While designing it the owner added a second requirement: a reader must be able to **track or stop +tracking any single item** — not just a whole game's built-ins — and the same for every other thing +the dailies strip carries: a game's standing chore and repeating events such as Genshin's “To +Temper Thyself and Journey Far”. Their example: Endfield's weekly items, but not its Stock +Redistribution. + +## Scope + +The request split into three sub-projects, built in this order, each with its own spec and plan: + +1. **This one** — more built-in weekly and monthly routines, sourced; per-item Track / Stop + tracking; copy generalised from "weekly" to "weekly and monthly". +2. **N-week cycles** — a period unit anchored to a known start (Star Rail's endgame modes on a + six-week rotation two weeks apart; ZZZ's two-week Shiyu Defense / Deadly Assault). A new stored + shape, so it needs its own schema review. + Facts in hand for it: Star Rail's Divergent Universe and Currency Wars share one points cap of + 18,000 per period (owner, in game, 2026-10-14), and at 03:49 CEST that day the period read + 5d 1h left — ending Monday 2026-10-19 at 05:00 CEST, the EU reset the app already uses. + The period's length (two weeks per the wiki research) is what sub-project 2 must still source. + Star Rail's three endgame modes, read in game by the owner at 01:52 UTC on 2026-10-14, each + ending at a Monday reset (03:00 UTC) two weeks after the last: + - Pure Fiction — 5d 1h → 2026-10-19 + - Forgotten Hall (Memory of Chaos) — 19d 1h → 2026-11-02, which agrees with the wiki's next + Memory of Chaos opening `2026/11/02 04:00:00` server time (Forgotten Hall/Stages/4.6) + - Apocalyptic Shadow — 33d 1h → 2026-11-16 + That is the six-week rotation staggered two weeks apart, with one anchor per mode. + Wuthering Waves' Whimpering Wastes, read in game by the owner at 00:10 UTC on 2026-10-16: + "Respawning Waters" refreshes in 10d 2h — Monday 2026-10-26 at the 03:00 UTC reset. The info + box says only that the challenges and rewards of Respawning Waters: Chasm and Torrents "reset + periodically", so the period's length is still to be sourced. + Its Tower of Adversity Hazard Zone, read the same night: resets in 24d 2h — Monday 2026-11-09 + at the 03:00 UTC reset, which agrees with the 28-day chain found in research (Oct 12, Nov 9). + ZZZ's endgame modes, read in game by the owner at 00:22 UTC on 2026-10-16: + - Shiyu Defense — 2h 37m → Friday 2026-10-16 at 03:00 UTC, the reset to the minute + - Deadly Assault — "7d" (no hours shown) → Friday 2026-10-23, presumably at 03:00 UTC + - "Periodic Conquest" — 3d 2h → Monday 2026-10-19 at 03:00 UTC, so a weekly reset within it + Both modes roll on Fridays, a week apart; that agrees with the "Friday every two weeks" source + over the "every 15 days" one. Cycle lengths are still to be sourced — a reading after each + reset would give them directly. + NTE's Beyond the Rails, read in game by the owner at 00:34 UTC on 2026-10-16: "time remaining + 5d 20h 26m", and the game's own text says special routes "typically reset every 14 days". That + ends Wednesday 2026-10-21 at 21:00 UTC — not the EU reset (04:00 UTC) but 05:00 UTC+8, the Asia + server's reset on Thursday. So this cycle may end at one instant for every server, which + sub-project 2 must model rather than assume a per-server Monday. "Typically" means the 14 days + can bend; this settles the 14-days-vs-once-per-version conflict in favour of 14 days. + NTE's Tycoon Incentive Fund, read in game by the owner on 2026-10-16: one pool shared by Pink + Paws Heist, the Weekly Match in Volley Star, and idle earnings from Display Case exhibitions in + the Going, Going, Gone collectibles warehouse. The in-game "Incentive Fund Guide" says it + provides "up to 1000000 fons every 14 days", and the owner's pool reads 1,050,000. The owner + then found why: the cap is raised by progress in the "Puka Membership Program", to at least + 1,100,000; the game does not show the maximum. So the target differs per player — 1,000,000 is + the base, not the cap — and sub-project 2 must either let the reader set it or ship the base + with a note saying so. allthings.how (2026-05-06) instead calls Pink Paws' 1,000,000 a weekly + cap. Its timer, read at 00:43 UTC on 2026-10-16: "10d 2h / 14d" — a 14-day cycle ending Monday + 2026-10-26 at 03:00 UTC. +3. **Dated battle pass and shop windows** as feed events — source and parser work. + One fact in hand: on 2026-10-14 at 03:45 CEST the owner read Endfield's current Protocol Pass + as ending in 20h 15m — about 2026-10-15 00:00 CEST (2026-10-14 22:00 UTC), to the minute the + countdown shows. A source still has to state it before an event is built from it. + A second: at 01:55 UTC on 2026-10-14 the owner read Genshin's current Battle Pass as expiring in + 19d 1h — 2026-11-02 between 02:55 and 03:55 UTC, so most likely the 03:00 UTC (04:00 server) + reset that Monday. The same holds: a source has to state it. + A third: at 00:09 UTC on 2026-10-16 the owner read Wuthering Waves' Oscillated Coral shop, which + stocks gacha pulls and resets with the version update, as resetting in 26d 10h — 2026-11-11 + between 10:09 and 11:09 UTC, a Wednesday, which reads as the next version's maintenance. + A fourth: at 00:17 UTC on 2026-10-16 the owner read ZZZ's New Eridu City Fund season as ending + in 3d 2h — Monday 2026-10-19 between 02:17 and 03:17 UTC, so the 03:00 UTC reset that day. + A fifth: at 00:47 UTC on 2026-10-16 the owner read Infinity Nikki's current Mira Journey as ending + in 13d 19h — Thursday 2026-10-29 between 19:47 and 20:47 UTC; not the Europe server's reset + (02:00 UTC), so likely a version-wide end such as 20:00 UTC (04:00 UTC+8). + +## Decisions + +1. **Entries are added to `ROUTINES` in place.** No new module, no data file. The existing bar is + kept without exception: each entry cites an `https` page that **states** the figure and the + reset, with the date that page gives for itself (`asOf`, the wiki's last-edited date) and the + day we read it (`checked`). An item no page states is not shipped and is listed in § Not shipped + so nobody searches for it again. + **Confirmed in game** (owner, 2026-10-14): when no page states an item the owner has checked in + the game, it may still ship. It links the best page there is, and its `note` reads `Confirmed in + game, YYYY-MM-DD.` — the figure is then visibly ours rather than the page's. +2. **A reset-only item is ticked once a period.** Spiral Abyss and Imaginarium Theater pages state + the reset day and no completion target, so they are `measure: { kind: "days", required: 1 }` — + "done this cycle" — rather than a star count we would be inventing. +3. **Ridu Weekly's target is corrected, its id kept.** 1,300 → 2,100 points, source moved from + Game8 (2 Dec 2025, still says 1,300) to the Fandom page (31 Aug 2026), whose history shows the + change on 2026-01-05. Ticks and numbers are stored under the id and the period start, so nothing + stored moves; a reader at 1,500 this week now reads as short of the target, which is true. +4. **Per-item tracking — one new pref, `routinesHidden?: string[]`**, routine ids the reader stopped + tracking one by one. Absent means none. It **narrows** the per-game rule and never widens it: + a built-in is on the strip when its game is on (`routineRule`) and its id is not hidden. Hiding + moves nothing the game's switch says, and a built-in shipped later for that game still arrives. + Ticks and numbers stay stored. +5. **Tracking one built-in of a game whose built-ins are off turns the game on with only that + one** (`trackRoutinePatch`): the game joins `routineGames` (via `setFor`), is recorded in + `routinesAsked` so the strip does not ask again, and its siblings are added to `routinesHidden`. + The reader asked for one item, not the game's list. +6. **One control for everything the strip carries — the strip's Edit panel.** Per game it lists the + standing chore, then built-ins, then repeating events, each with **Stop tracking**; under each + game **Track · N** lists what the game could carry and does not. Nothing new is stored for a + chore (it writes `choresOn` / `choresOff` through `setFor`) or an event (the existing + `progress.daily` override, goal removed with it as before). *Remove from dailies* and *Add an + event* are renamed **Stop tracking** and **Track** so the three kinds read alike. +7. **Settings keeps every built-in reachable.** *Your own* lists every built-in of the games that + are on, hidden ones included (marked *Not tracked*), each with Track / Stop tracking beside *Make + it mine*. Without that list a hidden built-in of a game the reader has focused away from would + be off with no way back. +8. **Copy says "weekly and monthly"** wherever built-ins are named: the strip's question, the + settings switch and its per-game chips, *Your own*'s heading. "and", not "&", so markup and + aria-labels read the same. The per-game tooltip quotes the **oldest** source date, since a game + now has several. +9. **Readers who said yes to every game's built-ins get the new ones without being asked** — that + is what the global switch says. Games with their first built-ins (Genshin, Star Rail, Wuthering Waves, NTE) are + asked once, by the existing one-line question. +10. **Standard-banner pulls are one switch, off by default** (owner, 2026-10-16: "Users should be + able to choose between only premium, or both"; the single switch chosen over per-item opt-out + and a per-game switch). A shop that sells pulls gets two built-ins: its premium (limited) line, + `pulls: "premium"`, offered like any other, and its standard line, `pulls: "standard"`, offered + only when the new pref `standardPulls?: boolean` is true — absent is false, so an existing + install gains nothing until it asks. `offered()` applies it below the game rule and per-item + tracking: the Edit panel, *Your own* and the strip all see only what is offered, and Settings + shows the switch (*Include standard-banner pulls*, nested under the built-ins switch) only when + a listed game has a standard line, naming those lines in its hint. A test pins that every + standard line has a premium twin in its game on the same period. `trackRoutinePatch` still + hides every sibling, standard ones included, when a reader tracks one item of a game that is + off: they asked for one item, so a later *Include* does not bring that game's standard line + back on its own. Boopons count as premium — they pay for Bangboo pulls (owner, 2026-10-16). + +## Entries + +Weekly entries roll with the game's Monday reset (`startsOn: 1`) on the reader's server. + +| Id | Title | Period | Measure | Source (as of) | Owner check | +|---|---|---|---|---|---| +| `routine:genshin:weekly-bosses` | Weekly Bosses | week | 3 runs | genshin-impact.fandom.com/wiki/Weekly_Boss (2026-08-21) | 3 cost-halving runs and "every Monday 4AM GMT+1" (EU) confirmed in game by the owner, 2026-10-16 | +| `routine:genshin:battle-pass-exp` | Battle Pass weekly EXP | week | 10,000 EXP | …/wiki/Battle_Pass (2026-01-08) | 10,000 confirmed in game by the owner, 2026-10-14 | +| `routine:genshin:bounties` | Reputation Bounties | week | 3 bounties | …/wiki/Bounties (2026-06-13) | 3 a week, counted apart from Requests, and a Monday reset ("next refresh in 3 days" on Thursday) confirmed in game by the owner, 2026-10-16 | +| `routine:genshin:requests` | Reputation Requests | week | 3 requests | …/wiki/Request (2026-06-13) | 3 a week, counted apart from Bounties, confirmed in game by the owner, 2026-10-16 | +| `routine:genshin:realm-depot` | Realm Depot: Realm Treasures | week | ticked once | …/wiki/Serenitea_Pot/Realm_Depot (2026-10-12) | page says weekly; the **Monday confirmed in game** by the owner, 2026-10-16 ("refreshes in 3 days 3 hours 3 minutes" at 23:57 UTC on 15 Oct → Monday 03:00 UTC) — decision 1; a shape, not a figure (decision 2) | +| `routine:genshin:paimons-bargains` | Paimon's Bargains: Intertwined Fates | month, 1st | 5 fates | …/wiki/Paimon%27s_Bargains (2026-08-23) | stock 5 and "refreshes in 16d" on 16 Oct (→ 1 Nov) confirmed in game by the owner, 2026-10-16 | +| `routine:genshin:paimons-bargains-acquaint` | Paimon's Bargains: Acquaint Fates | month, 1st | 5 fates (**standard**, decision 10) | …/wiki/Paimon%27s_Bargains (2026-08-23) | page: Acquaint Fate stock 5 for Masterless Stardust, beside the Intertwined line | +| `routine:genshin:spiral-abyss` | Spiral Abyss | month, 16th | ticked once | …/wiki/Spiral_Abyss (2026-08-29) | measure is a shape (decision 2); 3h to reset at 23:5x UTC on 15 Oct (→ the 16th) confirmed in game by the owner, 2026-10-16 | +| `routine:genshin:imaginarium-theater` | Imaginarium Theater | month, 1st | ticked once | …/wiki/Imaginarium_Theater (2026-09-01) | measure is a shape (decision 2); 16d 3h to reset (→ 1 Nov) confirmed in game by the owner, 2026-10-16 | +| `routine:hsr:echo-of-war` | Echo of War | week | 3 runs | honkai-star-rail.fandom.com/wiki/Echo_of_War (2025-10-17) | page is a year old; 3 runs and the Monday reset confirmed in game by the owner, 2026-10-14 | +| `routine:hsr:nameless-honor-exp` | Nameless Honor weekly EXP | week | 8,000 EXP | …/wiki/Nameless_Honor (2026-08-26) | **confirmed in game** by the owner, 2026-10-14 (decision 1): the page states no cap; Monday from Echo of War's page | +| `routine:hsr:embers-exchange` | Embers Exchange: Star Rail Special Pass | month, 1st | 5 passes | …/wiki/Embers_Exchange (2026-07-12) | page says monthly; the **1st confirmed in game** by the owner, 2026-10-14 (decision 1) | +| `routine:hsr:embers-exchange-standard` | Embers Exchange: Star Rail Pass | month, 1st | 5 passes (**standard**, decision 10) | …/wiki/Embers_Exchange (2026-07-12) | page: stock 5, `refresh=m`; the 1st as for the Special Pass line | +| `routine:zzz:ridu-weekly` | Ridu Weekly | week | **2,100** points (was 1,300) | zenless-zone-zero.fandom.com/wiki/Ridu_Weekly (2026-08-31) | decision 3; 2,100 and the Monday reset (3d 2h on Friday 00:17 UTC) confirmed in game by the owner, 2026-10-16 | +| `routine:zzz:bounty-commissions` | Bounty Commissions (was "Lost Void Bounty Commissions") | week | 8,000 points | …/wiki/Hollow_Zero/Bounty_Commission (2025-03-21) | page is old; Lost Void page (2026-04-05) still says weekly; 8,000 shared by Lost Void and Enigma of the Labyrinth, Monday reset (3d 2h at 00:2x UTC Friday), confirmed in game by the owner, 2026-10-16 — title and unit follow the game | +| `routine:zzz:notorious-hunt` | Notorious Hunt | week | 3 runs | …/wiki/Notorious_Hunt (2026-02-26) | page states 3 a week, no day — Monday from Ridu Weekly's page; "up to 3 times per week" confirmed in game by the owner, 2026-10-16 | +| `routine:zzz:city-fund-exp` | New Eridu City Fund weekly EXP | week | 10,000 EXP | …/wiki/New_Eridu_City_Fund (2026-09-04) | **confirmed in game** by the owner, 2026-10-16 (decision 1): the page states no cap; Monday from Ridu Weekly's page | +| `routine:zzz:signal-shop-tapes` | Signal Shop: Encrypted Master Tapes | month, 1st | 5 tapes | …/wiki/Signal_Shop (2026-09-09) | page says monthly; the **1st confirmed in game** by the owner, 2026-10-16 ("refresh in 16d" at 00:19 UTC → 1 Nov) — decision 1 | +| `routine:zzz:signal-shop-master-tapes` | Signal Shop: Master Tapes | month, 1st | 5 tapes (**standard**, decision 10) | …/wiki/Signal_Shop (2026-09-09) | page: Fading Signal stock 5, `refresh=m`; the 1st as for the Encrypted line | +| `routine:zzz:signal-shop-boopons` | Signal Shop: Boopons | month, 1st | 5 Boopons | …/wiki/Signal_Shop (2026-09-09) | Bangbuck section, `refresh=m`; the owner confirmed in game, 2026-10-16, that Boopons sit there and asked for them as a second monthly target (they pay for Bangboo pulls); the monthly limit is on the discounted 20-Bangbuck line, "restock in 16d" (→ 1 Nov), confirmed in game by the owner, 2026-10-16 | +| `routine:endfield:weekly-routine` | Weekly Routine | week | 10 points | endfield.wiki.gg/wiki/Weekly_Routine (2026-04-11) | unchanged; title, target and the EU Monday reset hour confirmed in game by the owner, 2026-10-14 | +| `routine:endfield:focus-commissions` | Etchspace Salvage: Focus Commissions | week | 3 commissions | endfield.wiki.gg/wiki/Etchspace_Salvage (2026-09-01) | Monday from the wiki's own weekly-reset box, not this page; not yet confirmable in game (owner, 2026-10-14) — see TODO.md | +| `routine:wuwa:weekly-challenge` | Weekly Challenge | week | 3 claims | game8.co/games/Wuthering-Waves/archives/453471 (2026-09-30) || 3 a week ("3/3") confirmed in game by the owner, 2026-10-16 | +| `routine:wuwa:pioneer-podcast-exp` | Pioneer Podcast weekly EXP | week | **12,000** EXP (the wiki says 10,000) | wutheringwaves.fandom.com/wiki/Pioneer_Podcast/2026-02-05 (2026-07-03) | the v3.1 season page, the wiki's newest, is stale: **12,000 confirmed in game** by the owner, 2026-10-16 (decision 1) | +| `routine:wuwa:weekly-activities` | Weekly Activities | week | 6,000 points | game8.co/games/Wuthering-Waves/archives/605757 (2026-06-18) | 6,000 is the top milestone, not a stated cap; 6,000 max and the two modes (Fantasies of the Thousand Gateways, Phantasma Dreamland Rhapsoda) confirmed in game by the owner, 2026-10-16 | +| `routine:nikki:mira-journey-exp` | Mira Journey weekly EXP | week | 8,000 Journey EXP | infinity-nikki.fandom.com/wiki/Mira_Journey (2026-09-24) | the wiki answers again (2026-10-16); 8,000 confirmed in game by the owner, 2026-10-16 | +| `routine:nikki:realm-of-breakthrough` | Realm of Breakthrough | week | 2 trials | …/wiki/Realm_of_Breakthrough (2026-01-01) | two trials, once a week each; not yet confirmable in game (owner, 2026-10-16: story progress) — see TODO.md | +| `routine:nikki:resonance-revelation` | Resonance Store: Revelation Crystals | month, 1st | 5 crystals | …/wiki/Tranquility_Droplet (2025-12-26) | page marks the stock monthly; "monthly limit of 5" and "resets in 16d" (→ 1 Nov) **confirmed in game** by the owner, 2026-10-16 (decision 1) | +| `routine:nikki:resonance-resonite` | Resonance Store: Resonite Crystals | month, 1st | 5 crystals (**standard**, decision 10) | …/wiki/Tranquility_Droplet (2025-12-26) | page: stock 5, `refresh=m`; the 1st as for the Revelation line | +| `routine:nte:season-pass-exp` | Season Pass weekly EXP | week | 12,000 EXP | gamewith.net/nte/74371 (2026-09-03) || 12,000 confirmed in game by the owner, 2026-10-16 | +| `routine:nte:anomaly-pilgrimage` | Anomaly Pilgrimage | week | 3 claims | allthings.how/nte-weekly-activities-guide-every-reset-task-in-neverness-to-everness/ (2026-05-06) | sources conflicted (Game8's boss list, 2026-10-10: "once per week" per boss); **3 in total confirmed in game** by the owner, 2026-10-16 | +| `routine:nte:city-stamina` | City Stamina | week | 700 stamina | allthings.how/…-neverness-to-everness/ (2026-05-06) | page says "full bar to spend", no figure; **700 a week confirmed in game** by the owner, 2026-10-16 (decision 1) | +| `routine:nte:realm-of-greed` | Realm of Greed | week | ticked once | allthings.how/…-neverness-to-everness/ (2026-05-06) | owner asked for it, 2026-10-16; payout scales, so a shape (decision 2); the weekly reset confirmed in game ("Gold Heist resets every Monday at 5:00"), 2026-10-16; one payout a week is the guide's | +| `routine:nte:special-city-commission` | Special City Commission | week | ticked once | same page | owner asked for it; one claim a week and the weekly timer confirmed in game, 2026-10-16 | + +The sentence each figure rests on: + +- Weekly Bosses — "spend 30 Resin to claim the rewards from the first three weekly bosses … + reset at 4 AM server time every Monday." +- Battle Pass — "There is a weekly cap of 10000 EXP that can be obtained from daily and weekly + missions which resets on 4 AM server time each Monday." +- Bounties — "A total of 3 bounties can be completed each week"; Requests — "A total of 3 + requests across all nations can be completed each week." Monday: genshin-impact.fandom.com/wiki/Reset. +- Realm Depot — Realm Treasures: "This shop refreshes weekly"; the stock totals 13,100 Realm Currency. + The day is the owner's in-game timer. +- Paimon's Bargains — "It resets on the 1st day of each month"; Intertwined Fate stock 5. +- Spiral Abyss — "will reset once a month, occurring on the 16th of each month." +- Imaginarium Theater — "The first day of every month, the Imaginarium Theater will automatically reset". +- Echo of War — "three times a week … refresh every Monday at 04:00 AM (Server Time)." +- Nameless Honor — no page states the cap; the owner read 8,000 weekly EXP in game on 2026-10-14. + The page says only that 'players can complete various weekly and "This Period" missions'. +- Embers Exchange — the stock table marks Star Rail Special Pass (stock 5) `refresh=m`, monthly; no + day. The owner's in-game countdown on 2026-10-14 (03:51 CEST, 18d 1h) ends 1 Nov 02:51–03:51 UTC, + around Star Rail's EU reset at 03:00 UTC — the 1st. +- Echo of War, in game — the owner read 3 attempts and 5d 1h to reset at 03:49 CEST, 2026-10-14: + Monday 05:00 CEST. +- Ridu Weekly — "A total of 2,100 points can be accumulated each week … refreshing each Monday with server reset." +- Bounty Commissions — "refresh every Monday at 04:00"; table tops out at 8,000. +- Notorious Hunt — "a total of 3 challenges can be completed at no Battery Charge cost per week"; in + game, "You can earn Notorious Hunt rewards up to 3 times per week" (owner, 2026-10-16). +- New Eridu City Fund — no page states the cap; the owner read 10,000 weekly EXP in game on 2026-10-16. + The page's only 10,000 is the Premium Plan's bonus City Fund EXP, which is unrelated. +- Signal Shop — Fading Signal: "the monthly limits reset at the same time as other exchanges"; Encrypted + Master Tape stock 5, `refresh=m`. No day; the owner's in-game timer gives the 1st. + Bangbuck: Boopon (20 Bangbuck) stock 5, `refresh=m`; a second, unlimited Boopon line costs 40. +- Weekly Routine — "reset at 4:00 server time every Monday"; fixed tasks "always amount to 10 points total". +- Focus Commissions — "3 Focus Commissions will be available every week". +- Weekly Challenge — "You can only claim rewards from Weekly Challenges up to 3 times per week … + The weekly limit is reset every Monday at 4AM of your server time." +- Pioneer Podcast — "Weekly Highlights reset on Monday at 4:00 AM (Server Time)"; "Podcast EXP from + 'Seasonal Specials' quests do not count towards the 10,000 weekly cap." + The owner read 12,000 in game on 2026-10-16; the page's 10,000 is from v3.1 and no newer page exists. +- Weekly Activities — "Every Monday at 4:00 AM (Server Reset)"; "you can earn 6000 points by + completing stage 13". +- Mira Journey — "Players can earn up to a limit of 8000 Journey EXP a week." Reset — "The Weekly + Reset occurs every Monday at 04:00 (4:00 AM) server time", renewing "Mira Journey weekly tasks" + and "Realm of Breakthrough challenge refresh". +- Realm of Breakthrough — "Currently there are two Trials … Players can challenge Wish Master Chigda + & Guardian Beast Whirls once per week". +- Resonance Store — Tranquility Droplet inventory: Revelation Crystal, price 100 (`discount=40`), stock 5, + `refresh=m`. No day; the owner's in-game timer gives the 1st. +- NTE Season Pass — "There is a strict cap of 12,000 Experience Points per week … this cap only + applies to Daily and Weekly quests"; "Weekly quests reset every Monday at 5:00 AM Server Time." +- Anomaly Pilgrimage — "The reward pool is shared, so you get three reward claims total per week, not + three per boss"; "The window closes at the Monday reset." The owner confirmed 3 in total in game. +- Realm of Greed — "pays out a large Fons lump sum once per week"; overview table: "1 reward claim". +- Special City Commission — "The Old Mailbox in your second apartment delivers a once-per-week Fons + bounty"; "The reward is gated to a single claim per week." +- City Stamina — overview table: "Full bar to spend"; "If it has refilled to its full cap, the weekly + reset has already triggered". The owner read 700 weekly in game, 2026-10-16. +- All of these: "a tight weekly loop that resets every Monday at 5:00 AM server time". + +## Not shipped + +Looked for on 2026-10-14 and not shipped. Each is a candidate the owner may know a source for. + +| Game | Item | Why | +|---|---|---| +| Genshin | Stygian Onslaught | Tied to version releases, not a week or month | +| Star Rail | Forgotten Hall (Memory of Chaos), Pure Fiction, Apocalyptic Shadow | Six-week rotations, not weeks or months → sub-project 2; the owner's in-game end dates are in § Scope | +| Star Rail | Divergent Universe / Currency Wars points | A two-week period, not a week → sub-project 2. Owner, in game, 2026-10-14: the two modes share one cap of 18,000 points per period, and the current period ends Monday 2026-10-19 at Star Rail's EU reset (05:00 CEST) | +| Endfield | Stock Redistribution | "Some items may also refresh weekly" — no figure | +| Endfield | Protocol Pass weekly missions | Missions change every week; no fixed target or EXP cap stated, and the owner found none in game (2026-10-14) | +| Endfield | Algorithmic Memories, Credit Store, Arsenal Exchange | No figure; Beta-era; daily store; a shop rotation, not a chore | +| Nikki | Merit Arena, Pinnacle Contest | No wiki page (2026-10-16); Merit Arena's weekly caps change per version and only a fan account gives numbers; Pinnacle Contest runs in half-month periods → sub-project 2 | +| ZZZ | Shiyu Defense, Deadly Assault | Multi-week cycles → sub-project 2; the owner's in-game dates are in § Scope | +| Wuwa | Oscillated Coral exchange (gacha pulls) | Resets with each version update, not a week or month — the owner confirmed this in game, 2026-10-16. A dated window → sub-project 3 (§ Scope) | +| Wuwa | Afterglow Coral exchange, Souvenir Stores, Tactical Hologram shops | No limit, or no stated reset | +| Wuwa | Simulation Training, Forgery | Cost Waveplates; no weekly cap | +| Wuwa | Tower of Adversity Hazard Zone (28 days), Whimpering Wastes | Multi-week → sub-project 2; the owner's in-game dates for both are in § Scope | +| NTE | Tycoon Incentive Fund (Pink Paws Heist, Volley Star weekly match, Display Case idle earnings) | A 14-day cycle by the game's own guide, not a week → sub-project 2 (§ Scope). The guide this branch cites calls Pink Paws' cap weekly; the game disagrees. The cap also differs per player (Puka Membership Program) | +| NTE | Lost Exchange | Single launch-era source; nothing to count | +| NTE | Beyond the Rails | 14-day cycle → sub-project 2; the owner's in-game date is in § Scope | + +**One finding outside this change:** Game8's NTE boss page (2026-10-10) says the weekly timer +resets "every Monday at 4AM", while `games.ts` has NTE on 05:00 (Game-Time-Master, neverness.gg, +GameWith). If 04:00 is right, NTE's day keys are off by an hour. That needs checking in the game, +and changing it is a day-key change under AGENTS.md § Event IDs. Not touched here. +Re-checked 2026-10-16: Game-Time-Master's `game-data.js` (last changed 2026-10-10) still has NTE +Europe at `dailyReset: "05:00"`, `Etc/GMT-1`, as `ccc4eb6` took it; it lists daily resets only. +GameWith's season-pass page, which the NTE entry already cites, puts the *weekly* quests on +"every Monday at 5:00 AM Server Time". So Game8 stands alone, and 05:00 stays. +**Overturned by the game, 2026-10-16.** At 00:40 UTC on Friday the owner read the Special City +Commission's weekly timer as 3d 2h. A reset at 04:00 UTC (what `games.ts` has for Europe) would +have read 3d 3h; the reading lands on **Monday 03:00 UTC** — 05:00 CEST. Two explanations fit and +agree until the clocks change on 2026-10-25: (1) Game8's 04:00 on a fixed UTC+1, or (2) 05:00 on a +Europe server that follows Central European summer time, which allthings.how hints at ("Europe +uses BST or CET equivalents") and Game-Time-Master's fixed `Etc/GMT-1` would miss. After 25 Oct a +weekly timer tells them apart: (1) puts the reset at 03:00 UTC still, (2) at 04:00 UTC. Not +changed with the built-ins — it re-labels logged ticks (AGENTS.md § Event IDs) — but in its own +`fix(games)` commit on this branch. +The game's own text leans to (2): Realm of Greed says "Gold Heist resets every Monday at 5:00" +(owner, 2026-10-16). With the reset seen at 03:00 UTC, that 5:00 is UTC+2 — Central European +summer time — where (1) would print 4:00. One reading after 2026-10-25 still confirms it. +**Then the fund's timer ruled (2) out, 2026-10-16.** At 00:43 UTC the Tycoon Incentive Fund read +10d 2h, ending Monday 2026-10-26 at **03:00 UTC** — the day *after* the clocks change, where (2) +would put 04:00 UTC (10d 3h). The one reading that fits every observation — both timers and the +game's "5:00" — is (3): **05:00 on a Europe server fixed at UTC+2**, i.e. 03:00 UTC all year, as +Infinity Nikki's Europe server already is in `games.ts`. That is a one-number change +(`resetOffsets.europe: 2` for `nte`), still a day-key change and still outside this branch. + +## Testing + +- `test/routines.test.ts`: every entry parses and cites a dated `https` page (existing); a per-game + table pins each title, period and measure to § Entries; hiding narrows the rule and moves + nothing else; `hiddenAfter` and `trackRoutinePatch`, including tracking one of an off game; + `routinesHidden` survives `restorePrefsValue` with junk dropped. +- Standard pulls (decision 10): every standard line has a premium twin on the same period; standard + lines are left out of `activeRoutines` unless asked for, and nothing else moves; `standardPulls` + survives `restorePrefsValue` with junk dropped. `test/controls.test.tsx`: the switch is offered + beside the built-ins switch, names the lines, reads its pref, and is absent when no listed game + has a standard line. +- `test/edit-dailies.test.tsx`: chore, built-ins and events listed per game in that order, each + with Stop tracking; Track · N counts all three kinds; a game with only standing items gets a group. +- `test/custom-ui.test.tsx`: a hidden built-in stays listed in *Your own*, marked and trackable. + +## Docs + +PRD F17 (built-ins list and tracking), PRD F12's Edit panel paragraph (renamed controls), +DATA-MODEL (`routinesHidden` and `standardPulls` in the prefs block and the built-in tasks paragraph), and a changelog +entry once the commit exists.