reading map: a second page, arranged to be read rather than to look like weather

The banner draws all 9,194 chunks in one flat colour. `nodes.book` was in the
payload but only ever reached the tooltip, so nothing on screen said which book
or which region you were looking at.

This adds /reading: the same corpus at the pre-flight's 15/0.1 instead of the
banner's 50/0.8, coloured by kind of book, with any single title isolatable.

The two projections are NOT interchangeable, and that is why this is a separate
page rather than a mode of the banner. 50/0.8 was chosen *because* it blurs book
territory into something that reads as a cloud; showing that territory is the one
thing this page exists to do.

Renderer notes:

  • Explorer mode turns on only when the payload actually carries a `kind`
    layer, not when the caller asks for it — a page pointed at the banner's
    file degrades to the flat cloud instead of throwing.
  • Smaller and denser points (0.032/0.62 vs 0.055/0.3). Three hues piling up
    in one volume average toward grey; that pairing is what keeps each one's
    hue, and it is not cosmetic.
  • Isolation dims to 8.5% rather than hiding. Against an empty frame you learn
    where a book's chunks are and lose the only question worth asking, which is
    where they sit relative to everything else.
  • `nebulaBase` keeps a pristine copy of the vertex colours; dimming from an
    already-dimmed buffer compounds and the cloud would fade on every hover.

Kind colours are slots 1-3 of the validated categorical palette, checked
ALL-PAIRS against this file's own #0b0d12 — a point cloud has no series order,
so the adjacent-pairs default that suits stacks and lines is the wrong test.
Worst pair CVD dE 9.4, worst normal-vision dE 20.9.

⚠️ `--map-kind-narrative` (aqua) sits near `--map-trace` (the garden green).
Tolerable only because form separates them absolutely — diffuse points versus
one continuous line — and nothing is encoded by the similarity. If the trace
ever becomes points, re-measure that pair.

The payload is gitignored for the same reason the banner's is: a tracked
generated file dirties the tree and breaks the `git pull` at the top of every
build tick. auto-build.sh's signature now watches both, or a corpus change
would rebuild one page and leave the other on yesterday's cloud.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wes
2026-08-15 20:42:14 -04:00
co-authored by Claude Opus 5
parent 78c74ff50b
commit 898c942f95
7 changed files with 470 additions and 8 deletions
+5 -2
View File
@@ -31,8 +31,11 @@ sig=$({
find "$VAULT" -name .obsidian -prune -o -type f -printf '%T@ %p\n' | sort
find "$REPO/notebooks-export" -type f -printf '%T@ %p\n' 2>/dev/null | sort
# same deal for the reading map: gitignored, written by library-rag-export.service on its
# own timer, so git status/diff above cannot see it change
find "$REPO/public/reading_umap.json" -printf '%T@ %p\n' 2>/dev/null | sort
# own timer, so git status/diff above cannot see it change. Both payloads — the banner's and
# the /reading explorer's — or a corpus change would rebuild one page and leave the other
# serving yesterday's cloud.
find "$REPO/public/reading_umap.json" "$REPO/public/reading_explorer.json" \
-printf '%T@ %p\n' 2>/dev/null | sort
} | sha256sum | cut -d' ' -f1)
if [ "$FORCE" -eq 0 ] && [ -f "$STATE" ] && [ "$(cat "$STATE")" = "$sig" ]; then