Repository navigation
feat: integrate Strata terrain, live editor and game handoff (PRDs 466–468) - #381
Conversation
|
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 Browser terrain and road, after a 50-metre walk. Textures, vegetation and river rendering are still pending. Browser coastal terrain with the installed spectral ocean. Shoreline foam and the final lighting/art pass are pending. Linux desktop coastal preview, captured in the native host. The ocean clock now advances during fixed simulation ticks. 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. |
|
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 Browser coast, with moving spectral waves and shoreline foam: Linux native coast, using the same game-owned surface: Linux native view after moving the actual sun: 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. |
|
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): After the agent increases hill amplitude (80): Human GUI edit saved to the shared document: 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. |
|
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. 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. |
|
Individual prop gizmos —
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. |
|
Retained-preview fix — 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. 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. |
|
Landform transforms —
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 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. |
|
Visual lane, step 1 of 3 — work in progress, not at the Gaia bar yet. AC-5 stays open. Commits What changed
Close meadow (new fixed benchmark camera, 1.7 m) Overview Coast Defects I can see (will fix next, then re-judge):
Earlier tracked captures from the export milestone ( PRD-467 AC-9 (embedded spatial inspection) is ticked. Progress: PRD-466 2/3 phases, PRD-467 1/3, PRD-468 0/3. |
|
Visual lane, checkpoint 2 — Fixed since the last post: trunks and crowns were solid constant colours because a node material ignores Close meadow (1.7 m) 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. |
|
Visual lane, checkpoint 3 — New this round: installed Close meadow (1.7 m) Overview Sea horizon Where it still falls short of the references (my read, next round):
|
|
Visual lane, V2 progress — 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. After (V2-2): 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. |
|
Visual lane, V3 progress — 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. 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. |
|
Visual lane, V3 — What changed
Judge's top remaining defects
Dropped as unworkable at this budget:
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 |
|
Visual lane, V4 — New this round
Judge's verdict
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 |
|
Visual lane, V5 — New this round
Judge's top remaining defects (two Sol 6.1 lanes are now working on them):
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. |
|
Visual lane, V6 — New this round
Judge's ranked remaining defects (next round is already being worked):
|
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.
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:
Licensed Fab bytes stay local-only; CI runs the procedural fallback. |
|
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 ( |
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.
What changed
What's still wrong
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). |
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.
What changed
Honest read: the score is creeping up (3.6 → 3.8 → 3.9), not jumping. The judge keeps naming the same structural causes:
The next rounds target those directly:
|
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).
What changed
Honest read: lighting and the far mountain ring did not move the score. What the judge says still holds it back:
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.
… 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.
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.
# Conflicts: # packages/core/src/world-terrain-splat.ts # packages/create-threenative/__tests__/scaffold.spec.ts
PR #381 — asset-cap WebGPU visual reviewTwo 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 | |





























































































Merged — final status (2026-10-10)
PR381 squash-merged into develop at
2d212479255cf725f64343dc72aa2eafe9b7b92d, from final headba284199ddbc8bd8b15574548ab5b35f75565eee. 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
31f813c72includes latest fetched develop1a5314a1d, its world streaming updates, remote CI/asset repairs throughf32d791cf, 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
38043597475coversf32d791cf, not this combined local candidate, and currently has six failed template jobs reporting SwiftShader device loss andInstance 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
Combined candidate — run 2
The optional
@threenative/terrainaddon 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%
docs/PRDs/done/.docs/PRDs/done/.docs/PRDs/done/.pnpm prd:progressprintsprd:100% — readyand 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.
What this PR keeps
ece594ad8: baked world 34,312,316 bytes exceeds 25 MiB; packed starter assets 50,695,422 bytes exceeds 40 MiB. Both failures reproduce locally instarter-kit.spec.ts; correction is in progress.Verification run on the final head
ece594ad8pnpm check:docsandcheck-doc-links,evidence-budget,evidence-citations,sync-agent-docsspecs: 39/39 pass.ci:fastdrift checks: agents, docs, lint, drift pass.KIT=forest pnpm --filter strata-terrain-preview test:kit) produced the R7 captures. Itsperformance.maxPhaseMsP95.renderassertion 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.
Earlier six-GLB candidate — superseded by combined candidate above
Latest develop
1a5314a1dis merged locally inee86f4757, 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.
Merged develop verification — rejected visual set
Latest fetched
develop(6202a1c10, including PRD-567 height blending and PRD-572 shadow classification) is merged locally as094493120; CI repairs are committed locally asdfe45b1fe. 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.