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>
Replaces the 32 sender clips with AquaSynth 21e83ec's staged render; manifest and neutral
fallback are byte-identical to the old ones. The manifest test now pins every clip by sha256
prefix. Unheard.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Sender names over the terrain step to the state's ink: same OKLCH hue and chroma, darker by day and dusk, lighter at night, until 4.5:1 on the lightest measured terrain patch (capped at OKLCH L 0.9 at night). Sidebar labels get a darker dusk ink on phones. An explicit theme still wins. The unread divider keeps only its green line.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Replaces Cinny's stock wording (Invalid Username or Password., Failed to find
homeserver., Failed to connect..., the dead-end registration-disabled text) with
plain messages in one module, authMessages.ts, used by the login form, the auth
layout, the login page and the register page.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Hook code is #36 (b3eb9d01) verbatim plus the switch. Clips and manifest are AquaSynth PR #22 out/, Nibu on proposal 1. Nobody has heard v3.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
RoomNavCategoryButton set open/closed only through its chevron. It now sets
aria-expanded from `closed` (absent when the section does not toggle); tested by
rendering to static markup.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>