From f487561cfa340b87b6595180a4acb8872fb538a3 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Fri, 31 Jul 2026 22:45:08 -0500 Subject: docs: keep the timeline face's design history, not its engine MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Six prototypes from the world-face work, kept as the record of how the design got to where it is. The first five are self-contained; prototype 6 and the option-A pages load the engine, so they read here but do not run here. The engine stays out on purpose. It carries the list of places I travel to, with coordinates, and this repo is published — a design record is not worth publishing that for. The README says how to copy the modules in locally to run prototype 6, and gitignore keeps such a copy from being committed by accident. Dropping the prototype test target with it: the engine and its tests now live in one place, so the suite runs once rather than twice over identical files. --- .gitignore | 3 + Makefile | 1 + .../2026-07-31-timeline-face-prototype-1.html | 367 +++++++++++++++++++++ .../2026-07-31-timeline-face-prototype-2.html | 198 +++++++++++ .../2026-07-31-timeline-face-prototype-3.html | 224 +++++++++++++ .../2026-07-31-timeline-face-prototype-4.html | 242 ++++++++++++++ .../2026-07-31-timeline-face-prototype-5.html | 263 +++++++++++++++ .../2026-07-31-timeline-face-prototype-6.html | 151 +++++++++ docs/prototypes/README.md | 41 +++ todo.org | 19 ++ 10 files changed, 1509 insertions(+) create mode 100644 docs/prototypes/2026-07-31-timeline-face-prototype-1.html create mode 100644 docs/prototypes/2026-07-31-timeline-face-prototype-2.html create mode 100644 docs/prototypes/2026-07-31-timeline-face-prototype-3.html create mode 100644 docs/prototypes/2026-07-31-timeline-face-prototype-4.html create mode 100644 docs/prototypes/2026-07-31-timeline-face-prototype-5.html create mode 100644 docs/prototypes/2026-07-31-timeline-face-prototype-6.html create mode 100644 docs/prototypes/README.md diff --git a/.gitignore b/.gitignore index bf15571..ebe8c34 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,6 @@ __pycache__/ # Screenshot the gallery probes emit on every run /tests/gallery-probes/fams.png + +# Engine modules copied in to run an archived prototype; they live in dotfiles. +docs/prototypes/timeline-face-*.js diff --git a/Makefile b/Makefile index a08ddb5..f5b680b 100644 --- a/Makefile +++ b/Makefile @@ -54,6 +54,7 @@ deps: # because the dir names are hyphenated, so each suite is run explicitly. # Elisp suites (tests/*/test-*.el, ERT) run in the same pass so one green # `make test-unit` covers the whole fast tier. + test-unit: @fail=0; \ for t in tests/*/test_*.py; do \ diff --git a/docs/prototypes/2026-07-31-timeline-face-prototype-1.html b/docs/prototypes/2026-07-31-timeline-face-prototype-1.html new file mode 100644 index 0000000..d323854 --- /dev/null +++ b/docs/prototypes/2026-07-31-timeline-face-prototype-1.html @@ -0,0 +1,367 @@ + + + + +Timeline face — prototype 1 + + + + +
Timeline face · prototype 1 · synthetic data
+
+ direction + + + + + + + +
+
+ Surface is 3440×1440, drawn to scale. Cities are Craig's live waybar + worldclock roster (15 zones, home New Orleans). Events are a synthetic + fixture, never his real agenda — this repo is still served anonymously + over cgit, so real calendar titles cannot live in a tracked file. + Brightness runs dark in the past to bright in the future. The next event is + gold. Type size follows tick spacing, capped at 72px, and grey level is + derived from that same size — Maeda's law from Line, one rule driving + scale, weight and colour. +
+ +
+ + + + diff --git a/docs/prototypes/2026-07-31-timeline-face-prototype-2.html b/docs/prototypes/2026-07-31-timeline-face-prototype-2.html new file mode 100644 index 0000000..2a7bdc4 --- /dev/null +++ b/docs/prototypes/2026-07-31-timeline-face-prototype-2.html @@ -0,0 +1,198 @@ + + + + +Timeline face — prototype 2 + + + + +
Timeline face · prototype 2 · synthetic events
+
+ diagonal + + + + +
+
+ The crossing is not a free parameter. The horizontal meets the diagonal at the + home city, and New Orleans is 4th of 15 west-to-east, so it lands at 21.4%. + Reversing the diagonal puts the same intersection at 78.6%. Both numbers + describe one point. Events are invented; the city roster is real. + Vertical offset on an event is collision avoidance and carries no data — + duration is a quantity of time, so it reads as bar length on the time axis. +
+ +
+ + + + diff --git a/docs/prototypes/2026-07-31-timeline-face-prototype-3.html b/docs/prototypes/2026-07-31-timeline-face-prototype-3.html new file mode 100644 index 0000000..1fcc506 --- /dev/null +++ b/docs/prototypes/2026-07-31-timeline-face-prototype-3.html @@ -0,0 +1,224 @@ + + + + +Timeline face — prototype 3 + + + + +
Timeline face · prototype 3 · synthetic events
+
+ latitude + + + + +
+
+ North is up. x is real longitude and y is latitude, so the crossing still falls + out of where home sits — longitude is timezone, and New Orleans lands at + 20.4%, within a point of the rank-derived 21.4%. Two latitude scales: ranked + spaces the cities evenly and keeps the north-to-south order, true uses honest + degrees and shows what that costs, since nine of fifteen cities sit between + 28 and 41 degrees north. Events are invented; the roster is real. +
+ +
+ + + + diff --git a/docs/prototypes/2026-07-31-timeline-face-prototype-4.html b/docs/prototypes/2026-07-31-timeline-face-prototype-4.html new file mode 100644 index 0000000..88648bf --- /dev/null +++ b/docs/prototypes/2026-07-31-timeline-face-prototype-4.html @@ -0,0 +1,242 @@ + + + + +Timeline face — prototype 4 + + + + +
Timeline face · prototype 4 · synthetic events
+
+ latitude + + + + +
+
+ One axis, one scale. The width is a full 360° of longitude and a full 24 + hours, which are the same quantity — so an event N hours ahead lands on + the city that is living that hour right now. Wind down at +9.2h falls on + Yerevan, 14 minutes off. Prototype 3 had the roster's 332.64° stretched to + the full width, putting the city scale 7.6% off the time scale. Home sits at + 20%, which is nearly forced: Honolulu is 67.8° west, so anything under + 18.8% drops it off the frame. Events are invented; the roster is real. +
+ +
+ + + + diff --git a/docs/prototypes/2026-07-31-timeline-face-prototype-5.html b/docs/prototypes/2026-07-31-timeline-face-prototype-5.html new file mode 100644 index 0000000..b77fd35 --- /dev/null +++ b/docs/prototypes/2026-07-31-timeline-face-prototype-5.html @@ -0,0 +1,263 @@ + + + + +Timeline face — prototype 5 + + + + +
Timeline face · prototype 5 · synthetic events
+
+ latitude + + + + +
+
+ x is now each city's clock offset from home, not its longitude. + Longitude only approximates time — zones are political, and against this + roster it is off by up to 1.32 h (Tokyo), partly because New Orleans is on + daylight time. So a city now sits exactly under its own local hour and an + event N hours ahead lands on the living-that-hour city with no error at all. + Latitude still sets y, and Tokyo really is south of Athens and Yerevan + — 35.7°N against 38.0° and 40.2°. + Events are invented; the roster is real. +
+ +
+ + + + diff --git a/docs/prototypes/2026-07-31-timeline-face-prototype-6.html b/docs/prototypes/2026-07-31-timeline-face-prototype-6.html new file mode 100644 index 0000000..d3f1427 --- /dev/null +++ b/docs/prototypes/2026-07-31-timeline-face-prototype-6.html @@ -0,0 +1,151 @@ + + + + +Timeline face — prototype 6 + + + +
+ + + + + home + +
+ + + + + + diff --git a/docs/prototypes/README.md b/docs/prototypes/README.md new file mode 100644 index 0000000..fd73b2e --- /dev/null +++ b/docs/prototypes/README.md @@ -0,0 +1,41 @@ +# Prototypes + +Frozen design history. Every file here is a snapshot of what a design looked +like on the date in its name, kept so the evolution is walkable. Nothing here +is maintained, and nothing here is loaded by anything that runs. + +Most pages are self-contained: open one and it renders. + +## The world face + +The world wallpaper's engine used to live here and was hand-copied into +`~/.dotfiles/settings/faces/` on every change. Both copies were byte-identical +and both test suites ran the same tests, so the duplication bought nothing and +risked drift — the two pages' palettes had already diverged enough to break a +scripted edit. + +The live engine, its tests and the lab page now live only with the shipped +face, in the dotfiles `settings/faces/` directory: + +- `timeline-face-engine.js`, `timeline-face-spine.js` — the engine +- `world.html` — the projected wallpaper +- `lab.html` — the same engine with a movable home and a fast clock, for + trying an idea without touching the wallpaper + +`make test-faces` in dotfiles runs their tests. + +`2026-07-31-timeline-face-prototype-6.html` and the option-A pages load the +engine, so they are readable here but not runnable here. The engine is +deliberately **not** kept in this repo: it carries a list of the places I +travel to, with coordinates, and this repo is published. A design record is +not worth publishing that. + +To run prototype 6, copy the two engine modules in beside it: + +```sh +cp ~/.dotfiles/settings/faces/timeline-face-*.js docs/prototypes/ +``` + +They are gitignored here, so a copy stays local. Note that the live engine +keeps moving: prototype 6 is a photograph of one day's design and a current +engine may not render it the way it looked. diff --git a/todo.org b/todo.org index eb42f89..e2e6727 100644 --- a/todo.org +++ b/todo.org @@ -80,6 +80,25 @@ Launched by hand afterward it runs fine and survives, so gammastep is not broken Worth its own task — the fix is a readiness wait or a retry around that exec-once, not a persistence change. Filed here for now because it surfaced during this investigation. +** TODO [#C] Re-apply the active program at session start :refactor:dotfiles:hyprland: +:PROPERTIES: +:CREATED: [2026-07-30 Thu] +:LAST_REVIEWED: 2026-07-30 +:END: +Follow-up to the direction-aware persistence fix (dotfiles, 2026-07-30). I took the narrow repair first and deferred this deliberately. + +=settings restore= replays individual toggles from =store.DEFAULTS["toggles"]= — caffeine, DND, and now dim. But =active_program= is stored and read by =programs.py= and never re-applied as a unit. So the panel's claim that a program is active is only true to the extent that the individual toggle replays happen to reconstruct it. + +Right now the gap is small: dim, DND and caffeine are the fields that don't survive on their own, and all three now persist individually. Night light is deliberately excluded (time-of-day dependent) and the power profile is persisted by powerprofilesctl itself. So the observable behavior is close to correct today. + +What's wrong is the structure, not the current output. Two sources of truth describe the same intent — a program definition and a list of remembered toggles — and nothing keeps them in step. Add a field to a program and it silently won't be replayed; change what a program means and the replay still asserts the old fields. The drift is invisible until someone notices the desktop disagreeing with the panel, which is exactly how the dim bug surfaced. + +The change: have restore resolve the active program and apply it through =panel.apply_toggle=, with the remembered-toggle list becoming a fallback for a session with no active program. The =ASSERT_OFF= direction rule still applies per toggle and must survive the move — caffeine's ON-only assertion is a safety property, not an optimization (velox, 2026-07-22). + +Grading: Minor severity (no wrong behavior today; it's a latent drift that produces one on the next change to a program's fields) x some users sometimes (only bites when a program definition changes) = P3 = [#C]. + +:solo: — the design was settled when the fix was chosen, the surface is enumerable (=session.restore=, =programs.py=, =panel.apply_toggle=), and it is verifiable locally: the existing restore suite plus a test that a stored active program is reconstructed field by field after a simulated session start. + ** TODO [#A] Idle commits silently drop the screen-lock wrapper :bug:hyprland:dotfiles:security: DEADLINE: <2026-07-29 Wed> :PROPERTIES: -- cgit v1.2.3