diff --git a/CLAUDE.md b/CLAUDE.md index 0dc37c0..707e495 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -211,9 +211,12 @@ event's length. It adds **no schema field**, so the feed contract is untouched. - **A repeating event the reader marked done leaves the strip.** They have said there is nothing left to do; keeping a tickable chip for it is the app arguing with them. Their logged days are untouched, so unmarking it brings the chip and the streak straight back. -- **Detection is a default, not a verdict.** The reader can mark any event as repeating, or unmark - one detection got wrong (`progress.daily`, resolved by `resolveDaily`), and `prefs.detectDaily` - switches the guessing off entirely. Store an override only when it *disagrees* with detection — +- **Detection is a guess, not a verdict — and it ships off.** `prefs.detectDaily` defaults to + `false` and the control is labelled experimental: wording is a weak signal and gets it wrong in + both directions, so a new reader opts in rather than out. The default moves nothing for an + existing reader, whose stored `prefs` wins. The reader can mark any event as repeating, or unmark + one detection got wrong (`progress.daily`, resolved by `resolveDaily`), whether the guessing is + on or off. Store an override only when it *disagrees* with detection — recording agreement would freeze today's guess and stop a better parser from ever reaching that event. Neither control ever deletes a mark or a logged day, so both are reversible. diff --git a/docs/DATA-MODEL.md b/docs/DATA-MODEL.md index ecfd0fe..ba45953 100644 --- a/docs/DATA-MODEL.md +++ b/docs/DATA-MODEL.md @@ -293,7 +293,14 @@ It adds no schema field, so nothing about the feed contract or the event ID chan for one event and wins outright (`resolveDaily`); absent means they have not said, so detection stands. `prefs.detectDaily` switches the guessing off altogether, leaving only events they marked themselves — it silences detection rather than deleting anything, so every mark and every logged day -survives and switching it back on restores exactly what was there. An override that merely +survives and switching it back on restores exactly what was there. + +**Detection is off by default and labelled experimental in the UI.** Wording is a weak signal and it +is wrong in both directions, so a new reader starts with only the standing `dailies:` chores +and whatever they mark themselves; opting in is one checkbox. The default applies to new readers +only — a stored `prefs` keeps whatever value it has, because turning it off under a reader who has +been ticking auto-detected checklists would pull those chips out of the strip with no explanation. +An override that merely agrees with detection is **not stored** (`dailyOverride`) — freezing today's guess into their data would stop a later parser improvement from ever reaching that event. This is the only field in `progress` that changes what the app *shows* rather than recording what the reader did, which is diff --git a/src/client/components/Controls.tsx b/src/client/components/Controls.tsx index 43d86eb..6cb2220 100644 --- a/src/client/components/Controls.tsx +++ b/src/client/components/Controls.tsx @@ -87,9 +87,9 @@ export function Controls({ {/* Detection reads the source's wording and is wrong in both - directions. Off leaves only the events the reader marked, and - discards nothing — every mark and logged day survives, so it can - be switched back on. */} + directions, so it ships off and says so. Off leaves only the + events the reader marked, and discards nothing — every mark and + logged day survives, so it can be switched back on. */} diff --git a/src/client/state/usePrefs.ts b/src/client/state/usePrefs.ts index 3f0cf99..00c468b 100644 --- a/src/client/state/usePrefs.ts +++ b/src/client/state/usePrefs.ts @@ -23,6 +23,10 @@ export interface Prefs { * Whether to guess which events repeat daily from what the source printed. * Off leaves only the ones the reader marked themselves; it never discards a * mark or a logged day, so it is reversible. + * + * Off by default: the guess reads source wording and is wrong in both + * directions, so a reader starts with only the dailies they chose. Readers + * who already switched it on keep it — stored prefs win over this default. */ detectDaily: boolean; showCompleted: boolean; @@ -40,7 +44,7 @@ function defaults(): Prefs { hiddenGames: [], focusGame: null, sort: "ending", - detectDaily: true, + detectDaily: false, showCompleted: true, showIgnored: false, regionConfirmed: false,