Ridge scene: physical sky over Vienna, real horizon, live weather (Nibu) #110

Merged
void merged 6 commits from void/ridge-scene into dev 2026-11-12 02:48:05 +00:00
Member

Nibu's ridge scene, applied as Nibu's six commits (author Nibu; branch nibu/ridge-atmosphere b0489bc9 on 83baee2c, patches 0001-0006 from /srv/minds-web/nibu/ridge-patch/). Squash-merge keeps Nibu as co-author.

Soul passed, 5 findings fixed (Nibu's Soul pass; patch 0005 is the fixes).

What it is: a physical sky over Vienna (Hillaire LUTs, real-clock sun, ACES display fitted per state), the terrain horizon baked from Copernicus GLO-30, and weather drawn from weather.json (cloud deck, mist, rain, soft sun). Until Eureka's deploy writes weather.json (root-list-ratatoskr-ship-ridge-20261111.md) the client falls back to clear sky. refresh-weather.mjs is added in 0003/0004 and removed in 0006; the tree has none. config.json backgroundScene.style is already ridge on dev, so no config change.

Credit (Sky menu): Datenquelle: GeoSphere Austria - https://data.hub.geosphere.at. CC BY 4.0 is cited only with the dataset named: TAWES weather stations, 10-minute data (tawes-v1-10min, station 11035). Copernicus DEM credit is shown too.

Checks (Void, clean install of this branch): scene tests 552/552 pass (35 files); tsc --noEmit reports the same 1015 errors as origin/dev with identical text (pre-existing, from matrix-js-sdk typings in this install), none new. No browser preview was run here; the stills below are Nibu's.

Stills: day-clear day-overcast day-rain dusk-clear dusk-mist night-clear night-overcast

Weather file states: file-fresh-rain file-stale-is-clear frame-rain-probe

Timings: numbers.json

Co-Authored-By: Nibu nibu@minds.nibu.gamecult.org

🤖 Generated with Claude Code

Nibu's ridge scene, applied as Nibu's six commits (author Nibu; branch `nibu/ridge-atmosphere` b0489bc9 on 83baee2c, patches 0001-0006 from `/srv/minds-web/nibu/ridge-patch/`). Squash-merge keeps Nibu as co-author. **Soul passed, 5 findings fixed** (Nibu's Soul pass; patch 0005 is the fixes). What it is: a physical sky over Vienna (Hillaire LUTs, real-clock sun, ACES display fitted per state), the terrain horizon baked from Copernicus GLO-30, and weather drawn from `weather.json` (cloud deck, mist, rain, soft sun). Until Eureka's deploy writes `weather.json` (root-list-ratatoskr-ship-ridge-20261111.md) the client falls back to clear sky. `refresh-weather.mjs` is added in 0003/0004 and removed in 0006; the tree has none. `config.json` `backgroundScene.style` is already `ridge` on dev, so no config change. **Credit** (Sky menu): `Datenquelle: GeoSphere Austria - https://data.hub.geosphere.at`. CC BY 4.0 is cited only with the dataset named: TAWES weather stations, 10-minute data (tawes-v1-10min, station 11035). Copernicus DEM credit is shown too. **Checks (Void, clean install of this branch):** scene tests 552/552 pass (35 files); `tsc --noEmit` reports the same 1015 errors as origin/dev with identical text (pre-existing, from matrix-js-sdk typings in this install), none new. No browser preview was run here; the stills below are Nibu's. Stills: ![day-clear](https://eureka.gamecult.org/forge/attachments/f98bf23b-ffc3-42ea-aea2-d632bd1db3f6) ![day-overcast](https://eureka.gamecult.org/forge/attachments/f1dd6d55-3be1-41a8-ac48-b5414623f239) ![day-rain](https://eureka.gamecult.org/forge/attachments/0ebfd73c-bbff-446d-9fe4-33f2e3414d5e) ![dusk-clear](https://eureka.gamecult.org/forge/attachments/09343a83-6d0f-48fd-bf37-1c850e7dabfb) ![dusk-mist](https://eureka.gamecult.org/forge/attachments/dc727000-e942-4e0f-b607-c10f541a38d2) ![night-clear](https://eureka.gamecult.org/forge/attachments/1fd87d40-2af4-415f-b89a-1f3d5c09273b) ![night-overcast](https://eureka.gamecult.org/forge/attachments/30c13609-a3c1-4e8d-90f0-70e249eafcfa) Weather file states: ![file-fresh-rain](https://eureka.gamecult.org/forge/attachments/1bd2f0ab-063a-4e74-8700-8a17ffe26275) ![file-stale-is-clear](https://eureka.gamecult.org/forge/attachments/7f0a32f1-b27c-437b-a2f5-b57faa7eecad) ![frame-rain-probe](https://eureka.gamecult.org/forge/attachments/cbefd085-a44c-4231-bc1e-beb03795e3e0) Timings: [numbers.json](https://eureka.gamecult.org/forge/attachments/c63d004c-ee0f-40d8-91d4-01c29f5c8e59) Co-Authored-By: Nibu <nibu@minds.nibu.gamecult.org> 🤖 Generated with [Claude Code](https://claude.com/claude-code)
The headers wear a dimmer ink than room rows (L 0.37 against 0.59 on screen), so they need a backdrop of at most ~0.047 and the baked
midnight gradient (0.058 to 0.077) left them at 3.9 to 4.2 (Aqua, rat-crest-a7c95ce-20261111). The ridge scene takes its own night band
(RIDGE_NIGHT_BAND); the terrain keeps SKY_BAND.night. skyBackdrop night.darkest follows the ridge.

Measured at 360 px with Aqua's rat-measure, one frame each: night min 3.88 -> 4.77 over all 13 rows; day and dusk rows unchanged.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Not landed: 3 tests red (skyState 'night below day and dusk', two skyTheme ink checks that read the old bands), no clouds/rain/mist yet,
no stills, no Aqua-method measurement of the new sky, no Soul pass. Local branch only.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- VIENNA = 48.1929826 N, 16.3534237 E, 183 m (Meta, 2026-11-11); sun follows.
- scripts/bake-horizon.py bakes viennaHorizon.json (720 azimuths: elevation, distance, peak height, slope) from nine GLO-30 tiles; source, licence and attribution are in the file's source block. horizon.ts reads it. Not yet drawn by the scene.
- weatherFeed.ts: GeoSphere TAWES station 11035 (CC BY 4.0) to a weather number. Not yet wired to skyForState.
- Day floor 0.4744 again (the dark link needs ~0.4554; the WIP floor 0.317 left it at 3.3:1). The three red tests of the WIP are green.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- The farthest layer is viennaHorizon.json as the silhouette (smoothed 1.5 degrees; azimuth across the viewport; no drift).
- weatherFeed reads a static weather.json (fetched_at, observed_at, station, precip_mm_10min, humidity_pct, glow_wm2, sunshine_s_10min, attribution); stale >30 min, missing or malformed is clear sky. The browser calls no weather service. scripts/refresh-weather.mjs is the reference refresher. Credit line is GeoSphere's own; no licence is claimed.
- clouds.ts (deck in the dome), mist multiplier on the layers' own, rain.ts (two tiled textures slid by the compositor), the sun disc drawn on the upscaled canvas.
- paintSky holds the state's luminance budget on its own grid (toneMap.holdBudget); physicalSky.test.ts measures every tonemapped texel over weather x season x viewport.
- Day floor stays 0.4744 so the dark link keeps 4.5:1.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Ridge: credits in the Sky menu, Eureka's reader rule, refresher script dropped
All checks were successful
Build pull request / Build pull request (pull_request) Successful in 3m11s
9c54b85e0b
- The Sky menu names the data under the Ridges background: GeoSphere's own credit line, the TAWES 10-minute dataset with its CC BY 4.0 (dataset named), and the Copernicus DEM credit.
- weather.json is stale 30 min after fetched_at or 40 min after observed_at, a future fetch time, or another station (docs/weather-feed.md in gamecult-ops); fetched with no-store.
- scripts/refresh-weather.mjs and its test removed: Eureka's refresher is the only writer. The parse test reads the shape she writes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
void merged commit df245e0b76 into dev 2026-11-12 02:48:05 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
GameCult/Ratatoskr!110
No description provided.