From 858551ac98944ca7eef242303351f5ce40bd578b Mon Sep 17 00:00:00 2001 From: Lucas Winther Date: Wed, 19 Aug 2026 06:06:13 +0200 Subject: [PATCH] docs: the board's boundary heading, and the two readings of it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit F1 described bars that carry their own not-started marking and stopped there. It now has the label naming where the running ones end, and the choice between keeping that block and dropping it for one deadline order — including why the second is a re-sort rather than a hidden heading, which is the part a future change would otherwise get wrong. The heading itself shipped a commit earlier without this; same feature, so it is written up once here rather than split across two entries. Co-Authored-By: Claude Opus 5 (1M context) --- docs/DATA-MODEL.md | 7 ++++++- docs/PRD.md | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/DATA-MODEL.md b/docs/DATA-MODEL.md index 4d202c0..e76021a 100644 --- a/docs/DATA-MODEL.md +++ b/docs/DATA-MODEL.md @@ -219,7 +219,7 @@ Namespaced, versioned, and small. Nothing here ever goes to the server. "gacha-tracker:v1:ignored" // { [eventId]: { at } } — "stop showing me this" "gacha-tracker:v1:prefs" // { region, hiddenGames[], knownGames[]?, focusGame, sort, view, // timelineDayWidth, timelineGroup, timelineUpcoming, - // detectDaily, showCompleted, + // timelineSplitUpcoming, detectDaily, showCompleted, // showIgnored, theme, regionConfirmed, onboarded } // timelineDayWidth is px per day on the board, stored as the // measurement rather than a step number and read through @@ -234,6 +234,11 @@ Namespaced, versioned, and small. Nothing here ever goes to the server. // 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. + // 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. // 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 bb16fe5..c6991de 100644 --- a/docs/PRD.md +++ b/docs/PRD.md @@ -137,6 +137,25 @@ rather than claiming one date the board is not ruling at. The bars themselves ta edge and a thinner wash of their game's hue, so what is running and what is merely scheduled separate at a glance without reading a single date. +**And the boundary itself is named.** A dashed edge says *this bar* has not started; it does not say +where the running ones stopped, and a board read at a glance should not have to be decoded bar by +bar to answer the question the reader opened it with. So the line between the two gets a label — +`Not started yet`, the same object as a lane's name: a small eyebrow pinned to the left edge, in +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 +`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 +runs out first", which is the question a Gantt chart is for: an event opening on Friday and closing +on Sunday is a nearer deadline than one running now until October, and the split order can never +show it. Mixed is therefore *not* the heading switched off — every order this board can be handed +holds unstarted rows behind running ones, so dropping the label alone would leave the same block +with nothing explaining it. `timelineLanes` re-sorts on `byDeadline`, which is `endingSoonestFirst` +with exactly that clause removed, and it is the one case where lane mode is allowed to reorder +inside a lane. + **The board draws at most two months of past.** A standing login campaign can have been running for half a year, and drawing from the earliest start bought months of empty calendar that nobody scrolls back through and that pushed every other bar off to the right. An event older than the board keeps