Commit Graph
242 Commits
Author SHA1 Message Date
Lucas WintherandClaude Opus 5.5 54d13d7472 feat: shine a code redeemed or an event completed on its way out
A code redeemed on its last server sweeps in the game's colour and greys
in place for 0.8 s, then lands in Redeemed or expired. A completed event
greys and shines while its Moved to Archive notice holds, now 0.9 s
rather than 1.5 s, which read as unresponsive; an ignored one only greys.

Settings → Appearance gains Motion & celebrations as three What to track
cards: Reduce motion (stops every animation and the fireworks, adding to
the device's own setting), Fireworks, and Shine. Reduce motion locks the
other two off without forgetting them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 04:26:50 +02:00
Lucas WintherandClaude Opus 5.5 9c22a85134 fix(settings): give Settings pills room and the outlined buttons' size
Theme and Timeline design pills sat 1px under their help text and, in
Relaxed, in a dark well at 12px/32px beside 13px/37px outlined buttons,
which read as off-centre. Under a help line they now sit 16px below it,
like the scheme choices, and in Settings take the buttons' type, height
and a hairline tray.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 04:24:53 +02:00
Lucas WintherandClaude Opus 5.5 83a255754c feat(settings): keep the game tab when switching games
Codes in one game now opens Codes in the next. The reader app holds the
tab and GameSettings reads it, instead of each game page minting its own.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 03:39:52 +02:00
Lucas WintherandClaude Opus 5.5 b8e8d44816 feat(codes): mark a code dead once the owner confirms it in game
Game8 still lists Y1INABQB6DEX, 2BJ64QRZ7RT8 and PLDXIB886Y1S as active
Genshin codes after the game refused them. CODE_CHECKS records the
owner's in-game check; build-codes stamps the matching code confirmedDead,
and the Codes tab shows it expired: "Confirmed expired in game, 2026-10-20."

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 03:34:52 +02:00
Lucas WintherandClaude Opus 5.5 f17b7985ef feat(celebrations): a burst for each thing finished, and a switch for all of it
The redesign only celebrated a finished section, so ticking one daily or
completing an event drew nothing. Now a daily ticked, a routine met, an
amount typed to its target and an event marked completed each fire the
small burst; the item that finishes every daily or a game's routines gets
only the grand celebration. Settings → Appearance → Celebrations
(prefs.celebrations, on unless false) turns every firework off.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 22:46:46 +02:00
Lucas WintherandClaude Opus 5.5 874d8627a2 feat(tour): a welcome of its own, the owner's order, and the way to codes
The tour opens on a welcome over the dimmed Checklist, then shows the bar
along the top, then the Checklist and Timeline with their looks, Routines,
Archive and Settings. Codes get three steps that walk the way in (the game
in Settings, its Codes tab, the codes), and the last step points at Replay
the introduction. A replay now dims and locks the page like the first run,
keeping only Close tour. Subjects out of sight scroll into view, and the
ring stays inside the window.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 05:27:02 +02:00
Lucas WintherandClaude Opus 5.5 3b29010e7c feat(codes): redeemed and expired codes move below, and new codes are marked
A game's Codes tab lists the codes still to use first; a code redeemed on
every server played, or past its stated expiry, is greyed in a "Redeemed or
expired" section below. A date-only expiry passes once that date has ended
everywhere. Settings → Your games marks a followed game with its count of
unseen, still usable codes until its Codes tab is opened.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 05:15:36 +02:00
Lucas WintherandClaude Opus 5.5 5be04a7439 feat(tour): highlight each step, and make the comparing steps try both looks
Owner feedback on the forced tour. Each step rings what it is about and,
while forced, dims the rest of the page around it. "Pick a layout" and the
Timeline step hold Continue until both options have been on screen, scroll
their subject to the top of the window and, on wide screens, move the card
to the right edge so the page has room to show the difference.

Guards for the reported snap-back and endless tour, which did not
reproduce: the effect that moves an unseen reader to Relaxed fires at most
once per page load and never after the tab saw the tour done, and setup
saves only the prefs it changed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 05:10:42 +02:00
Lucas WintherandClaude Opus 5.5 94fba4d7b5 fix(reader): open the save under the reader lock, and cap automatic backups
Follow-up to the 2026-10-18 review of the v1→v2 migration. Start-up
(finishing a pending restore, then migrating or reconciling) now runs under
the lock every save takes, so a second tab's save cannot be overwritten;
where no lock exists it opens unlocked, as before. The automatic backups get
a size cap like Back up now's: past it the oldest are dropped, never the
newest, leaving the main save room to grow.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 05:09:58 +02:00
Lucas WintherandClaude Opus 5.5 d8ce442cff feat(tour): everyone takes the tour once, and tries the layouts in it
The tour now floats over the page it describes and must be finished
before the app can be used: new readers straight after setup, returning
readers on their next visit, and anyone who saw the earlier tour. The
page behind stays visible and scrollable but inert.

"Pick a layout" (on the Checklist) and the Timeline step switch Relaxed /
Structured and New / Classic in place; the selected look is kept.
Returning readers start on Relaxed. A replay from Settings stays
optional and closable.

redesignTourSeen now records new / returning / replay / 2026-10-tour-2;
any other value means not yet taken.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 04:45:02 +02:00
Lucas WintherandClaude Opus 5.5 254e78f4d1 feat(codes): redeem codes for eight more games, and where to redeem them
Game8 codes pages for Star Rail, ZZZ, Wuthering Waves, Endfield, NTE,
P5X, Chaos Zero Nightmare and Umamusume, read by one table parser told
each page's active-codes heading. Each page was fetched once and pinned
as a fixture. Infinity Nikki's page is stale (still titled July 2025)
and is left out.

The Codes tab links the publisher's own redeem page where one exists
(Genshin, Star Rail, ZZZ) and gives the in-game route for every game,
and names the server on a redeemed checkbox only when there are two.

Settings uses the width of a large screen: content up to 1320px and the
menu column running the full height.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 04:20:45 +02:00
Lucas WintherandClaude Opus 5.5 50c6e91b00 feat: the redesigned Event Clock
The new reader app replaces the old UI: Checklist with a rail (focus
pills, Next to expire, today's dailies, pinned routines), Timeline in a
new and a classic look, Routines, Archive and a Settings area, in a
Structured (default) and a Relaxed interface. It follows the approved
Round 6 B and Round 7 mockups, corrected screen by screen with the owner.

Reader data moves to a v2 store (gacha-tracker:v2:*). Existing v1 data
is migrated on first load, a recovery copy is written first, and the v1
keys are never removed, so a rollback finds them unchanged. Redeem codes
for Genshin arrive as their own feed.

Also: live's urgency ramp, editable per theme; completion and
section-complete fireworks; a returning-user tour; the design mockups,
specs, plans, reviews and handoff record.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 01:55:16 +02:00
Lucas WintherandClaude Opus 5.5 57406979c2 fix(sources): a pass page between runs says so, rather than reading as broken
When a pass's last listed run ends before the wiki adds the next one, the
history table parses to zero. ZZZ's City Fund would have done that on
19 Oct and been counted as a failed source. statesNoEvents now answers
for the page: its pass table is there and dates its runs, all of them
past. Found in the whole-branch review.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 06:35:33 +02:00
Lucas WintherandClaude Opus 5.5 1b116218e3 fix(sources): Mira Journey ends at Asia's reset after the version's last day
The Version table prints the version's last day as its End Date. Read as
an ordinary day-precision end, the event left the calendar 9 to 24 hours
before the pass did. The owner's timer on Europe put the end at about
20:00 UTC on 29 Oct: Asia's 04:00 reset opening the 30th, for every
server. The source's entry now says so, with that evidence, and the
event ends at exactly 2026-10-29T20:00Z. Found in the whole-branch
review.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 06:35:02 +02:00
Lucas WintherandClaude Opus 5.5 b6cc3b1f51 revert: drop Genshin's Miliastra Pass source
Fandom's Event page, an existing source, already lists the pass as
"Silvery Moonlight Chronicle" with the same dates, and the merge folded
the new copy into it. The feed was unchanged, so a second source for one
event is cost with nothing to show. This reverts 9f8150f.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 06:28:51 +02:00
Lucas WintherandClaude Opus 5.5 ec669675ed feat(sources): Infinity Nikki's Mira Journey window, from its version
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 06:24:40 +02:00
Lucas WintherandClaude Opus 5.5 a6a8efa661 feat(sources): ZZZ's City Fund pass windows from Fandom
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 06:22:05 +02:00
Lucas WintherandClaude Opus 5.5 9f8150fda7 feat(sources): Genshin's Miliastra Pass windows from Fandom
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 06:20:22 +02:00
Lucas WintherandClaude Opus 5.5 0a4be4e339 feat(sources): Star Rail's Nameless Honor pass windows from Fandom
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]>
2026-10-16 06:17:00 +02:00
Lucas WintherandClaude Opus 5.5 40d0dbef5a fix(build): pick a source's own fixture, not a sibling page's on the same site
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]>
2026-10-16 06:10:51 +02:00
Lucas WintherandClaude Opus 5.5 5080397999 fix(dailies): a built-in on another server's clock leaves the header countdown alone
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]>
2026-10-16 05:46:50 +02:00
Lucas WintherandClaude Opus 5.5 4427f6c2e5 fix(tasks): a cycle chip counts its days left whether ticked or not
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]>
2026-10-16 05:46:50 +02:00
Lucas WintherandClaude Opus 5.5 524b6f2598 feat(routines): NTE's Beyond the Rails and Tycoon Incentive Fund
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]>
2026-10-16 05:40:54 +02:00
Lucas WintherandClaude Opus 5.5 4aa9387683 feat(routines): Wuthering Waves' Tower of Adversity
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]>
2026-10-16 05:39:17 +02:00
Lucas WintherandClaude Opus 5.5 1c574bddc3 feat(routines): ZZZ's Shiyu Defense and Deadly Assault
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]>
2026-10-16 05:39:14 +02:00
Lucas WintherandClaude Opus 5.5 2c3d9537d9 feat(routines): Star Rail's endgame modes and weekly points
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]>
2026-10-16 05:38:36 +02:00
Lucas WintherandClaude Opus 5.5 8d0b45f83a fix(tasks): refuse a cycle start that is not a real date
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]>
2026-10-16 05:37:36 +02:00
Lucas WintherandClaude Opus 5.5 8eef068332 feat(routines): a built-in can roll on one server's reset for everyone
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]>
2026-10-16 05:31:28 +02:00
Lucas WintherandClaude Opus 5.5 be3c1408d2 feat(tasks): set up a task that repeats every N days
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]>
2026-10-16 05:30:32 +02:00
Lucas WintherandClaude Opus 5.5 a80f581d8b feat(tasks): a task can repeat every N days from a dated start
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]>
2026-10-16 05:25:14 +02:00
Lucas WintherandClaude Opus 5.5 9d5b473218 fix(games): roll NTE's Europe day at 05:00 UTC+2, as the game does
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]>
2026-10-16 03:00:58 +02:00
Lucas WintherandClaude Opus 5.5 af2ad942cd feat(routines): let a reader add standard-banner pulls beside the premium ones
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]>
2026-10-16 03:00:52 +02:00
Lucas WintherandClaude Opus 5.5 9cf7649cc2 feat(routines): Infinity Nikki's weekly and monthly built-ins
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]>
2026-10-16 03:00:48 +02:00
Lucas WintherandClaude Opus 5.5 88c850416f feat(routines): NTE's weekly built-ins
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]>
2026-10-16 03:00:45 +02:00
Lucas WintherandClaude Opus 5.5 d635780c72 feat(routines): Wuthering Waves' weekly built-ins
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]>
2026-10-16 03:00:42 +02:00
Lucas WintherandClaude Opus 5.5 39e04c6139 feat(routines): Endfield's Focus Commissions
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]>
2026-10-16 03:00:38 +02:00
Lucas WintherandClaude Opus 5.5 6d6db9c11c feat(routines): more of ZZZ's weekly and monthly built-ins
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]>
2026-10-16 03:00:35 +02:00
Lucas WintherandClaude Opus 5.5 387fc1d2e4 fix(routines): Ridu Weekly tops out at 2,100 points, not 1,300
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]>
2026-10-16 03:00:31 +02:00
Lucas WintherandClaude Opus 5.5 cd52641d88 feat(routines): Star Rail's weekly and monthly built-ins
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]>
2026-10-16 03:00:28 +02:00
Lucas WintherandClaude Opus 5.5 af6a02cb34 feat(routines): Genshin's weekly and monthly built-ins
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]>
2026-10-16 03:00:25 +02:00
Lucas WintherandClaude Opus 5.5 f322061c88 feat(routines): say "weekly and monthly" for built-ins
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]>
2026-10-16 03:00:21 +02:00
Lucas WintherandClaude Opus 5.5 3fd2b3c2ed feat(dailies): track or stop tracking anything in the strip from Edit
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]>
2026-10-16 03:00:18 +02:00
Lucas WintherandClaude Opus 5.5 612e0a23e4 feat(routines): let a reader stop tracking one built-in
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]>
2026-10-16 03:00:15 +02:00
Lucas WintherandClaude Opus 5.5 16c277b403 feat(merge): pair two copies when one's summary names the other
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]>
2026-10-14 17:49:26 +02:00
Lucas WintherandClaude Opus 5.5 1f6b8fd1d6 feat(merge): pair a title with a qualifier in front of it
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]>
2026-10-14 17:48:53 +02:00
Lucas WintherandClaude Opus 5.5 2924605bd4 feat(feed): name the ids merge absorbed, and carry marks off them
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]>
2026-10-14 17:48:15 +02:00
Lucas WintherandClaude Opus 5.5 59403ca2cc fix(game8): drop the Battle Pass label Fandom does not print
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]>
2026-10-14 17:47:28 +02:00
Lucas WintherandClaude Opus 5.5 7c8fa7febc feat(client): move readers' marks off event ids that stop being published
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]>
2026-10-14 17:46:31 +02:00
Lucas WintherandClaude Opus 5.5 b219c98c1b fix(forms): don't ask for an end date the form is hiding
With "Comes back after a wait" and "I don't know when it ends" both
chosen, the end field is hidden, yet the still-needed line asked for "an
end date". It now names the way out: an end date, or another repeat.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 03:18:22 +02:00
Lucas WintherandClaude Opus 5.5 6c66b812b1 feat(forms): start an event or a task from an example, and say what Save needs
Readers who knew what they wanted could not see which answers in Add an
event or Add a task produced it. Both add forms now open with a row of
examples (templates.ts) that set the form's shape only: kind, how often,
how it repeats, how it is measured. Never a name, date, target or game,
and no date is guessed, so nothing an example set can be saved unread.

Both forms also had a pass: plain words and pills for how often and
repeat, the name asked first and the kind after the dates, each message
beside its field, and a "Still needed" line read from the same check that
disables Save. The event form's derived state is now one pure function,
eventFormState, so the examples are proved to complete into a saveable
event without a click.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 03:10:15 +02:00