The receipt means the mouth fetched and stored the file for the Mind, not that it is in her sandbox or was read.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
receiptStore.ts holds one Timeline/Redaction/TimelineReset listener set per room while any row is mounted and a snapshot of the receipt events; useFileReaders derives each row's readers from it with readersOf (same rules). 200 rows register one listener per event, not 200.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
readersOf (fileReceipt.ts) is the one reader: a receipt is a thread reply or a plain room event, matched by content.event_id; the sender must be @<mind>:<this homeserver>, the hash the file event's, an m.reference present must name the same event, one entry per Mind. The timeline file message draws it too.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Heimdall's two rules (#minds): trust the Matrix sender, never a field inside; read means the receipt hash equals the file event's.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Libby's read of #67: Browse had no phone/wide split, so opening it on one screen class opened it on the other. The store keeps its name and localStorage key (a rename would drop saved state); the comment says what a key means.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Soul found Date.parse accepting '2026-11-06', 'Nov 6 2026', '0' and 2026-02-30, and decider_count 0/65 or a missing/negative answerer_count rendering as served.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Volume: the foot of each face darkens (scaled by the layer's contrast, before the mist lifts it toward the haze), the sun
catches the top, and the crest rim gets a soft glow under its 2 px lip. Baked per pixel; nothing per frame.
Legibility, with no plate: the state's luminance band (skyBand.ts, the one the sky is shaped into) now also shapes the
layers, as a shift of linear light in the bake. Day and dusk add the zenith colour so the darkest ridge pixel is on the
text floor; night scales to the ceiling. The face keeps its whole luminance gradient. Rows of full-opacity label over a ridge
measure 2.4-2.6 before and 6.7-7.1 after at day and dusk (360 px, real label colour against the real pixels under it).
Tests: 'foot is hazier' becomes two tests (the foot is clearly darker; the valley mist still pulls it toward the haze),
plus the band tests and ridgeSkyFor carrying the state band.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
create() called the ray-march createScene after the try, so a throw while
building it escaped onCompileFail and the CSS ground was never kept. The call
now sits inside the try with the other styles.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Soul pass fixes. The shared scratch canvas was resized when a job was created
but read in a deferred task, so chunks of layers with a different blur pad got
a faded right edge. Each job now makes its own scratch when it first runs and
drops it when done. A chunk is baked, put and scatter-filled in column bands,
the blur is one draw; allocation is a task of its own. rotate no longer needs a
forward reference (startDrift takes the finish callback).
Tests: the fake animation can finish, so the rotation is tested at scene level
(world columns per chunk, slot repositioning, restart, recycled chunk id, one
chunk of drift distance, per-job scratch width at the moment of each blur).
The ridged core has direct tests for the fold, the warp, the previous-octave
weighting, the lacunarity and contrast by distance. README sun statement
matches sunDirection.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Each ridge layer is a function of world-x (ridged multifractal value noise,
domain-warped, one function and a parameter row per layer) instead of a
periodic strip. World-x is baked in 1.2-viewport chunks on demand: the first
view bakes one chunk per layer, the rest are baked in ~6 ms tasks, and the
compositor slides a track that is recycled each chunk. A slow yaw/pitch sway
rides on top. ridgeBake.ts shades each column from the crest slope against
the sun with a lit rim, a light-to-haze face gradient and erosion streaks,
reusing the existing aerial perspective as the depth treatment.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
PoseAvatar renders a span, not a button, when it has no onClick. The desk recomputes each card's options_hash (RFC 8785 after NFC, SHA-256; 15 CultLib vectors) and withdraws a card that differs.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Every preview shares the origin minds.gamecult.org and so one localStorage. A login another
preview left (cinny_hs_base_url of a real homeserver) made the demo connect to that server, which
the guard refuses, so SpecVersions showed 'Unable to connect to the homeserver'. installDemo now
drops any stored session whose base is not the demo origin, and the service worker is registered
after that so it is never handed the dropped session. Replaces the foreign-session banner text.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
#74 exported a function from a .css.ts file. vitest's plugin tolerates it, vite build's compile does not
("Invalid exports"), so dev did not build. The helper and its custom-property name move to skyLabelInk.ts;
a test compiles the three .css.ts files that use it the build's way and fails on the old arrangement.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>