Skip to content

feat: integrate Strata terrain, live editor and game handoff (PRDs 466–468) - #381

Merged
jonit-dev merged 442 commits into
developfrom
feat/prd-466-468-strata
Oct 10, 2026
Merged

jonit-dev merged 442 commits into
developfrom
feat/prd-466-468-strata

Conversation

@jonit-dev

@jonit-dev jonit-dev commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

Merged — final status (2026-10-10)

PR381 squash-merged into develop at 2d212479255cf725f64343dc72aa2eafe9b7b92d, from final head ba284199ddbc8bd8b15574548ab5b35f75565eee. Final-head CI run completed SUCCESS; all 68 PR checks are successful or intentionally skipped. Latest develop changes were integrated before merge.

João approved NEUTRAL for the size-only asset compression change on 2026-10-10. The screenshot comparisons below remain available. The combined local upload-fix candidate below was not part of the merged PR; its commits and evidence are preserved locally. Its earlier pending-approval and CI notes are historical, not current PR status.

Combined develop and remote-repair candidate — NEUTRAL, awaiting owner exception

Local candidate 31f813c72 includes latest fetched develop 1a5314a1d, its world streaming updates, remote CI/asset repairs through f32d791cf, and the verified pending-instance-upload fix. Remote starter assets are preserved; the earlier six-GLB cook is safely stashed. This candidate has not been pushed.

Root typecheck, lint, full budgets, 60 focused terrain/editor/scaffold tests and native loading proof pass. Both headed NVIDIA 1920×1080 AFTER kit runs pass with zero diagnostics. The fresh independent visual judge inspected all 16 frames: NEUTRAL for all eight comparisons and overall, with no visible geometry or texture regression. All lake labels are present (the judge corrected its initial label observation). Repository AGENTS.md rejects NEUTRAL unless the owner grants the pending exception; U2 remains open.

Remote CI run 38043597475 covers f32d791cf, not this combined local candidate, and currently has six failed template jobs reporting SwiftShader device loss and Instance dropped error in getCompilationInfo. The run remains in progress; no implementation cause is established. Candidate CI and merge queue are pending.

Combined candidate — run 1

Pose BEFORE AFTER
ground BEFORE run 1 ground AFTER run 1 ground
edge BEFORE run 1 edge AFTER run 1 edge
overview BEFORE run 1 overview AFTER run 1 overview
lake BEFORE run 1 lake AFTER run 1 lake

Combined candidate — run 2

Pose BEFORE AFTER
ground BEFORE run 2 ground AFTER run 2 ground
edge BEFORE run 2 edge AFTER run 2 edge
overview BEFORE run 2 overview AFTER run 2 overview
lake BEFORE run 2 lake AFTER run 2 lake

The optional @threenative/terrain addon evaluates Strata headlessly and bakes ordinary Three.js data. The editor shares a validated project document with its agent controller. Games receive explicit baked data and own their appearance, physics and lifetime.

Status: PRD-466, PRD-467 and PRD-468 at 100%

PRD Result
PRD-466 terrain integration 4/4 phases, all retained boxes ticked. Moved to docs/PRDs/done/.
PRD-467 live editor 3/3 phases, 8/8 boxes. Moved to docs/PRDs/done/.
PRD-468 world controls and asset imports 3/3 phases, 7/7 boxes. Moved to docs/PRDs/done/.

pnpm prd:progress prints prd:100% — ready and exits 0 for all three.

Decision: the art bar moves to PRD-580

PRD-466 boxes K3, K4 and AC-5 required a fresh judge subagent to score at least 4 on ground, trees_rocks and lighting_depth. Eight bounded rounds used only CC0 assets (Poly Haven fir_tree_01, boulder_01, Kloofendal HDRI). The committed forest kit scores 3 / 3 / 3 and the judge returns IMPROVEMENT over BEFORE in all four views (edge, ground, lake, overview). Parameter levers plateaued.

The judge names these blockers: faceted leaf-card fir crowns, flat blown-out sky in elevated views, stair-stepped shorelines, tiled flat ground texture and hard dark shadow slabs. None of the three boxes is ticked. They move to PRD-580 with the score history, and PRD-466 carries a Decisions entry (owner go-ahead, 2026-10-09).

Score history (ground / trees_rocks / lighting_depth): before ~2–3 each, R2 2/2/3, R3 3/2/3, R4 2/2/3, R5 2/3/3, R6 3/3/2, R7 3/3/3, R8 3/3/3 (neutral, reverted).

Visual evidence

BEFORE and committed R7 captures (real WebGPU, NVIDIA RTX 2080). R8 was reverted. The visual judge returned IMPROVEMENT in all four views; the art scores remain 3 / 3 / 3, with the remaining work in PRD-580.

View BEFORE AFTER — committed R7
Edge BEFORE edge AFTER R7 edge
Ground BEFORE ground AFTER R7 ground
Lake BEFORE lake AFTER R7 lake
Overview BEFORE overview AFTER R7 overview

What this PR keeps

  • Forest asset budgets currently fail on ece594ad8: baked world 34,312,316 bytes exceeds 25 MiB; packed starter assets 50,695,422 bytes exceeds 40 MiB. Both failures reproduce locally in starter-kit.spec.ts; correction is in progress.
  • Terrain, kit, runtime and playtest proofs in the three PRDs.
  • Evidence growth stopped: six canopy captures PNG to JPG, uncited generated verification captures removed, 468 captures palette-quantized. The evidence-budget spec passes under the shipped caps.

Verification run on the final head ece594ad8

  • pnpm check:docs and check-doc-links, evidence-budget, evidence-citations, sync-agent-docs specs: 39/39 pass.
  • Pre-push ci:fast drift checks: agents, docs, lint, drift pass.
  • Not re-run on this head: the full board, native build lane. CI runs them on this PR.
  • Kit proof (KIT=forest pnpm --filter strata-terrain-preview test:kit) produced the R7 captures. Its performance.maxPhaseMsP95.render assertion returned null under machine load (load average 30–60). The captures are valid. The FPS claim is not made.

Asset budget CI repair — visual decision pending

The candidate saves 8,818,128 bytes: baked forest 25,494,188 / 26,214,400 bytes; packed starter assets 41,877,294 / 41,943,040 bytes. All four starter-kit tests pass, with caps and self-contained GLB requirements unchanged. Geometry, material bindings, decoded PNG pixels and embedded metadata checks pass.

Two fresh headed WebGPU runs per arm passed at 1920×1080 on NVIDIA Turing. The independent judge inspected every frame: NEUTRAL in all eight comparisons; no repeatable visual regression, no visible improvement. This does not satisfy the owner visual gate. An exception for this size-only cook is pending.

Pose / run BEFORE AFTER
ground / run1 BEFORE ground run1 AFTER ground run1
ground / run2 BEFORE ground run2 AFTER ground run2
edge / run1 BEFORE edge run1 AFTER edge run1
edge / run2 BEFORE edge run2 AFTER edge run2
overview / run1 BEFORE overview run1 AFTER overview run1
overview / run2 BEFORE overview run2 AFTER overview run2
lake / run1 BEFORE lake run1 AFTER lake run1
lake / run2 BEFORE lake run2 AFTER lake run2

Earlier six-GLB candidate — superseded by combined candidate above

Latest develop 1a5314a1d is merged locally in ee86f4757, including the world streaming updates. The pending instance-upload fix passes 179 focused core tests, core build/typecheck, and selected NVIDIA browser/desktop native cases with zero GPU errors and pixel mismatch / DeltaE 0. The selected conformance commands exit 2 because 101 unselected rows remain blocked; no full-matrix claim. The scaffold merge resolution passes all 95 scaffold/backlight tests.

Both fresh unprofiled AFTER kit runs pass, with zero diagnostics, headed NVIDIA Turing at 1920×1080. A fresh read-only judge inspected all 16 matched frames: overall NEUTRAL; no visible geometry or appearance regression. Run1 edge and lake are IMPROVEMENT; six other pairs are NEUTRAL. All labels are present (the judge corrected its initial lake-label finding after reopening originals). The earlier rejected lake artifact was not observed, but its cause is not established. The initial first-sample timeout also remains unexplained; an unchanged diagnostic rerun and both unprofiled runs pass.

The six-asset cook saves 8,818,128 bytes and meets the packed/baked budgets. The owner rule rejects NEUTRAL absent an exception; the existing size-only-cook exception request remains pending. PRD remains 75%; no candidate code push, fresh CI, or queue until visual acceptance. These screenshots supersede the prior candidate for review; its rejected history is preserved below.

Pose / run BEFORE Corrected AFTER
ground / run1 BEFORE ground run1 AFTER corrected ground run1
ground / run2 BEFORE ground run2 AFTER corrected ground run2
edge / run1 BEFORE edge run1 AFTER corrected edge run1
edge / run2 BEFORE edge run2 AFTER corrected edge run2
overview / run1 BEFORE overview run1 AFTER corrected overview run1
overview / run2 BEFORE overview run2 AFTER corrected overview run2
lake / run1 BEFORE lake run1 AFTER corrected lake run1
lake / run2 BEFORE lake run2 AFTER corrected lake run2

Merged develop verification — rejected visual set

Latest fetched develop (6202a1c10, including PRD-567 height blending and PRD-572 shadow classification) is merged locally as 094493120; CI repairs are committed locally as dfe45b1fe. These code commits are not pushed yet. The rebuilt core passed all four headed NVIDIA 1920×1080 kit playtests. The fresh independent judge inspected all 16 images: overall REGRESSION. AFTER run1 lake contains a flattened foreground tree and detached shoreline trunks; seven other comparisons are NEUTRAL. Cause is under investigation. This historical set superseded the older cook-only result; the corrected-upload comparison above is now the current review candidate. This historical set remains rejected.

Pose / run BEFORE AFTER
ground / run1 BEFORE merged develop ground run1 AFTER merged develop ground run1
ground / run2 BEFORE merged develop ground run2 AFTER merged develop ground run2
edge / run1 BEFORE merged develop edge run1 AFTER merged develop edge run1
edge / run2 BEFORE merged develop edge run2 AFTER merged develop edge run2
overview / run1 BEFORE merged develop overview run1 AFTER merged develop overview run1
overview / run2 BEFORE merged develop overview run2 AFTER merged develop overview run2
lake / run1 BEFORE merged develop lake run1 AFTER merged develop lake run1
lake / run2 BEFORE merged develop lake run2 AFTER merged develop lake run2

@jonit-dev jonit-dev added prd:0% PRD implementation has no verified phase yet prd:25% PRD phase 1 verified and removed prd:0% PRD implementation has no verified phase yet labels Oct 1, 2026
@jonit-dev

Copy link
Copy Markdown
Contributor Author

Phase 2 of 9: the baked terrain preview now passes its shared browser WebGPU and Linux desktop scenario. These are real development captures from commit 036e8bf4b.

Browser terrain and road, after a 50-metre walk. Textures, vegetation and river rendering are still pending.

Browser terrain and playable road

Browser coastal terrain with the installed spectral ocean. Shoreline foam and the final lighting/art pass are pending.

Browser coastal terrain and spectral ocean

Linux desktop coastal preview, captured in the native host. The ocean clock now advances during fixed simulation ticks.

Linux native coastal preview

The current phase stays open for ocean visual qualification. New create-threenative projects also include optional terrain authoring instructions; live editor/controller guidance will be added with those APIs.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

Phase 2 of 9 verified: the coastline now uses baked terrain heights for shallow/deep colour, shoreline foam and water masking. These are actual browser WebGPU and Linux native captures from commit 4994d6505.

Browser coast, with moving spectral waves and shoreline foam:

Browser shoreline

Linux native coast, using the same game-owned surface:

Native shoreline

Linux native view after moving the actual sun:

Native alternate sunlight

Both target scenarios and their visible water-change checks pass. A separate native run completes 300 render frames with nonblank terrain. This is an intermediate art pass: textured ground, vegetation, river rendering and the live editor remain in progress. New scaffold instructions already cover optional terrain authoring; real editor/controller instructions will follow the implemented APIs.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

Live editor milestone — the recovered controls now edit the same validated project document as the agent. The open page renders accepted terrain revisions without refresh; GUI name edits persist, and cancelling long erosion retains the last valid mesh.

Before the agent increases hill amplitude (30):

Live terrain editor before agent edit

After the agent increases hill amplitude (80):

Live terrain editor after agent edit

Human GUI edit saved to the shared document:

Recovered terrain controls with saved GUI edit

These are actual 1440 × 900 browser WebGPU captures on NVIDIA/turing. Three accepted revisions changed measured mesh heights and reached first draw in 100–134 ms on this machine. This fixture has no rendered props yet; the required 100-prop latency check stays open. Textures, vegetation, gizmos, spatial overlays and full-world export are still being implemented.

Validation: 14 terrain public-import tests pass, including real middleware/SSE/file-watch, stale/invalid write recovery and configured private-forward readiness. The real editor browser integration passes agent edits, GUI save, worker cancellation/recovery and the scene playtest. The full test command passes workspace package builds/checks and 521 root test files / 6,483 tests (12 skips). Root typecheck, lint, budgets, documentation links and 180 documentation tests pass. The existing browser and Linux desktop terrain/ocean scenarios remain green; the native host renders 300 frames (226 presentations). No mobile or steady-state FPS claim is made.

Progress: 2 of 9 implementation phases complete; the shared-document/editor phase is partial. Further visible milestones will receive new screenshot comments.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

Vegetation milestone — the live editor now draws 100 pine instances from editable game-owned source. Actual instance buffers contain 38,800 prop triangles; the trunks are grounded against the rendered terrain triangles with transformed model bounds.

Live terrain editor with 100 rendered pine props

The real WebGPU browser follows the activation-returned URL and renders three accepted hill edits without refresh in 106–137 ms on NVIDIA/turing RTX 2080 (512 m / 129-vertex fixture). GUI edits persist, reactivation returns the same project/session at the latest revision, and worker cancellation recovers. An unregistered model reports its name, releases the busy state and retains the prior preview until corrected.

The supplied scatter identity defect is fixed in the addon: shared candidates keep position/scale/yaw when earlier candidates are rejected, and changing a seed creates different keys. Two regression tests reproduce the old retargeting and pass with the fix; all 16 terrain public-import tests pass. Root typecheck, lint, budgets, documentation links and 180 documentation tests pass. The full test command passes workspace package builds/checks and 522 root test files / 6,485 tests (12 skips), with no suite temporary-directory growth.

3 of 9 implementation phases are verified. Individual selection/gizmos, persistent manual transforms, calibrated spatial tools, world controls/imports and complete export remain open. These are the supplied starter shapes; final realistic PBR art remains a required later milestone. More screenshots will follow visible changes.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

Individual prop gizmos — fc6a5c3f09. Progress: 3 of 9 phases verified. These are actual 1440 × 900 browser WebGPU captures on NVIDIA/turing RTX 2080.

  1. Select one pine by a real mesh click or the object list. Numeric fields edit its position, rotation and nonuniform scale.

Selected pine and numeric transform inspector

  1. Drag ordinary Three.js rotation and scale handles. Only that instance matrix changes; each completed drag saves once.

Pine after actual rotation and scale drags

  1. Reload restores the saved transforms. A Y-handle lift explicitly disables grounding and keeps measured clearance visible: 2.5549 m in this capture.

Reloaded pine with explicit grounding override and measured clearance

The browser check also proves Orbit suspension during drag, Escape without a transaction, selective undo, stale-drag conflict preservation with an explicit reapply draft, and unmatched override removal. Metadata transforms dispatch no terrain evaluation; all 99 sibling matrices stay unchanged. All 20 terrain tests pass. Repository checks pass; the full unit phase passes 6,489 tests after the existing gate-resume path recovered one unexplained worker exit. Landform handles, remaining editor tools, final PBR starter art and complete portable export remain in progress. These captures make no native-editor or FPS claim.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

Retained-preview fix — 1b5224730f. Progress: 3 of 9 phases verified.

A saved recipe with an unregistered asset now keeps the last valid scene and reports that the new recipe has not rendered. Metadata arriving after that failure or during active erosion retains both revision labels and every instance matrix. Cancellation keeps the valid scene; successful recovery applies the latest accepted transform.

Actual retained preview with an unrendered saved recipe and named missing-asset error

This actual WebGPU capture accompanies a red → green browser regression, including metadata during 200,000-droplet erosion, cancellation and recovery. Root typecheck/lint/budgets/docs and 180 documentation tests pass. The complete test command passes 523 files / 6,489 tests (12 skips), with no temporary-directory growth. The standalone editor scene passes too.

Previous individual-selection, rotation/scale and grounding screenshots. Landform handles and complete portable export remain open.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

Landform transforms — c2134b83d8. Progress: 3 of 9 phases verified; PRD-467 AC-3 now passes. These are actual 1440 × 900 browser WebGPU captures on NVIDIA/turing RTX 2080.

  1. Select the stable recipe layer. Its footprint follows the rendered terrain; Y rotation is available and overhanging X/Z rotations are disabled with a reason.

Selected recipe footprint with supported Y rotation

  1. Move, rotate and change vertical gain/offset through the same ordinary Three.js gizmo used for props. The footprint previews during drag; the heightfield rebuilds after the single committed gesture.

Landform after real translation rotation and vertical scale drags

  1. Imported height data has a bounded, translated, rotated and anisotropic footprint. Numeric fields use metres and degrees.

Imported heightmap after footprint and height gain edits

  1. Pasted height data uses the same recipe transform contract.

Pasted height data with saved transform parameters

The full browser check covers actual translate X/Y, rotate Y and scale Y drags, Escape with no save, selective undo preserving another actor's name/roughness, layer-list selection, and a scatter rule named landform without identity collisions. Prop gizmos, stale conflicts, reload, grounding, pending/failed revisions and cancellation remain green. The 100-prop fixture's three terrain revisions draw in 164–188 ms.

All 24 public terrain tests pass, including the original noise/erosion golden, every landform blend, rotated footprints and atomic rejection of missing/nonnumeric heights. Root typecheck/lint/budgets/docs and 180 documentation tests pass; the complete test command passes 523 files / 6,493 tests (12 skips), with no suite temporary-directory growth. Browser and Linux desktop terrain/ocean regressions pass; the desktop capture renders 300 frames with 202 presentations. These prove browser authoring and the existing baked desktop consumer, not native editor props, final PBR art or FPS. Reassignment and complete portable export remain open.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

Visual lane, step 1 of 3 — work in progress, not at the Gaia bar yet. AC-5 stays open. Commits cbc008ab8 (ground), 12477abe0 + 25785c5d9 (props), ce3d6d450. Real 1920 × 1080 browser WebGPU captures (NVIDIA/turing RTX 2080, headed). Reference target: temperate spruce meadow + alpine snow ridge.

What changed

  • Ground: six CC0 Poly Haven PBR sets (grass, forest ground, cliff, moss rock, sand, snow; 17 MiB of the 25 MiB budget, per-file sha256 and authors in credits.json), blended by height/slope/painted weights with triplanar cliffs and anti-tiling.
  • Props: seeded spruce (bark-textured trunk, drooping needle-card whorls, 3 variants), angular boulders, blade-grass clumps, placement read from the baked ground.
  • Ocean verifier now scales to the 1920 × 1080 captures (it hard-coded 1280 × 720); both ocean checks pass (66% / 51% of water pixels change).

Close meadow (new fixed benchmark camera, 1.7 m)

Meadow close

Overview

Overview

Coast

Coast

Defects I can see (will fix next, then re-judge):

  1. Spruce foliage is stippled (alpha-test noise) and reads pale/washed-out at distance — no real needle silhouette yet.
  2. Trunks render near-white: the bark map is not reaching the trunk material.
  3. Some boulders float above the ground; one stray prop hangs in the sky in the overview.
  4. Grass is sparse thin blades, no poppies yet, and the dirt bands are flat blobs.
  5. Sky is a flat colour: no clouds, haze or aerial perspective. Ocean/horizon unchanged.
  6. The desktop host does not load the ground textures yet (flat fallback), so this is web only until fixed.

Earlier tracked captures from the export milestone (cca803e08): vanilla GLTFLoader, native ordinary game, reassigned override.

PRD-467 AC-9 (embedded spatial inspection) is ticked. Progress: PRD-466 2/3 phases, PRD-467 1/3, PRD-468 0/3.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

Visual lane, checkpoint 2 — 4a01edece. Still not at the Gaia bar; AC-5 stays open. Real 1920 × 1080 WebGPU captures (RTX 2080, headed).

Fixed since the last post: trunks and crowns were solid constant colours because a node material ignores map once colorNode is set. They now multiply the sampled texture, so the spruce has real brown bark and green needle bundles. Boulder bases are buried 20% of their height. The browser scenario and both ocean checks pass.

Close meadow (1.7 m)

Meadow close

Overview

Overview

Still wrong (next): foliage stipple at distance (alpha sampling), sparse thin grass and no poppies in frame, flat dirt blobs, rocks still sit a bit proud on slopes, a stray prop in the overview sky, flat sky with no clouds, haze or aerial perspective (the biggest gap against the references), desktop host still without ground textures.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

Visual lane, checkpoint 3 — 277220896. Closer, still not Gaia; AC-5 stays open. Real 1920 × 1080 WebGPU captures (RTX 2080, headed). typecheck, root lint and the browser scenario pass; both ocean checks pass (waves 0.72, sun 0.83), 0 console errors, 1.2 ms p50 frame with 752k prop triangles. Desktop lane not run for this step.

New this round: installed Daylight Preetham sky + game-owned cumulus, sun shadows (virtual clipmaps), sky-coloured aerial haze, AgX tonemapping; dense spruce crowns at every distance (stipple gone), red poppies, thick blade grass with a focus-following density plateau, frayed dirt edges with litter, surf that is not a contour, and a new sea-horizon camera. A floating prop in the overview was a leftover query fixture, now undrawn.

Close meadow (1.7 m)

Meadow close

Overview

Overview

Sea horizon

Sea horizon

Where it still falls short of the references (my read, next round):

  1. Poppies are flat red quads, not flowers; grass sits in even rows with no clumping or colour variation.
  2. Spruce crowns read as cards, not needle-dense branches; trunks too thin/dark at the base.
  3. Rocks are smooth low-poly lumps: no stratification, no moss/lichen, no contact darkening.
  4. Overview is over-hazed, flattening the terrain; the ridge has no snow/rock transition.
  5. Coastal foreground shows 2 m heightfield facets and stretched sand texture; surf near the horizon is streaky.
  6. Desktop host still lacks the ground textures (flat fallback) — web-only until fixed.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

Visual lane, V2 progress — c2e7e2828. Better, still not AAA; AC-5 stays open. A fresh judge scored checkpoint 3 at ~4.5/10 (below shippable-indie), so V2 works its ranked defect list item by item. Real 1600 px WebGPU captures (RTX 2080, headed); JPEG q85 to respect the repo's evidence cap.

V2-1 → V2-2: close meadow. Poppies are now real flowers (stem, petal fan, dark centre) in clumped drifts, the grass no longer sits on a lattice, crowns have needle relief, wrapped light and a root flare.

Before (V1c): flat red quads on even rows.

Before: V1c meadow

After (V2-2):

After: V2-2 meadow

Honest verdict: the meadow reads as a meadow now. The spruce is the weak part: crowns still look like broad leaf shards, not needle-dense branches, and the sky and rocks are unchanged. A procedural card tree will not reach the reference, so the next lane swaps in prepared real CC0 conifer models (Poly Haven Fir Tree 01 / Fir Sapling) with the engine's new foliage-LOD and strict budgets (≤ 6k triangles near, ≤ 1.5k mid, impostor far, frame time compared before and after). V2 keeps going on rocks, ground, sand, haze and ocean.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

Visual lane, V3 progress — 31e9406ff. Rocks are now real; trees are still not good enough. AC-5 stays open. Real 1600 px WebGPU captures (RTX 2080, headed), JPEG.

Rocks (done for this round): three photoscanned CC0 Poly Haven boulders (rock moss 01/04, boulder 01), cut in Blender to 1.9–2.2k tris near / ~500 mid, triplanar-shaded with the starter's mossy-rock maps. Cost: +4 instanced draws, meadow p50 1.3 → 1.5 ms. Starter assets 22.75 of 25 MiB.

Close meadow
Overview
Player

Trees (honest): the CC0 fir cannot reach the budget — 437k needle cards of ~1 cm, so 6k triangles covers 0.3% of the crown (measured), a bare tree. It is prepared but not scattered; the procedural spruce is still the scattered tree and still reads as stacked flat cards next to the Gaia reference. A first strip of the licensed Fab Kite Scots pines (local-only, never committed) came out as bare trunks with leaf confetti, so I discarded it rather than ship it. Next: re-cut the Fab pines keeping whole foliage clusters instead of the largest cards, and measure silhouette coverage before any capture.

Still open for AC-5: trees, overview haze (over-hazed), ocean banding/foam, cliff UVs, and the other four worlds. Desktop lane: the prepared rocks load on the native host; the only failing assertion is the pre-existing "destroyed texture used in a submit" console error that the unmodified HEAD also emits.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

Visual lane, V3 — 6e76f8414. Real progress, still not Gaia: a fresh judge scored the last round 2.5/10 and this one 3.5/10 against the Gaia references. AC-5 stays open. 1600 px WebGPU captures (RTX 2080, headed). Web scenario: everything passes except diagnostics, which fails on two "ShadowDepthTexture used in a submit" errors that the unmodified HEAD also emits. Meadow p50 is 1.2 ms, overview 1.2 ms, 20 prop draws.

What changed

  • Spruces: the branch droop only ever existed in the wind weight, so every branch was dead level, which made the stacked flat tiers. Branches now really droop, each branch is three small rolled sprays instead of one paddle, crowns are lit as a volume, and the colour is a darker blue-green. A needle "floor" bug that flattened the atlas to one brightness is fixed.
  • Water: a stream follows the terrain's real drainage into a lake. The lake has a planar reflection through the engine's WaterSurface3D.
  • Terrain (engine fixes, unit-tested): roads and pads now follow the ground. The "sausage" was a road pinned 6–19 m above the slope. Hydraulic erosion left 167 single-cell spikes up to 10.6 m tall, the brown cones; there is now 1 left, which is the summit.
  • Terrain blend: rocks and trunk bases fade into soil. The engine has no terrain-blend feature, so this is game-side in src/render/.
  • Ferns: bracken under the spruces, from a CC0 frond atlas.
  • Atmosphere: a clearer sky and less haze.
  • Performance: markStatic on the terrain and props.

Meadow
Stream and lake
Overview
Walk

Judge's top remaining defects

  1. Flat lighting: no strong sun, weak shadows, a grey haze wall.
  2. Bare ground: the grass covers only the meadow focus, and the brown blotches ignore the topography.
  3. Spruces up close: noisy, with pale trunk-flare cones.
  4. Water edges: a hard polygon edge on the grass, and a ribbon-straight stream.
  5. Terrain macro form and the world edge.

Dropped as unworkable at this budget:

  • Decimated scan trees: the Fab and CC0 Poly Haven scans keep only 0.3–20% of their crown.
  • Decimated scan plants: they keep a single blade or frond.

Only the CC0 texture atlases from those plants are shipped. Fab content stays local-only and is not scattered.

Performance features: the "Nanite-like" engine feature is ClusteredMesh/ClusteredBatch (virtual geometry baked by the asset cook), plus assets.lod cooked LOD chains. This example loads raw GLBs outside the asset cook, so it uses neither yet. Routing the rocks through ClusteredBatch is the next performance step.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

Visual lane, V4 — dff98349d. A fresh judge scored V3 3.5/10. V4 scores 4.0/10 on the owner's machine (licensed pack) and 3.5/10 for the committed fallback. Still not Gaia; AC-5 stays open.

New this round

  • Real trees and plants: the owner's licensed Fab pack Landscape Pro 2.0 (pines, bush, grass clumps, rocks), loaded through Wildwood's own material and wind code. It is local-only and gitignored, with the importer committed, the same way Wildwood handles it. CI and clones fall back to the procedural spruce and the CC0 rocks.
  • Water: Wildwood's water on the stream and lake: waves, depth colour, soft shore.
  • Sky (engine fix): Daylight was fogging its own sky dome, so every game on it drew a flat grey sky. The sky is now blue with white clouds. Unit-tested red then green. Contrast is 0.70 against the Gaia reference's 0.69.
  • Three new landforms: Alpine, Desert/Canyon and Snow/Tundra are baked but not rendered yet.

Meadow
Stream and lake
Walk
Overview

Judge's verdict

  • Better: near pines (photoreal bark and branches), the sky at ground level, and no raised road or spike cones.
  • Worse: the water. Its ripples read as black blobs, which a fix in progress addresses.
  • Still wrong:
    • Distant trees dither into blue-grey blobs.
    • There is no ground cover outside the meadow.
    • The flowers are cartoon cutouts next to photoreal pines, which breaks the single-style rule.
    • The overview still ends in a white wall at the world edge.
    • The committed fallback still uses the stylized procedural spruce.

Frame cost: overview p50 is 3.8–4.4 ms, measured while the host sat at load average about 20 from other lanes. Prop draws are 24 with the pack (ceiling 24) and 21 without it.

Also running tonight in parallel: the remaining editor ACs (PRD-467 AC-4–6, PRD-468 AC-3–6) and the consumer and export ACs (PRD-466 AC-6/7, the test:consumer harness).

@jonit-dev

Copy link
Copy Markdown
Contributor Author

Visual lane, V5 — 15bc23b5f. A fresh judge scores this round 4.3/10, up from 4.0. Real progress on terrain and horizon, but still not Unreal-level; AC-5 stays open.

New this round

  • Erosion algorithm (owner: "double check your algorithm"). Four engine bugs were fixed in the terrain package, each red-green. The droplet count didn't scale with the terrain grid. The per-step bite was so deep that more droplets carved dimples, not drainage. A layer with no brush did nothing because its weights were all zeros. The spike counter reported zero without counting.
    Now: forest relief 76 → 91 m, slopes over 30° 3.8% → 22.4%, alpine 21% → 36%, tundra 0.6% → 22%.
  • Ground (Sol 6.1 lane). The brown blob decals are gone. Layers now follow slope, height and curvature, with large-scale grass variation and triplanar rock.
  • Horizon. The landscape now continues 2.1 km past the 512 m world, so there's no edge or void.
  • Lighting. Stronger sun and shadows. Ground shadow luminance is 0.065 against Gaia's 0.061.
  • Editor. PRD-467 AC-4, AC-5 and AC-6 are green and ticked.

Meadow
Walk
Overview
Stream

Judge's top remaining defects (two Sol 6.1 lanes are now working on them):

  1. The rock layer reads as pale plaster.
  2. Ground cover almost disappeared in this round.
  3. Low-poly boulders.
  4. Gullies read as dug trenches.
  5. Distant mountains are plain cones.
    Also: trees are sparse and too dark.

The dense photoreal forest lane (Project Nature Spruce Forest, grass, flowers and ferns, plus Kite photoscanned rocks and cliffs) has been restarted with Sol 6.1.

Known bug: switching to the Coastal world freezes the picture on the forest view. This dates back to the water-port merge, and a bisect lane is fixing it.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

Visual lane, V6 — 1b72e2caf. A fresh judge scores the forest world 5.0/10 (up from 4.3) and the coastal world 2.5/10. The forest now reads as good indie up close, but neither world is Unreal-level, so AC-5 stays open.

New this round

  • Engine fix: scene switches no longer freeze. VirtualShadowNode registered its shadow depth targets before three.js had created them. three then destroyed textures that bind groups still held, every submit was rejected, and the picture froze. That is why Coastal showed the forest frame. The fix registers each target as soon as it exists. It was red-green proved with a unit test against three's real texture manager: 4 destroys before, 0 after.
    The full web scenario now passes every assertion, including diagnostics, with 0 console errors. That is the first green run of this scenario on this PR. The four templates that use VirtualShadowNode get the fix through core.
  • Forest (Sol 6.1 lane). It is now built from Project Nature Spruce Forest photoscans:
    • 3,200 trees and 4,144 saplings.
    • About 180k grass and ground-foliage clumps, plus photographed flowers.
    • Kite photoscanned boulders, river rocks, scree and cliffs.
    • Frame cost: meadow 2.3 ms, overview 2.1 ms (p50 engine work).
      Licensed art stays local-only; the procedural fallback was checked with it removed.
  • Ground and atmosphere (Sol 6.1 lane).
    • Grey-brown steep rock with detail normals.
    • Softer, curved drainage.
    • The lake now sits in its basin, with planar reflection and wet banks.
    • Layered distant mountains.
    • Half-resolution contact AO.
  • PRD-466: AC-6 (custom assets) and AC-7 (discoverability) are proven and ticked, and the new test:consumer harness is green. All five worlds match hash-for-hash outside the workspace.

Meadow
Lake
Walk
Overview
Coast
Coast horizon

Judge's ranked remaining defects (next round is already being worked):

  1. Spruce crowns have a frosted mint sheen; the references are deep green.
  2. Mid and far ground is one flat olive fill, and the overview still shows gully streaks.
  3. Coastal water: opaque foam blobs, including in lagoons, no Fresnel or sun highlight, stray ellipse sprites, an aliased horizon, and a slab-like cliff.
  4. Cut-out clouds and matte-card distant mountains.
  5. Hard, sheared crown shadows; rocks not blended into the ground; poppies with black stems.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

V7 — all five worlds (e91805c)

Merged forest round 10 + worlds round 2. Full scenario green (no console/network errors); forest views p50 ≈ 2.1–2.5 ms.

Honest judge score (fresh subagent, full-res vs Gaia refs): 3.6 / 10 — forest 3.5 · coastal 4.5 · alpine 3.5 · desert 2.5 · tundra 3.0. Not there yet.

Forest meadow Forest walk Forest overview
Coast Alpine Desert Tundra

What's wrong (judge + my read): spruce/grass cards show white-blue alpha fringes; landforms are smooth and un-eroded with no real cliff faces; desert mesas read as draped cloth; blotchy dark AO/shadow patches; flat macro ground tiling; tundra sky blows out.

Changing method, two lanes running now:

  • Worlds r3: Kite Demo mountain-scale photoscans (SM_MountainRock, LargeVolcanicRock_001–004) cladding steep faces, as UE/Gaia build cliffs; RockFace003 macro+detail rock material; slope/exposure snow; real buttes with vertical walls and strata; tundra fringe and exposure fixes.
  • Forest/coast r11: atlas dilation for the card fringe, crown depth darkening, size and age variation, macro ground variation, eroded horizon mountains, shore foam and wet sand.

Licensed Fab bytes stay local-only; CI runs the procedural fallback.

Copy link
Copy Markdown
Contributor Author

Continuing the portable-export lane on this existing draft. Scope: preserve canonical terrain triangle topology during GLB export, verify the actual editor world in isolated vanilla Three.js, and add a read-only hosted screenshot/provenance check. All 73 terrain tests currently pass; full local browser proof is unavailable because this executor has no X display/Xvfb. I am retaining the concurrent V7 art update (e91805c) and will reconcile the current develop base without force-pushing. No ownership of the active art/biome lane is implied; AC-5 and complete five-world AC-8 remain open.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

V8 — all five worlds (45d6d4f)

Merged worlds round 3 + forest round 11. Full scenario green (no console/network errors).

Honest judge score: 3.8 / 10 (V7: 3.6): forest 4.5 · coastal 4.5 · alpine 2.5 · desert 3.0 · tundra 3.0. Still far from the 8.5 bar.

Forest meadow Forest walk Forest overview
Coast Alpine Desert Tundra

What changed

  • Crowns: the cyan/white crown fringe is fixed. The root cause was ambient occlusion multiplying the foliage cards' alpha, not atlas bleed. Crowns are darker and more varied.
  • Horizon: mountains now have real peaks.
  • Alpine and desert: Kite mountain photoscans are on steep faces. Desert mesas have vertical walls.
  • Tundra: the sky no longer blows out.

What's still wrong

  • Alpine: the crags read as a repeated boulder pile on a smooth cone (score dropped to 2.5).
  • Snow: hard stencil edges instead of slope- and height-driven blending.
  • Desert: strata are evenly spaced stripes, and rocks sit on vertical walls.
  • Tundra: a Voronoi crack pattern is tiled over the ground.
  • Forest and coast: painted rock patches, a lawn-like far meadow, clay-like coast land, and weak contact shadows where props meet the ground.

Running now: worlds round 4 (crag composition, snow on rock tops, irregular strata, tundra cover) and forest round 12 (real rock outcrops, far-meadow variation, rocky shore and dune grass).

@jonit-dev

Copy link
Copy Markdown
Contributor Author

V9 — all five worlds (4aa550b)

Merged forest round 12 + worlds round 4. Combined scenario green (0 failed assertions, no console errors).

Honest judge score: 3.9 / 10 (V8: 3.8): forest 4.2 · coastal 4.5 · alpine 3.0 · desert 3.5 · tundra 3.0.

Forest meadow Forest walk Forest overview
Coast Alpine Desert Tundra

What changed

  • Alpine: the crags are now embedded rock ribs, sunk by probing a ring of points around each base.
  • Desert: layered sandstone beds with talus at the foot of the walls.
  • Coast: a rocky shoreline built from Kite rocks.
  • Tundra: the white-fringed grass is fixed. It was the same cause as the forest crowns: ambient occlusion multiplying the cards' alpha.
  • Forest: rock outcrops replace the painted patches.

Honest read: the score is creeping up (3.6 → 3.8 → 3.9), not jumping. The judge keeps naming the same structural causes:

  • Spruces: olive cards with no light passing through the needles.
  • Background mountains: smooth, un-eroded continuation cones.
  • Snow: noise blobs instead of snow driven by slope and altitude.
  • Shadows: a coarse far cascade causes stair-stepping.
  • Light: flat overall.
  • Player capsule: a debug capsule is visible in the shots.

The next rounds target those directly:

  • Already running: a light, atmosphere and colour-grade lane across all five worlds.
  • Next: eroded continuation mountains and normal-driven snow, then the shading of the spruce foliage cards.

@jonit-dev

Copy link
Copy Markdown
Contributor Author

V10 — light + terrain-form lanes merged (615b9a9)

Judge: 3.84 / 10 (V9 3.9 — flat). Forest 4.5 · Coastal 4.0 · Alpine 3.0 · Desert 3.5 · Tundra 3.0 (weights 35/25/13.3/13.3/13.3).

Forest meadow Forest walk Forest overview
Coastal Alpine Desert Tundra

What changed

  • Per-world sun and sky, haze that thickens in valleys and brightens toward the sun, contact shadows where props meet the ground, and a colour grade per world.
  • Snow blends by slope and height.
  • Eroded mountain ring around the forest (baked in 14 s), irregular mesas with buttes, and a higher-resolution far shadow map for alpine and desert.
  • The player capsule is hidden in showcase views; the tundra grass grid and texture seam are fixed.
  • Scenario: 0 failed checks, ocean check green, no console errors.

Honest read: lighting and the far mountain ring did not move the score. What the judge says still holds it back:

  1. The landforms you walk on are smooth and un-eroded.
  2. The spruces read olive and card-like.
  3. Ground cover is thin over bare soil, with a hard shadow edge on forest-walk.

Next: a canopy lane is running now. It tests the Kite Demo Scots pines, grass and flowers from your Fab library against fixed spruce cards, and picks the one closer to the Gaia reference. After that, the worlds you walk on get eroded at bake time, with rock, scree and snow placed by slope and water flow.

…species near and far

The canopy lane repainted the Kite needles from luminance and then darkened
them by alpha, inner^2 and a 0.06 AO floor, which read as near-black blobs.
The needles now keep their albedo with a cool shift, a moderate inner term and
their needle transmission. Every cutout uses alpha-to-coverage on the existing
4x MSAA. Two Kite pines (tall, broad) alternate by variant, and the distant
level loads the prepared Kite mid LOD instead of the olive Spruce Forest card.
Integer textureLoad bypassed the configured filter and quantized smooth sky
and extinction gradients. Sample mip zero explicitly so both fragment and
compute consumers interpolate adjacent LUT texels.

Atmosphere lane engine fix outside example ownership; regression failed before
and passes after (31 specs), core distribution rebuilt for the example.
Record cold/warm cache timings, JSON sizes, all view budgets and self-grades.
Final licensed profiling and standard fallback pass all 54 assertions each;
unprofiled CPU variance, root gate failures and AC-5 remain explicit.
Retain requested captures, CPU profile and unmerged checkout.
…ey layer, dead needles gone

The forest read as "Tree Tree Tree" for three separable reasons, all fixed at the root.

Stands were striped. `forestWeight` was three plane waves, so a threshold through it put the
canopy on diagonals; and one tree per 4.6 m cell is a lattice whatever the mask says. It is now
two octaves of value noise, and placement is a Poisson disc whose radius follows the stand mask,
with no cell occupancy.

Every tree was one age. Size read off `forestWeight(x*0.4, z*0.4)`, the same field the density
came from, so a dense core was one height. Age now reads an independent noise field: 0.42 to 1.6
with a skew toward mid-size and a few veterans.

The understorey was missing. Litter, bracken, thickets and meadow flowers now key off the same
stand mask, plus a measured hollow term (a hollow sits below its neighbours and holds water) that
puts ferns and litter where the ground is damp. Tundra and desert grow in cluster centres instead
of one plant per lattice cell.

Licensed art, all local-only, all out of packs the canopy already cooks so each layer costs a
mesh and no atlas (121.1 MiB of a 130 MB budget, --understory): 8 grass species, 8 ground
foliage, 6 ferns, 8 flowers, 4 understorey conifers, 4 saplings, 3 needle-litter twigs.

Kite's pine atlas is half live needles and half dead — cells 4, 5 and the bare lower-branch card
are rust brown — so every crown wore rust dots and every trunk wore a tan spiky burst. Colour
decides now: a texel warmer than its own green is dead wood.

Small additive change outside my lane: `game.ts` publishes the new litter/bush counts in the
props debug block.
…f orchard

ScotsPine_01 is 19 m wide with twisted low limbs; scaled to the stand height
it turned the forest into an olive grove (q-tree2 meadow-close/overview).
The tall pine stays; stand variety moves to scale/lean in the veg lane.
Erosion lane: strong hydraulic+thermal bake erosion with bounded pickup,
per-vertex flow/sediment/deposition/talus in the baked JSON, transport-driven
surfaces and debris, crisp snow retention, bake cache keyed on the script hash
(cold 48 s, warm 1.5 s). terrain.ts kept the canopy lane's forest-turf and
coastal soil rules and took the erosion lane's transport-driven moss; the
playtest kept both new resource assertions.
jonit-dev and others added 6 commits October 9, 2026 07:14
… open)

AC-5's pending list named the 25 MiB cooked budget per starter with no runtime fetches. The kit
proofs now measure every starter under the budget: forest 8,629,287 B, alpine 5,583,809 B, desert
5,273,736 B, tundra 5,317,806 B and coastal 4,237,659 B. Each proof asserts an empty failed-request
list, and starter-kit.spec.ts rejects external GLB URIs. AC-5 stays open for the art rubric and the
tundra ice lake.

K4 records a reverted trial: a frost band 1.6 m above each tundra lake level is narrower than the
2 m splat grid, so it did not show in the overview. The judge drops are within one-point noise,
so the band is out. The committed kit is unchanged.
…nd 63, open)

Run 2026-10-09 with `pnpm --filter strata-terrain-preview test:terrain:web`, licensed assets
present, nvidia/turing, 17 views measured. The run exits 1. Three performance rows fail:
timeToReadyMs 39,622 against 15,000, afterFirstFrameTaskMs 859 against 250, and maxViewGpuMs
37.56 against 12. The CPU view p50 values are reported, not capped, under the 2026-10-02 owner
decision. The fallback run is not done. Both boxes stay unticked; the performance decision
belongs to the owner.
- three@0.185.1.patch: develop's blocks and the Strata blocks merged into one patch; lockfile
  patch_hash matches the file.
- three@0.185.1-prd269-upgrade.patch: regenerated so every recognised prior blob upgrades to the
  merged files.
- constraints.spec: allowlist world-cell-proxy.ts and world-package.ts with tight assertions;
  BundleMaterialSafety renamed BundleSurfaceSafety.
- forest-startup.spec: the mocked forest returns the water counts the fixture reads.
- terrain specs: typed Vite server params so the root program typechecks.

Evidence: pnpm typecheck exit 0; pnpm lint exit 0; vitest on packages/terrain plus core
constraints, world-bundles, world-terrain-splat, world-gpu-scene, three-patch-upgrade, packaging:
all pass; sync:agents --check in sync.
…ers, softer shadow fill (PRD-466 K3 rounds 5-6)

Judge: ground 3, trees_rocks 3, lighting_depth 2. Bar 4 not met; K3 stays open.
@jonit-dev jonit-dev added prd:75% PRD phases in, acceptance open and removed prd:50% PRD half the phases verified labels Oct 10, 2026
PRD-466 K3, K4 and AC-5 (judge >= 4 on ground, trees_rocks, lighting_depth)
stay unmet after eight rounds with CC0 assets: committed forest kit scores
3/3/3 and IMPROVEMENT over BEFORE in all four views. The three boxes move to
PRD-580 with a Decisions entry (owner go-ahead, 2026-10-09). Terrain, kit,
budget (cooked forest 14.1 MB < 25 MiB), runtime and playtest proofs stand.

Also stops evidence growth: six canopy captures PNG -> JPG, uncited generated
verification captures removed, 468 captures palette-quantized. evidence-budget
spec passes under the shipped caps.
@jonit-dev jonit-dev added prd:100% — ready PRD complete, ready to merge and removed prd:75% PRD phases in, acceptance open labels Oct 10, 2026
@jonit-dev
jonit-dev marked this pull request as ready for review October 10, 2026 05:26
@jonit-dev jonit-dev added prd:75% PRD phases in, acceptance open and removed prd:100% — ready PRD complete, ready to merge labels Oct 10, 2026
# Conflicts:
#	packages/core/src/world-terrain-splat.ts
#	packages/create-threenative/__tests__/scaffold.spec.ts
@jonit-dev

jonit-dev commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor Author

PR #381 — asset-cap WebGPU visual review

Two BEFORE and two AFTER runs for each matching pose, captured on NVIDIA Turing at 1920×1080. The fresh forest-kit scenario passed twice with zero diagnostics. Fresh read-only visual judge: ground, edge, overview, and lake all NEUTRAL; no visible texture, color, geometry, silhouette, terrain-contour, or shoreline regression.

| BEFORE run 1 | AFTER run 1 | BEFORE run 2 | AFTER run 2 |
|---|---|---|---|---|
| Ground | BEFORE run 1 ground | AFTER run 1 ground | BEFORE run 2 ground | AFTER run 2 ground |
| Edge | BEFORE run 1 edge | AFTER run 1 edge | BEFORE run 2 edge | AFTER run 2 edge |
| Overview | BEFORE run 1 overview | AFTER run 1 overview | BEFORE run 2 overview | AFTER run 2 overview |
| Lake | BEFORE run 1 lake | AFTER run 1 lake | BEFORE run 2 lake | AFTER run 2 lake |

@jonit-dev jonit-dev added prd:100% and removed prd:75% PRD phases in, acceptance open labels Oct 10, 2026
@jonit-dev
jonit-dev added this pull request to the merge queue Oct 10, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 10, 2026
@jonit-dev
jonit-dev enabled auto-merge October 10, 2026 12:33
@jonit-dev
jonit-dev added this pull request to the merge queue Oct 10, 2026
Merged via the queue into develop with commit 2d21247 Oct 10, 2026
66 checks passed
@jonit-dev jonit-dev mentioned this pull request Oct 10, 2026
12 tasks done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant