From 0e87d061b6a3a73a82f2a67d2042812afb7ba508 Mon Sep 17 00:00:00 2001 From: Lucas Winther Date: Wed, 19 Aug 2026 06:20:49 +0200 Subject: [PATCH] docs: one switch for unstarted events, across both views MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit F1 described a board-only setting and said in as many words that the checklist "has listed them all along", which is now the opposite of what happens. F2 did not mention the section at all. Both say it once, in the place a reader of either would look. The prefs key space records the rename and why the old value is carried rather than dropped — the next person to move a field will want the precedent, and the reasoning is the half a diff cannot show. Co-Authored-By: Claude Opus 5 (1M context) --- docs/DATA-MODEL.md | 26 +++++++++++++++++--------- docs/PRD.md | 36 ++++++++++++++++++++++++------------ 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/docs/DATA-MODEL.md b/docs/DATA-MODEL.md index e76021a..0ae2016 100644 --- a/docs/DATA-MODEL.md +++ b/docs/DATA-MODEL.md @@ -218,7 +218,7 @@ Namespaced, versioned, and small. Nothing here ever goes to the server. "gacha-tracker:v1:daily" // { [id]: { days: ["2026-08-15", ...], at } } "gacha-tracker:v1:ignored" // { [eventId]: { at } } — "stop showing me this" "gacha-tracker:v1:prefs" // { region, hiddenGames[], knownGames[]?, focusGame, sort, view, - // timelineDayWidth, timelineGroup, timelineUpcoming, + // timelineDayWidth, timelineGroup, showUpcoming, // timelineSplitUpcoming, detectDaily, showCompleted, // showIgnored, theme, regionConfirmed, onboarded } // timelineDayWidth is px per day on the board, stored as the @@ -228,17 +228,25 @@ Namespaced, versioned, and small. Nothing here ever goes to the server. // timelineGroup is "game" (a lane each) or "ending" (every game // in one deadline queue). Defaults to "game", so shipping it // moved nobody's board; see PRD F1. - // timelineUpcoming plots events that have not started yet. - // Defaults to false — the board's window is drawn from what it - // plots, so on by default would push every running bar right to - // make room for things nobody can do yet. Set from settings - // alongside showCompleted / showIgnored, and the only one of - // the three scoped to one view. See PRD F1. + // showUpcoming shows events that have not started yet, in + // BOTH views — the board plots them, the checklist keeps its + // "Not started yet" section. Defaults to false; set from + // settings alongside showCompleted / showIgnored, which is the + // same question. See PRD F1. + // It was named timelineUpcoming while it governed the board + // alone. `adoptRenamed` in usePrefs.ts carries a stored old + // value across on load — nothing is lost by dropping it, since + // this is one blob under one key rather than a key space, but + // resetting a reader's answer for them is not nothing either. + // A stored new name always wins, so it cannot overwrite a + // fresher answer with a stale one. // timelineSplitUpcoming keeps those events in their own block // under a "Not started yet" heading (true, the default) or puts // them in one deadline order with the running ones (false). - // Only read when timelineUpcoming is on, but stored either way - // so switching that back on restores the answer given. PRD F1. + // The board only: the checklist splits them into a section of + // its own either way. Read only when showUpcoming is on, but + // stored regardless, so switching that back on restores the + // answer given. PRD F1. // knownGames is every lane the reader has been offered. Absent // means unrecorded, not "offered nothing" — see PRD F8; a lane // missing from it is new to them and arrives switched off. diff --git a/docs/PRD.md b/docs/PRD.md index c6991de..447a324 100644 --- a/docs/PRD.md +++ b/docs/PRD.md @@ -111,21 +111,25 @@ few pixels apart the board is being asked the one question it exists to answer a reader to squint. It also gives a one-day event a bar to read and to tap rather than the 34px minimum every short bar collapses to. -**What has not started yet is off by default, and the reader can switch it on.** The board answers -"how does the time I am in lay out?", and every lane has a next patch queued behind it — so plotting -all of it unasked stretched the window weeks past today and squeezed the running bars the reader -came for down to nothing. `prefs.timelineUpcoming` defaults to `false`, which is what every existing -board already looked like on the day it shipped, since the window is drawn from what is plotted. -Nothing is hidden by that: the checklist's own "Not started yet" section (F2) has listed them all -along, and a board with nothing left running says exactly that and names the setting, instead of -reading as an empty calendar. +**What has not started yet is off by default, and the reader can switch it on** — `prefs.showUpcoming`, +which governs **both views**: the board plots them, and the checklist keeps its "Not started yet" +section (F2). One question, asked once, because they are the same events. It defaults to `false` +because this app answers *what expires next*, and a reader with fourteen lanes has a next patch +queued behind every one of them. + +On the board that is structural as well as editorial: the window is drawn from what is plotted, so +showing the future stretches the right edge weeks past today and squeezes the running bars the +reader came for down to nothing. + +**Held back is never merely absent.** A section that simply is not there is indistinguishable from a +quiet fortnight, and this app does not leave a reader to infer what it is not showing them. So the +page header states `N live · N upcoming` whatever the setting says, and either view left with +nothing to show says so in words and names the setting rather than rendering an empty column. The switch is in settings (F4), with the two other answers to *what am I allowed to look at* — `showCompleted` and `showIgnored` — and **not** in the board's own header beside the stacking and scale controls. That is the line those two draw: they reshape what is already on the board, which is -why they are reached for while reading it, and this one decides what is on it at all. It is the only -one of the three scoped to a single view, so its row says so rather than reading as a promise about -the whole app. +why they are reached for while reading it, and this one decides what is on it at all. **Switched on, the board says in words where they begin.** A bar drawn to the right of the "now" rule is only *implicitly* in the future, and implicitly is not a standard this product holds itself @@ -144,7 +148,8 @@ bar to answer the question the reader opened it with. So the line between the tw muted ink rather than a hue, since a hue on this board means *whose event is this*. One per lane, because "where does this stop running?" is a different answer for each of them. -**Two readings of that board, and the reader picks** (`prefs.timelineSplitUpcoming`, default +**Two readings of that board, and the reader picks** — the board's alone, since the checklist splits +these into a section with a heading of its own either way (`prefs.timelineSplitUpcoming`, default `true` — the board as it was before the choice existed). Split keeps the unstarted events in their own block under that heading, and answers "what is on now, and what is queued behind it" — the shape of a patch. **Mixed in** drops the block for one deadline order, started or not, and answers "what @@ -167,6 +172,13 @@ A flat list of all *currently running* events sorted ascending by end date, with countdown ("ends in 2 days", "ends in 4 hours"). Under 24 hours, the row is emphasized. This is the view that justifies the app, and it is one tap from the timeline. +**"Not started yet" is a second section, and it is off by default** (`prefs.showUpcoming`, F1 — the +same switch the board reads). Running events are the list's whole claim; what has not opened is +context, and on fourteen lanes it is more rows than the thing the reader came for. Split into its +own section rather than mixed into the order, because that is what the list *is*: a queue of jobs +you can do now, and one you cannot do yet does not belong among them. The board offers the mixed +reading instead, where a nearer deadline genuinely is a nearer deadline (F1). + The tab reads **Checklist**, which is what a reader with four games is doing with it: working down a list of jobs with deadlines. Its stored id stays `"soon"` — that value is in `prefs.view` on real devices, and renaming a label must never move a reader to the other view.