Commit Graph
534 Commits
Author SHA1 Message Date
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 b1a3de7690 docs: drop the Impeccable sidecar, and stop counting tests in AGENTS.md
CI / Typecheck, test, feed (push) Successful in 13s
CI / Build site (push) Successful in 7s
CI / Container image (push) Successful in 32s
.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]>
2026-10-14 03:18:29 +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
gitea-actions[bot] efd6eff084 chore(data): refresh source snapshots
Automated fetch from Refresh sources run 323.
2026-10-14 01:12:57 +00:00
Lucas WintherandClaude Opus 5.5 b174295e48 chore(changelog): note examples to start from in the add forms (6c66b81)
CI / Typecheck, test, feed (push) Canceled after 0s
CI / Build site (push) Canceled after 0s
CI / Container image (push) Canceled after 0s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 03:12:19 +02:00
Lucas WintherandClaude Opus 5.5 0234478db0 docs: record examples to start from, and the pass over the add forms
PRD F13 said the form asked how often after Kind and had no word on
examples; F17 and DESIGN.md had no example row. Adds the spec and plan,
and ticks the TODO item.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 03:11:58 +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
Lucas WintherandClaude Opus 5.5 0701e5e16e docs: record why hololive Dreams stopped refreshing, and what lapsed means
CI / Typecheck, test, feed (push) Successful in 13s
CI / Build site (push) Successful in 7s
CI / Container image (push) Successful in 31s
SOURCES.md § 16 holds the diagnosis (run 317's rejected zeros, the page
unchanged in shape with nothing current since 19 Sep) and the replacements
assessed and declined: NamuWiki behind a Cloudflare challenge, an official
site with no event posts, no Game8 page. AGENTS.md says when a person may set
`lapsed` and what it does not excuse. TODO ticks the item and notes the
cosmetic "last confirmed never" seen in the CI state.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 02:35:16 +02:00
Lucas WintherandClaude Opus 5.5 ae701de74e feat(refresh): record a lapsed source instead of failing every run on it
holodori.wiki still answers 200 and still parses, but its editors stopped
adding events after 19 Sep 2026, so every cycle parsed to zero, was rejected,
and after three cycles turned the refresh workflow red over something no code
here can fix. No fetchable replacement exists.

A registry entry can now carry `lapsed: { recorded, reason }`, written by a
person. Refresh reports such a source's empty 200s as a warning rather than
broken; any other status is still broken, and the first cycle that lists
events again warns that the record should come out. Readers see no change:
the held snapshot keeps ageing and the staleness footer still says so.

The 2026-10-14 page is kept as a fixture, pinning that the template still
matches and only the current table is empty.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 02:34:45 +02:00
Lucas WintherandClaude Opus 5.5 3d32ab8d21 chore(changelog): note per-game switches for chores and built-ins (a39c6a8)
CI / Typecheck, test, feed (push) Successful in 14s
CI / Build site (push) Successful in 8s
CI / Container image (push) Successful in 32s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 02:21:19 +02:00
Lucas WintherandClaude Opus 5.5 094e67d985 docs: record per-game switches for chores and built-ins
The data model, PRD F17, README and DESIGN described one global chores
switch and a checkbox per game for built-ins. Adds the spec and plan, and
ticks the TODO item.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 02:20:40 +02:00
Lucas WintherandClaude Opus 5.5 a39c6a8398 feat(settings): choose games for chores and built-ins behind one switch each
What you see drew a checkbox per game for built-ins, a list that grows
with every game and every built-in, and offered no per-game answer for
chores at all. Each now has one switch, a line naming the games that
differ, and Choose games to change them, in the focus chip's colours.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 02:20:33 +02:00
Lucas WintherandClaude Opus 5.5 47c395379b feat(prefs): switch chores and built-in tasks per game, on one rule
Chores had one global switch and built-ins only a per-game opt-in, so the
two answered the same question two different ways. perGame.ts is now the
one rule for both: a global answer, then the games that differ.

Nothing is migrated. routineGames keeps its meaning as the built-ins'
on-list and an absent showRoutines still reads as off, so every reader's
answers, and an older cached tab, see what they saw before. The strip
stops asking about one game once the reader has answered for all.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 02:20:18 +02:00
Lucas WintherandClaude Opus 5.5 7a68613f3e chore(changelog): note editing the dailies strip in place (9477ac5)
CI / Typecheck, test, feed (push) Successful in 14s
CI / Build site (push) Successful in 7s
CI / Container image (push) Successful in 33s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 01:41:59 +02:00
Lucas WintherandClaude Opus 5.5 9477ac54b6 feat(dailies): edit the strip in place, and give weekly and monthly tasks their own row
Giving Genshin's "To Temper Thyself and Journey Far" its five-of-seven goal
meant finding it in the list, opening its sheet, saying it repeats and only
then setting the goal. The strip now has an Edit mode beside Catch up that
lists its events by game with their goals, opens the sheet's goal control in
place, and adds any running event a game at a time. It calls the same
setDaily/setGoal the sheet does, so it can store nothing the sheet would not.

Weekly and monthly tasks are not due tonight, so they move to a row under the
dailies, and each period can be switched off (showWeeklyTasks,
showMonthlyTasks; default on, so nothing disappears on upgrade).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 01:41:37 +02:00
gitea-actions[bot] 3c928ee795 chore(data): refresh source snapshots
Automated fetch from Refresh sources run 317.
2026-10-13 17:28:26 +00:00
Lucas WintherandClaude Opus 5.5 88596f9928 docs(todo): find out why hololive Dreams stopped refreshing
CI / Typecheck, test, feed (push) Successful in 13s
CI / Build site (push) Successful in 7s
CI / Container image (push) Successful in 15s
Its source was last confirmed on 2026-09-22 and nothing has landed since.
The item records what the repo shows, how to find the cause from the
refresh runs, and what each likely cause calls for.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:43:26 +02:00
Lucas WintherandClaude Opus 5.5 e467582350 chore(changelog): note upcoming events shown to new readers
CI / Typecheck, test, feed (push) Successful in 13s
CI / Build site (push) Successful in 8s
CI / Container image (push) Successful in 31s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:42:17 +02:00
Lucas WintherandClaude Opus 5.5 5297b8ead9 feat(prefs): show events that haven't started to new readers
A new reader should see what's coming before deciding they don't want
it. It's set at first-run setup rather than in the defaults, so an
existing install whose saved prefs predate the field keeps its answer
instead of having it switched on underneath it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:42:05 +02:00
Lucas WintherandClaude Opus 5.5 ff5c5f8533 docs(todo): templates and a UI/UX pass for the add-event and add-task forms
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:40:48 +02:00
Lucas WintherandClaude Opus 5.5 16d5d304f7 docs(todo): rework What you see toggles to global and per game
Check-in goals shipped, so that item is ticked. The new item records
that the daily chores (global only) and built-in weekly tasks (one
checkbox per game) should share one pattern, a global switch with
per-game exceptions, without a checkbox per game.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:39:45 +02:00
Lucas WintherandClaude Opus 5.5 08bbba65ff docs: move what lived only in agent memory into the repo
CI / Typecheck, test, feed (push) Successful in 13s
CI / Build site (push) Successful in 7s
CI / Container image (push) Successful in 15s
Four lessons were known to one agent's private notes and to nobody else.
They now live where every agent reads: how Gitea Actions differs from
GitHub Actions, the owner's decision to refresh unreachable sources by
hand rather than relax the robots gate, how to look at the built app in
a headless browser and its traps, and one command per shell call.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:38:28 +02:00
Lucas WintherandClaude Opus 5.5 2da7f20905 docs: keep lessons in the repo, and record two learned today
Anything only in an agent's private memory reaches no one else. AGENTS.md
now says so, and records two lessons from today: push to Gitea only,
because it mirrors to the GitHub copy the changelog links into; and the
image build runs the suite without docs/ or git, so tests must not read
them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:36:02 +02:00
Lucas WintherandClaude Opus 5.5 fc58cf175f fix(changelog): check spec paths outside the image build
CI / Typecheck, test, feed (push) Successful in 14s
CI / Build site (push) Successful in 8s
CI / Container image (push) Successful in 31s
The image build runs the suite without docs/, which .dockerignore
excludes, so asserting that each note's spec exists on disk failed
there and blocked the image. The test now checks a path's shape;
check-changelog.ts checks the file exists, the same split the commit
refs already have for CI's shallow checkout.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:34:47 +02:00
Lucas WintherandClaude Opus 5.5 ab3173adf0 fix(refresh): don't call a stored copy "nothing newer", and point an entry at its feature
CI / Typecheck, test, feed (push) Successful in 15s
CI / Build site (push) Successful in 8s
CI / Container image (push) Failing after 29s
When the network failed behind the service worker, it answered from its
own store. Check for new data then said nothing newer was published when
the server was never reached. The worker now marks that copy, and a fresh
check treats it as unreachable; ordinary loads still use it offline.

The built-in tasks entry linked to a follow-up fix instead of the
feature, and the changelog spec's details now match what shipped.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:31:04 +02:00
Lucas WintherandClaude Opus 5.5 1fc47e2864 chore(changelog): announce the changelog, and make entries a convention
The changelog's own entry names the commit before this one, since a
commit cannot contain its own hash. AGENTS.md now asks every
reader-visible change for an entry, and every multi-commit feature for a
note, so the record keeps up. PRD F18 and the storage and design records
describe what shipped.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:27:25 +02:00
Lucas WintherandClaude Opus 5.5 65505e17b5 feat(changelog): say what's new after an update, and keep the full record
A card above the lists shows the entries the reader hasn't seen, five at
most; Got it records the newest. The footer opens the changelog: release
notes with their commit range and specs, the short entries each covers,
and the rest by month.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:26:21 +02:00
Lucas WintherandClaude Opus 5.5 a74bbd3efe feat(changelog): remember the newest change the reader has seen
First-run setup marks a new reader up to date, since changes mean nothing
before you've used the app. An absent marker therefore means an install
from before the changelog, which is what lets the launch be announced to
existing readers once.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:24:05 +02:00
Lucas WintherandClaude Opus 5.5 238d21686a feat(changelog): write down what changed, tied to git
Forty-four reader-facing entries and ten release notes, backfilled from
the history and the specs, each naming the commit or range it describes.
Tests pin the shape; a script checks the refs exist, since CI's shallow
checkout can't.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:23:01 +02:00
Lucas WintherandClaude Opus 5.5 6b21b88f98 docs: plan the in-app changelog
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:21:43 +02:00
Lucas WintherandClaude Opus 5.5 1c7df637a4 fix(routines): test the copy, name what Yes agrees to, and true up the docs
Make it mine's copying was inline in App and untested; it is now a pure
function with a test, so a change to either store can't make the copy
silently arrive empty. The question's buttons now say what they answer
when heard out of context. The prefs block and the spec now match what
shipped.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:19:16 +02:00
Lucas WintherandClaude Opus 5.5 f7ba86e6e5 feat(footer): let the reader check for new data
A reload can be served the browser's cached feed for minutes. The button
beside the data's age asks the server past that copy, swaps in a newer
feed without reloading, and says honestly what came back. Newer is
judged on events and sources, never the build stamp. The age now says
"just now" rather than "ended ago" when a fresh feed is a moment ahead
of the page's clock.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:17:20 +02:00
Lucas WintherandClaude Opus 5.5 bcbd3cc188 docs: record built-in weekly tasks
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:13:30 +02:00
Lucas WintherandClaude Opus 5.5 08269b5d5c fix(settings): count tasks in the Your own summary
A reader whose only own items were tasks was told they had none yet.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:13:18 +02:00
Lucas WintherandClaude Opus 5.5 624c725cbf feat(settings): switch built-in weekly tasks per game, and make one your own
The switch sits beside the daily chores and answers the strip's question
too. Built-ins are listed with a link to their dated source. Make it mine
copies one into the reader's tasks, numbers and ticks included, and hides
the original while the copy exists. It's additive, so deleting the copy
brings the original back as it was.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:10:58 +02:00
Lucas WintherandClaude Opus 5.5 228ce9132d feat(dailies): offer a game's built-in weekly tasks, and show them once on
The strip asks once, in one line, about a game on screen that has
built-ins. Yes puts them beside its dailies, drawn and counted like the
reader's own tasks, with a tooltip giving the source's date.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:09:25 +02:00
Lucas WintherandClaude Opus 5.5 bfd79c295e feat(routines): record which games' built-ins are on, and who was asked
Both prefs are absent unless the reader answers, so built-ins are opt-in
for every install, old ones included. The question is asked only about a
game on screen, and only once. A built-in the reader made their own
stays hidden while the copy exists.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:07:31 +02:00
Lucas WintherandClaude Opus 5.5 8aa820e2c0 feat(routines): ship sourced weekly tasks for ZZZ and Endfield
Ridu Weekly (1,300 points) and the Weekly Routine (10 points), each with
the page that states it and that page's own date, so a figure from an
old guide shows its age. Routines share the task shape, so they draw and
count like a reader's own.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:06:34 +02:00
Lucas WintherandClaude Opus 5.5 641c6a52b9 docs: plan built-in weekly tasks, phase 2b
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:03:36 +02:00
Lucas WintherandClaude Opus 5.5 114a39867a docs: specify the changelog, and source the first built-in tasks
The changelog has two tiers, each tied to git: short entries shown after
a reload, and release notes summarised from the history and specs.
Ridu Weekly (1,300) and the Weekly Routine (10) are now sourced. The
first guesses of 2,100 and 10 were checked against the owner's links.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:02:16 +02:00
Lucas WintherandClaude Opus 5.5 5a4c746a44 fix(tasks): keep a task whole through import and edit, and fix two counts
Review found that import and edit rebuilt a task from this build's parse.
That stripped any field it didn't know, and import dropped a newer
version's task entirely. Both now keep the record as stored and validate
only to display it.

An event whose goal is points can't be ticked, so it no longer counts as
waiting today: it counts with its week. The month-day field reset
itself to 1 when emptied; it now keeps a draft.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 13:54:29 +02:00
Lucas WintherandClaude Opus 5.5 54d8424d1e docs: record weekly and monthly tasks
The product, storage and design records now cover F17. They say why the
task and amount stores, unlike the custom-event store, never filter on
load, which is the rule a future store would most likely copy wrongly.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 13:50:08 +02:00
Lucas WintherandClaude Opus 5.5 45f24cf0cf fix(dailies): give weekly and monthly counts their own line
In the rail, three counts on one heading line wrapped it and broke the
reset countdown across two lines.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 13:50:07 +02:00
Lucas WintherandClaude Opus 5.5 1edce31210 feat(settings): add, edit and delete weekly and monthly tasks
They live in Your own, beside the reader's games and events. Every field
has a default the reader can accept unread (weekly, from Monday, ticked
off once) except the target, which nobody can guess for them. Save is
offered only when the store would accept what was typed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 13:47:46 +02:00
Lucas WintherandClaude Opus 5.5 d0b295c02f feat(detail): let an event's goal be points, entered in the sheet
Some events want a number of points rather than a number of days. The
goal control gains Days and Points. Switching period keeps the measure
and the number, and the sheet keeps this period's number editable in
place. A target is capped where the schema reads it back, so a huge
number can't silently become no goal.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 13:46:13 +02:00
Lucas WintherandClaude Opus 5.5 595ae55f4a feat(dailies): put weekly and monthly tasks beside a game's dailies
Tasks sit at the end of their game's group and are counted by their own
period, so a chore due Sunday is not "waiting on you today" every
morning. A number chip opens an editor under the strip instead of
ticking, since a chip is one target. Catch up offers last period's
number the way it offers yesterday's tick.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 13:44:57 +02:00
Lucas WintherandClaude Opus 5.5 e97e8b002f feat(export): carry tasks and amounts in the backup
They exist on this device and nowhere else, so an export without them is
a lossy backup. Both are additive keys, as custom games were: older files
lack them and still import. Tasks travel as stored, including any this
build cannot read.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 13:34:56 +02:00
Lucas WintherandClaude Opus 5.5 c0a0b94054 feat(tasks): store the reader's tasks and the numbers they enter
Both stores keep what is on disk and validate where they read, unlike the
custom-event store. Filtering on load would let the next write delete a
newer version's records. Import merges by id, or by item and period for
amounts, and the later edit wins, so a restored backup cannot roll a
week back.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 13:33:59 +02:00
Lucas WintherandClaude Opus 5.5 9c2d63b73b feat(task): model the reader's own weekly and monthly tasks
A task is a period that rolls on the game's reset and a measure that
fills it: days ticked, or a number against a target. Its status is the
goal status shape, so the dailies strip treats it like any other item.
Its ids get their own reserved space, as do the built-ins to come.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 13:32:13 +02:00
Lucas WintherandClaude Opus 5.5 e7ee43f92d feat(goal): let a goal be a number against a target, and a period a month
Weekly chores like 2,100 activity points are a number, not a count of
days, and monthly ones need a month. The status shape now carries its
measure and period start, so tasks can reuse it whole.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 13:30:47 +02:00