Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1180 commits
Select commit Hold shift + click to select a range
60f9085
refactor(core): the renderer's pure helpers and its bundle records mo…
jonit-dev Nov 5, 2026
8d60e86
refactor(core): move WorldCells options and the LOD-bias loop out of …
jonit-dev Nov 5, 2026
0e45e27
refactor(core): move the spawn and view readiness gates into world-ce…
jonit-dev Nov 5, 2026
5991dca
feat(terrain): a landform cook scatters the biome's own foliage (PRD-…
jonit-dev Nov 5, 2026
350e832
refactor(core): the main cull and the shadow claim decisions leave th…
jonit-dev Nov 5, 2026
dbaa396
refactor(core): move the placement build and refilter into world-cell…
jonit-dev Nov 5, 2026
66581cd
docs(prd): PRD-798 records four of phase 3's five modules and what re…
jonit-dev Nov 5, 2026
cba7bbe
docs(prd): PRD-798 names the commits its phase 3 modules landed in (P…
jonit-dev Nov 5, 2026
e193e48
refactor(core): the renderer's dress leaves the facade, and the file …
jonit-dev Nov 5, 2026
f4da820
refactor(core): finish the world-cells split at 1 454 lines and drop …
jonit-dev Nov 5, 2026
b663e0c
docs(prd): PRD-795 records the with-assets rerun of edge, vista and w…
jonit-dev Nov 5, 2026
1672520
test(strata): the world keys, spawns and launch cameras are pinned (P…
jonit-dev Nov 5, 2026
d464fe0
docs(prd): PRD-796 records the nine playtests with the licensed art p…
jonit-dev Nov 5, 2026
bfa9e71
refactor(core): read the world grid once per collaborator (PRD-799)
jonit-dev Nov 5, 2026
bf1ced3
docs(prd): PRD-799 AC-2 stays open while 12 world tests fail before a…
jonit-dev Nov 5, 2026
890bd4f
refactor(core): drop the scratch objects and the hook field the split…
jonit-dev Nov 5, 2026
ac6672c
perf(core): hand the split world passes one parts object and one grid…
jonit-dev Nov 5, 2026
ef833f4
test(terrain): bake the five biome files against the Phase 1 digests …
jonit-dev Nov 5, 2026
61b8a10
test(strata): pin the water surfaces, currents and footprints (PRD-794)
jonit-dev Nov 5, 2026
810fd3d
fix(core): world LOD masks reuse the r187 instance columns, so the ve…
jonit-dev Nov 5, 2026
962d5ec
Merge branch 'strata-ref-cells' into pr483-sync
jonit-dev Nov 5, 2026
d9298fb
Merge branch 'strata-ref-core' into pr483-sync
jonit-dev Nov 5, 2026
1a0cbb3
test(core): the two clip-ladder specs name the authored-level overrid…
jonit-dev Nov 5, 2026
140f285
test(core): the bundle deep-proof spec loads past the 600-frame cap a…
jonit-dev Nov 5, 2026
e0a28cb
test(core): the Strata shadow-cutout spec reads the mask the pack bui…
jonit-dev Nov 5, 2026
f1f363c
docs(terrain): the tundra sapling count also coincides with Phase 1 (…
jonit-dev Nov 5, 2026
5354d61
docs(prd): the forest river's wet edge stops between 13.2 m and 13.4 …
jonit-dev Nov 5, 2026
13778b8
style(core): format the split world modules (PRD-798, PRD-799)
jonit-dev Nov 5, 2026
fb5e430
style(core): sort snow-field imports and delete the stub location wit…
jonit-dev Nov 5, 2026
df4f337
docs(prd): PRD-792 AC-1 and the stage-match box stay open while two w…
jonit-dev Nov 5, 2026
9780c3c
Merge branch 'strata-ref-core' into pr483-sync
jonit-dev Nov 5, 2026
1ff28c3
docs(prd): the world suite is green on the merged splits, 898 passed …
jonit-dev Nov 5, 2026
197e392
refactor(strata): the frame counters, the reveal probe and the measur…
jonit-dev Nov 5, 2026
94e44fa
chore(strata): game.ts drops the imports its moved code took with it …
jonit-dev Nov 5, 2026
e70b7f6
fix(strata): the props readout publishes the reveal numbers, not the …
jonit-dev Nov 5, 2026
77d02fc
docs(prd): the terrain-splat playtest is green on the web lane (PRD-797)
jonit-dev Nov 5, 2026
3a0965f
docs(prd): the abyss world streams and draws on web and the native ho…
jonit-dev Nov 5, 2026
9a25868
docs(prd): the abyss flight drains its backlog on the native host (PR…
jonit-dev Nov 5, 2026
eb6a70b
docs(prd): the core build note names the engine-MCP step that stops i…
jonit-dev Nov 5, 2026
046766d
fix(core): identical comparison samplers share one binding on the thr…
jonit-dev Nov 5, 2026
ecf4c84
Merge branch 'strata-ground-fix' into pr483-sync
jonit-dev Nov 5, 2026
0816e07
test(create-threenative): re-measure the scaffold trees after the thr…
jonit-dev Nov 5, 2026
a1e4851
Merge branch 'strata-ref-core' into pr483-sync
jonit-dev Nov 5, 2026
de5646b
docs(prd): PRD-797 is done; world-tiles splits by seam and terrain-sp…
jonit-dev Nov 5, 2026
a3ab7ec
fix(core): instanceRandom and the LOD masks read three's per-object i…
jonit-dev Nov 5, 2026
daed8bf
Merge branch 'strata-ground-fix' into pr483-sync
jonit-dev Nov 5, 2026
b531f15
test(create-threenative): framework patches hash by name, so a three …
jonit-dev Nov 5, 2026
0c7aebe
refactor(strata): game.ts keeps wiring, the meadow, the spawn gate an…
jonit-dev Nov 5, 2026
8c279f1
fix(strata): a ground map that fails to load warns with TN_GROUND_MAP…
jonit-dev Nov 5, 2026
6e03811
docs(prd): the savanna GLB draws in a sandbox game on the default eng…
jonit-dev Nov 5, 2026
eb5c19d
test(terrain): the bake's per-species counts are pinned against Phase…
jonit-dev Nov 5, 2026
fc7c2d6
Merge branch 'strata-ref-cells' into pr483-sync
jonit-dev Nov 5, 2026
bdb115b
docs(prd): PRD-793 is done; a fresh judge reads the sandbox savanna f…
jonit-dev Nov 5, 2026
e3d1a19
feat(terrain): the forest and tundra kit recipes carry the road, pad …
jonit-dev Nov 5, 2026
55f4c34
docs(prd): the Strata playtest records are the owned engine's, not th…
jonit-dev Nov 5, 2026
3317c60
chore(strata): the moved prose states the positive rule (PRD-795, PRD…
jonit-dev Nov 5, 2026
7bd7a6a
docs(charter): water-body queries are core mechanism, approved by the…
jonit-dev Nov 5, 2026
5c3f0d5
Merge branch 'strata-ref-example' into pr483-sync
jonit-dev Nov 5, 2026
71e4808
docs(prd): PRD-792 records why the example bake cannot call bakeBiome…
jonit-dev Nov 5, 2026
50f6ed3
feat(core): WaterBodies answers surface, current and footprint from o…
jonit-dev Nov 5, 2026
5afb42b
Merge branch 'strata-ref-core' into pr483-sync
jonit-dev Nov 5, 2026
2f37a03
refactor(strata): the example queries one WaterBodies store instead o…
jonit-dev Nov 5, 2026
c22a8f9
docs(prd): the two coastal sea sources are two games' generated sourc…
jonit-dev Nov 5, 2026
c572037
Merge branch 'strata-ref-cells' into pr483-sync
jonit-dev Nov 5, 2026
fb19717
fix(strata): the walk scenario holds the key long enough for its own …
jonit-dev Nov 5, 2026
fa827eb
Merge branch 'strata-ref-example' into pr483-sync
jonit-dev Nov 5, 2026
5785724
test(strata): the stage-arm case gives its fake ctx the asset loader …
jonit-dev Nov 5, 2026
e9764e0
test(strata): the goto case mirrors the class's own private fields in…
jonit-dev Nov 5, 2026
a2d083d
test(strata): the canopy pins the shadow at the rest pose, where the …
jonit-dev Nov 5, 2026
9f510df
test(strata): the prop fixture carries the material groups a loaded m…
jonit-dev Nov 5, 2026
1e4814b
feat(terrain): the bake runs one ordered stream and the example bakes…
jonit-dev Nov 5, 2026
9727017
feat(terrain): the far field moves into the package, and its rule is …
jonit-dev Nov 5, 2026
d3490a1
fix(strata): the bake's stamp hashes its own module too (PRD-792)
jonit-dev Nov 5, 2026
2705abd
fix(core): a fresh world runs its first residency pass whatever the f…
jonit-dev Nov 5, 2026
a600ff7
Merge branch 'strata-ref-core' into pr483-sync
jonit-dev Nov 5, 2026
3b5efbc
docs(prd): the swim playtest stays green through the one water-body s…
jonit-dev Nov 5, 2026
8cb9cac
fix(core): a cell's published LOD ranges cost the one record the batc…
jonit-dev Nov 5, 2026
d974cb5
docs(prd): edge and vista stay green on the merged batch and walk sta…
jonit-dev Nov 5, 2026
fb068fb
test(strata): the view-scenario spec counts the vista hold the scenar…
jonit-dev Nov 5, 2026
44bfede
test(strata): the temporal AA case pins an unprimed RTT at r187's 1x1…
jonit-dev Nov 5, 2026
b472bfc
test(strata): the splat-package case stubs the config's new dependenc…
jonit-dev Nov 5, 2026
f9bbf41
test(strata): the fallback LOD case reads the published level, not re…
jonit-dev Nov 5, 2026
4a16ee4
test(strata): the cutout LOD walk reads r187 nodes and the published …
jonit-dev Nov 5, 2026
19d5a02
test(strata): the boundary walk pins the authored gates, not one shar…
jonit-dev Nov 5, 2026
8d118a9
test(strata): pin the compiled props per world, species and bucket (P…
jonit-dev Nov 5, 2026
7a47a64
Merge branch 'strata-ref-example' into pr483-sync
jonit-dev Nov 5, 2026
1c4dc65
test(strata): the splat-package case reads terrainSurfacePackage from…
jonit-dev Nov 5, 2026
bfe8de6
docs(prd): name the two findings that block the example compile's del…
jonit-dev Nov 5, 2026
fc21526
Merge branch 'strata-ref-core' into pr483-sync
jonit-dev Nov 5, 2026
e8d011f
docs(prd): the loop playtest stays green and the terrain half stops o…
jonit-dev Nov 5, 2026
3ab5029
docs(prd): the Strata half of the split's playtest is measured on the…
jonit-dev Nov 5, 2026
32f77e8
docs(prd): the Strata half of the cells split's playtest is measured …
jonit-dev Nov 5, 2026
3f48b19
docs(prd): the coastal water-look arm has a measured blocker on the o…
jonit-dev Nov 5, 2026
4b1821c
docs(prd): the five-world horizon judge has a measured coastal blocke…
jonit-dev Nov 5, 2026
617332f
feat(strata): preparePose takes the authored quaternion a baked recor…
jonit-dev Nov 5, 2026
45417b6
Merge branch 'strata-ref-play' into pr483-sync
jonit-dev Nov 5, 2026
575f6e6
fix(runtime-native): one material samples two reflectors, each with i…
jonit-dev Nov 5, 2026
05ef997
Merge branch 'strata-ref-native' into pr483-sync
jonit-dev Nov 5, 2026
254706d
fix(three-native): mrt() takes a custom slot and names its texture
jonit-dev Nov 5, 2026
089ce28
refactor(strata): the game loads the baked prop package and the examp…
jonit-dev Nov 5, 2026
02ec6fd
Merge branch 'strata-ref-core' into pr483-sync
jonit-dev Nov 5, 2026
5f3bfaa
fix(three-native): format the mrtNode facade block
jonit-dev Nov 5, 2026
04ad241
fix(runtime-native): a material's custom MRT slot is a real colour at…
jonit-dev Nov 5, 2026
c526193
style(strata): sort worlds.ts imports after the prop package merge (P…
jonit-dev Nov 5, 2026
c8ae81f
Merge branch 'strata-ref-mrt' into pr483-sync
jonit-dev Nov 5, 2026
cd7bcf4
docs(prd): PRD-796 is done, the batch README names what is still open
jonit-dev Nov 5, 2026
8a2dc63
fix(three-native): the catalog publishes mrtNode and the shadow spec …
jonit-dev Nov 5, 2026
2857322
fix(three-native): a PassNode publishes its attachments and the engin…
jonit-dev Nov 5, 2026
33f4386
fix(strata): a prop count the world holds none of reads 0, not undefi…
jonit-dev Nov 5, 2026
d3c4c27
docs(prd): PRD-795 AC-2 is green, walk and edge pass on two runs each…
jonit-dev Nov 5, 2026
efd9214
fix(renderer): a virtual shadow creates its depth map with its entry,…
jonit-dev Nov 5, 2026
35ece77
docs(prd): PRD-795 records vista red on today's head and keeps its bo…
jonit-dev Nov 5, 2026
7dca6c8
Merge branch 'strata-ref-play' into pr483-sync
jonit-dev Nov 5, 2026
6d7231a
fix(strata): a world's prop counts start at zero for every asset
jonit-dev Nov 5, 2026
23d5e59
fix(core): the LOD-range column is built at the pooled instance capacity
jonit-dev Nov 5, 2026
9f8cedc
fix(strata): the terrain scenario holds the walk key long enough for …
jonit-dev Nov 5, 2026
1ffce65
fix(strata): the prop load keeps the meadow a fixed view plants (PRD-…
jonit-dev Nov 5, 2026
674c7b1
Merge branch 'strata-ref-tjs' into pr483-sync
jonit-dev Nov 5, 2026
3e25e02
refactor(strata): drop the readout's ?? 0 helper, propCounts now fill…
jonit-dev Nov 5, 2026
997d04f
docs(prd): PRD-795 records the vista green and the prop-load cause it…
jonit-dev Nov 5, 2026
501200d
Merge branch 'strata-ref-walk' into pr483-sync
jonit-dev Nov 5, 2026
1fa5698
test(core): admit the PRD-798/799 world-cell seams and card LOD to th…
jonit-dev Nov 5, 2026
0a31e94
Merge branch 'strata-ref-tjs' into pr483-sync
jonit-dev Nov 5, 2026
dd6a054
fix(core): settle WorldCells.prewarmed for a world with nothing to pr…
jonit-dev Nov 5, 2026
08cab12
refactor(strata): join every streamed world's draw gate again
jonit-dev Nov 5, 2026
c76787a
Merge commit '08cab127b' into strata-ref-mrt
jonit-dev Nov 5, 2026
510f336
fix(runtime-native): a standard material lowers envNode as its enviro…
jonit-dev Nov 5, 2026
8629203
build(runtime-native): drop the aux-fragment test entry until its sou…
jonit-dev Nov 5, 2026
d6da9f5
fix(runtime-native): a masked MRT draw still writes its own slot, and…
jonit-dev Nov 5, 2026
dcac9a5
Merge branch 'strata-ref-mrt' into pr483-sync
jonit-dev Nov 5, 2026
b4da641
fix(strata): a build ships every file the bake's prop manifests name …
jonit-dev Nov 5, 2026
fd13f33
docs(prd): the batch's web-playtest boxes carry this head's loop and …
jonit-dev Nov 5, 2026
d6357ca
docs(prd): the five-world judge passes the horizon and the forest; PR…
jonit-dev Nov 5, 2026
2b6eda6
fix(runtime-native): a draw writes the environment intensity its prog…
jonit-dev Nov 5, 2026
bd18d32
Merge branch 'strata-ref-mrt' into pr483-sync
jonit-dev Nov 5, 2026
4103d25
fix(runtime-native): an aux bundle follows its pass's colour-target c…
jonit-dev Nov 5, 2026
58fba15
docs(prd): the batch's web playtest boxes carry this head's real runs…
jonit-dev Nov 5, 2026
54c97c1
fix(strata): a world's ground rock values are pinned per biome, and t…
jonit-dev Nov 5, 2026
d907d30
fix(three-native): a texture readback asks for a CPU-backed canvas, s…
jonit-dev Nov 5, 2026
2d0023b
Merge branch 'strata-ref-mrt' into pr483-sync
jonit-dev Nov 5, 2026
fd1dbfa
docs(prd): the final five-world judge passes the look and the water; …
jonit-dev Nov 5, 2026
85c55a7
fix(runtime-native): the threaded web engine links dlmalloc, so a Str…
jonit-dev Nov 5, 2026
8f07acd
fix(three-native): a texture readback copies any canvas into a CPU-ba…
jonit-dev Nov 5, 2026
95d8047
fix(strata): thin-needle transmission is one albedo-scaled, occlusion…
jonit-dev Nov 5, 2026
e009da5
fix(runtime-native): unlit normals, web job pool catch, V8 mrt slots,…
jonit-dev Nov 5, 2026
4871ba7
fix(three-native): native readback returns tight rows like three 0.18…
jonit-dev Nov 5, 2026
dfe1dee
fix(terrain): terrain_generate water rows reshape the cooked world, a…
jonit-dev Nov 5, 2026
a8b4f73
test(core): the adaptive-LOD kill switch test advances its clock, so …
jonit-dev Nov 5, 2026
638c9ed
fix(strata): the editor view with an ocean builds the coastal collar;…
jonit-dev Nov 5, 2026
21c713b
docs(prd): PRD-791..799 status lines match their boxes, stale counts …
jonit-dev Nov 5, 2026
d8196a0
test(strata): the Strata specs typecheck: real fixture types, importe…
jonit-dev Nov 5, 2026
07a7c22
test(core): the collar spec typechecks: the double-sided mesh owns a …
jonit-dev Nov 5, 2026
ea30e81
fix(core): the dev-tools module references the import-meta declaratio…
jonit-dev Nov 5, 2026
d4efff3
docs(prd): close PRD-791, PRD-792 and PRD-799: the Strata web playtes…
jonit-dev Nov 5, 2026
b1e89ac
docs(prd): PRD-805 and PRD-806 track the 67 verified PR #483 epic rev…
jonit-dev Nov 5, 2026
01ba312
fix(core): an unchanged scheduled instance history is not re-uploaded…
jonit-dev Nov 5, 2026
aa1bbe9
fix(create-threenative): the arena shadow test asserts the clip ladde…
jonit-dev Nov 5, 2026
124fb7a
fix(scripts): the forest proof gate anchors the starter's current rea…
jonit-dev Nov 5, 2026
189901f
fix(scripts): drop the removed blender-mcp source from the release fi…
jonit-dev Nov 5, 2026
ff09fcc
fix(create-threenative): record terrain_biome_new in the terrain MCP …
jonit-dev Nov 5, 2026
a77985f
fix(strata-terrain-preview): document the epic's six new bake scripts…
jonit-dev Nov 5, 2026
b3fee97
fix(core): keep a rejected warm-up compile out of the held launch com…
jonit-dev Nov 5, 2026
a5d21f9
fix(scripts): accept the reviewed devDependency delta in the startup …
jonit-dev Nov 5, 2026
9a8bc16
docs(prd): close PRD-805: the 8 high epic review findings are fixed; …
jonit-dev Nov 5, 2026
32bcc92
fix(assets): the terrain marker scan no longer gates GLBs no pass in …
jonit-dev Nov 5, 2026
f6bd216
fix(assets): a cooked terrain world hashes the pipeline version and i…
jonit-dev Nov 5, 2026
3282923
fix(strata-terrain-preview): a prop drag restream no longer cancels t…
jonit-dev Nov 5, 2026
5b2d7cf
fix(terrain): an orthographic observation extent measures the eye to …
jonit-dev Nov 5, 2026
1695544
fix(terrain): the scatter picker scatters the asset it shows (PRD-806…
jonit-dev Nov 5, 2026
5ab0ba3
fix(terrain): select camera rows by the class the renderer sets (PRD-…
jonit-dev Nov 5, 2026
6c526a5
fix(ci): rain's template-nonvisual leg no longer takes a CPU admissio…
jonit-dev Nov 5, 2026
f7eb06f
docs(prd): PRD-806 ticks the 7 medium findings lane B fixed; E29 is n…
jonit-dev Nov 5, 2026
ca55b19
Merge develop e9707dd6c into epic/strata-terrain-hardening
jonit-dev Nov 5, 2026
8aa9e12
Merge develop 5e030ca64 into epic/strata-terrain-hardening
jonit-dev Nov 5, 2026
c2d4fd6
Merge develop 2f0e94f44 into epic/strata-terrain-hardening
jonit-dev Nov 5, 2026
d0d5ac2
Merge develop 6a9fb16f1 into epic/strata-terrain-hardening
jonit-dev Nov 5, 2026
a75df47
Merge develop d692aaa89 into epic/strata-terrain-hardening
jonit-dev Nov 5, 2026
0f7d066
Merge develop f129102dc into epic/strata-terrain-hardening
jonit-dev Nov 5, 2026
8d3eeb9
Merge develop 7fcd31ca3 into epic/strata-terrain-hardening
jonit-dev Nov 5, 2026
d72ae0e
Merge develop 1cb51d06f into epic/strata-terrain-hardening
jonit-dev Nov 5, 2026
a2ea772
Merge develop 11bbfb577 into epic/strata-terrain-hardening
jonit-dev Nov 5, 2026
e07b5ec
Merge develop 860417707 into epic/strata-terrain-hardening
jonit-dev Nov 5, 2026
5d8c053
Merge develop 44ca79995 into epic/strata-terrain-hardening
jonit-dev Nov 5, 2026
c979c95
fix(three-native): the develop merge keeps a material's custom MRT sl…
jonit-dev Nov 5, 2026
ef61748
test(capability): the swimming alias gets its predecessor corpus row
jonit-dev Nov 5, 2026
2477f25
fix(scripts): the startup gate derives workspace package names from w…
jonit-dev Nov 5, 2026
8ca04e2
docs(core): instanceRandom carries the @example the capability docs g…
jonit-dev Nov 5, 2026
a896be9
fix(three-native): the RenderTarget waiver sits on the suppression th…
jonit-dev Nov 5, 2026
9195cf1
fix(native-engine): a copied EventDispatcher starts with no listeners…
jonit-dev Nov 5, 2026
1839a22
refactor(core): the virtual shadow level and its stock node move to v…
jonit-dev Nov 5, 2026
2fcf1fc
fix(three-native): the TSL export names carry the quality waiver thei…
jonit-dev Nov 5, 2026
9d0760e
fix(runtime-native): an uncapped present proves it did not wait by th…
jonit-dev Nov 6, 2026
2c4832b
fix(native-engine): a retained row spans its draw's key words, not th…
jonit-dev Nov 6, 2026
d9bae0c
chore(runtime-native): regenerate the native coverage report after th…
jonit-dev Nov 6, 2026
df7f513
fix(strata): the hidden capsule names why it overrides the engine's v…
jonit-dev Nov 6, 2026
5e56650
fix(core): assert the concurrent spawn waiters clear their deadlines …
jonit-dev Nov 5, 2026
9112852
fix(strata-terrain-preview): a failed horizon fetch no longer poisons…
jonit-dev Nov 5, 2026
0c2b1ba
fix(strata-terrain-preview): the kit proof empties a reused artifact …
jonit-dev Nov 5, 2026
544300b
fix(strata-terrain-preview): the swimmer enters the sea the world dra…
jonit-dev Nov 5, 2026
4a8157a
fix(strata-example): name the wildwood stage arm in the comments that…
jonit-dev Nov 5, 2026
4f808ff
fix(wasm-engine-boot): the normal-node scenario fails a run that fell…
jonit-dev Nov 5, 2026
bfa9e45
fix(strata-terrain-preview): run the shared water regressions from th…
jonit-dev Nov 5, 2026
93382bb
fix(strata-terrain-preview): drop the forest skip flag whose false ar…
jonit-dev Nov 5, 2026
d5d8cb5
fix(core): the dither-partition test reads the mask instead of plain …
jonit-dev Nov 5, 2026
927214a
fix(strata-terrain-preview): name ?farForest=on as the override the f…
jonit-dev Nov 5, 2026
ba9d075
fix(strata-terrain-preview): delete the ?massif=before knob and the s…
jonit-dev Nov 5, 2026
3b6f8e7
fix(strata-terrain-preview): sway()'s doc says the shadow casts the r…
jonit-dev Nov 5, 2026
0a84f18
fix(strata-terrain-preview): delete the ?peaks and ?meadowBase A/B kn…
jonit-dev Nov 5, 2026
ae3da3e
fix(runtime-native): a missing MRT slot refuses one read instead of k…
jonit-dev Nov 5, 2026
9756103
fix(terrain): a 409 rebase the external writer already landed settles…
jonit-dev Nov 5, 2026
7c7ada2
fix(scripts): the startup gate compares Three patch digests and recor…
jonit-dev Nov 5, 2026
6c3669a
fix(terrain): the cook reports the water it floods, not the rows it w…
jonit-dev Nov 5, 2026
c0bcaed
fix(native-renderer): accept a legal eight-attachment aux pass (PRD-8…
jonit-dev Nov 5, 2026
56330d8
fix(native-renderer): a volume texture carries the usage a texture co…
jonit-dev Nov 5, 2026
f4a75e0
fix(core): restore the frame-buffer texture name only once, after ove…
jonit-dev Nov 5, 2026
96bc50f
fix(create-threenative): stop the terrain-kit symlink walk at the fir…
jonit-dev Nov 5, 2026
de221a9
fix(core): make the bundle row-cap test really cross 1,024 rows (PRD-…
jonit-dev Nov 5, 2026
95a68e7
fix(core): exercise the depth-buffer width check without a resize eve…
jonit-dev Nov 5, 2026
bb33ad6
fix(core): endFrame's doc says a hitch still returns its split (PRD-8…
jonit-dev Nov 5, 2026
19f453b
fix(core): scale a zero-area kept card about its own centre (PRD-806 …
jonit-dev Nov 5, 2026
f86e1d1
fix(playtest): a worker relaunch no longer reports the discarded atte…
jonit-dev Nov 5, 2026
410e8cf
fix(engine-mcp): drop a stop word's inflections too, not just the wor…
jonit-dev Nov 5, 2026
7205bbd
fix(physics): a forced trunk gets a positive capsule radius (PRD-806 …
jonit-dev Nov 5, 2026
0671ca5
fix(strata): the spruce terminal minimum is taken by the loader, and …
jonit-dev Nov 5, 2026
70859b5
fix(strata-terrain-preview): bound each invalidated shadow region by …
jonit-dev Nov 5, 2026
037a918
fix(strata-terrain-preview): river rocks must sit on the river's bank…
jonit-dev Nov 5, 2026
280d471
fix(core): size the chunk shadow proxy index pool from the shadow lad…
jonit-dev Nov 5, 2026
9681e9c
fix(core): keep a file URL's triple slash when resolving terrain spla…
jonit-dev Nov 5, 2026
1043174
fix(native): state the parity bound the first-frame shadow row enforc…
jonit-dev Nov 5, 2026
33ff396
fix(assets): report a GLB with no JSON chunk where the container show…
jonit-dev Nov 5, 2026
9710cad
fix(terrain): wait for the export cook to start instead of a fixed sl…
jonit-dev Nov 5, 2026
87965ba
fix(three-native): release an object-valued uniform with the value it…
jonit-dev Nov 5, 2026
720e7bd
fix(terrain): let the example guard see path-string reads, not only i…
jonit-dev Nov 5, 2026
ab4e789
fix(terrain): describe the placement record as position, quaternion a…
jonit-dev Nov 5, 2026
60ae2ee
fix(native-renderer): a mirror's pass is reused only while its reflec…
jonit-dev Nov 5, 2026
0d8d723
fix(scripts): describe terrain peers as shipped or external (PRD-806 …
jonit-dev Nov 5, 2026
d85c15f
fix(scripts): resolve the terrain reply only on a newline-terminated …
jonit-dev Nov 5, 2026
7953968
fix(terrain): cook both AC-3 arms as tool calls in a fresh process (P…
jonit-dev Nov 5, 2026
834c2cf
fix(core): the frame-buffer name test reads the pass through its guards
jonit-dev Nov 6, 2026
00ea98c
fix(physics): name a rolling ball in RigidBody3D's capability situations
jonit-dev Nov 6, 2026
046eedc
chore(runtime-native): regenerate the native coverage report for the …
jonit-dev Nov 6, 2026
e36376a
test(core): the look constraint allow-lists the shadow level split ou…
jonit-dev Nov 6, 2026
d9b9b74
fix(native-engine): the texture-copy test builds only where the host …
jonit-dev Nov 6, 2026
fd03418
fix(assets): the terrain cook loads @threenative/terrain when it runs…
jonit-dev Nov 6, 2026
16c8a75
chore(core): rebundle the engine MCP server for the stem stop-word fi…
jonit-dev Nov 6, 2026
3186328
fix(conformance): the virtual-shadow proofs keep their three authored…
jonit-dev Nov 6, 2026
bf74408
chore(runtime-native): regenerate the native coverage report for the …
jonit-dev Nov 6, 2026
3a569e5
test(three-native): the MRT smoke builds its mrtNode through the faca…
jonit-dev Nov 6, 2026
285e04b
test(native-engine): the pooled image decode expects pooled items onl…
jonit-dev Nov 6, 2026
1b0de35
Merge remote-tracking branch 'origin/develop' into laneC-int
jonit-dev Nov 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 4 additions & 2 deletions .claude/skills/capture-strata-worlds/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@ GPU give comparable frames. A visual change still needs the visual judge subagen

1. Build the example from the repo root:
`pnpm --filter strata-terrain-preview build`
2. Serve the build on loopback:
`python3 -m http.server 8092 --bind 127.0.0.1 -d examples/strata-terrain-preview/dist &`
2. Serve the build on loopback with `vite preview`. Its middleware serves the asset library
(spruce GLBs, rockface textures, the HDR); a static server returns 404 for them and the frames
miss those assets:
`pnpm --filter strata-terrain-preview exec vite preview --host 127.0.0.1 --port 8092 --strictPort &`
3. Capture (headed, real display):
`DISPLAY=:0 node .claude/skills/capture-strata-worlds/shoot-worlds.mjs http://127.0.0.1:8092 <outDir>`
Add `--worlds alpine,desert` for a subset, and `--repo <path>` when the served build came from another worktree, so `report.json` records that checkout's commit.
Expand Down
110 changes: 97 additions & 13 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,9 @@ jobs:
plan: ${{ steps.classify.outputs.plan }}
candidate_sha: ${{ steps.classify.outputs.candidate_sha }}
base_sha: ${{ steps.classify.outputs.base_sha }}
# PRD-620: the one admitted slice of eligible HEAVY instances across all three workflows,
# at most `TN_RUNNER_SLOTS`. Empty for a fork, a missing count or no advertised runner.
# PRD-620: the one admitted slice of eligible CPU-heavy instances across all three workflows,
# at most `TN_RUNNER_SLOTS`. GPU-routed instances are excluded; empty for a fork, missing count
# or no advertised CPU runner.
runner_admission: ${{ steps.admission.outputs.runner_admission }}
# PRD-481 tree reuse: the classification asks the Actions API which successful run tested this
# exact tree. Read-only, and nothing else in the workflow gains from it.
Expand Down Expand Up @@ -121,14 +122,17 @@ jobs:
printf 'Candidate checked out once: `%s`\n' "$(git rev-parse HEAD)" >> "$GITHUB_STEP_SUMMARY"
# PRD-620: one shared admission budget for every workflow. The count comes from the publisher's
# observed idle-heavy count; a missing count or an unset runner leaves every lane hosted. The
# selected instances are the plan's required jobs in the inventory's CPU-heavy order.
# selected instances are the plan's required jobs in CPU-heavy order, excluding GPU-routed
# instances when TN_RUNNER_GPU is configured.
- id: admission
name: Admit the eligible heavy instances to the idle pool
env:
TN_CI_PLAN: ${{ steps.classify.outputs.plan }}
TN_CI_FORK: ${{ github.event.pull_request.head.repo.fork }}
TN_CI_BASE_SHA: ${{ steps.classify.outputs.base_sha }}
TN_RUNNER: ${{ vars.TN_RUNNER }}
# A temporary GPU route matches only the exact PR head, merge-group head or push SHA.
TN_RUNNER_GPU: ${{ (!vars.TN_RUNNER_GPU_HEAD || (github.event.pull_request.head.sha || github.event.merge_group.head_sha || (github.event_name == 'push' && github.sha) || '') == vars.TN_RUNNER_GPU_HEAD) && vars.TN_RUNNER_GPU || '' }}
TN_RUNNER_SLOTS: ${{ vars.TN_RUNNER_SLOTS }}
run: node scripts/ci-runner-admission.mjs --admit

Expand Down Expand Up @@ -755,6 +759,52 @@ jobs:
- uses: ./.github/actions/playwright-chromium
- run: pnpm test:playtest:ci

strata:
needs: [scope, build-artifacts]
if: ${{ needs.scope.outputs.selection == 'full' && fromJSON(needs.scope.outputs.plan).jobs.strata.required }}
runs-on: ${{ github.event.pull_request.head.repo.fork && 'ubuntu-24.04' || ((!vars.TN_RUNNER_GPU_HEAD || (github.event.pull_request.head.sha || github.event.merge_group.head_sha || (github.event_name == 'push' && github.sha) || '') == vars.TN_RUNNER_GPU_HEAD) && vars.TN_RUNNER_GPU || '') || ((!vars.TN_RUNNER || !contains(fromJSON(needs.scope.outputs.runner_admission || '[]'), 'ci:strata')) && 'ubuntu-24.04' || vars.TN_RUNNER) }}
timeout-minutes: 60
env:
TN_CI_SHA: ${{ needs.scope.outputs.candidate_sha }}
steps:
- uses: actions/checkout@v7
with:
ref: ${{ needs.scope.outputs.candidate_sha || github.sha }}
- uses: ./.github/actions/pnpm
- uses: actions/setup-node@v7
with:
node-version: 20
cache: pnpm
cache-dependency-path: |
pnpm-lock.yaml
packages/create-threenative/templates/*/package.json
- run: pnpm install --frozen-lockfile
- uses: ./.github/actions/workspace-dist
with:
shared-artifact: workspace-packages
save-bundles: "false"
- uses: ./.github/actions/playwright-chromium
- name: Run strata web playtest
run: sh scripts/xvfb.sh pnpm --filter strata-terrain-preview test:terrain:web
- name: Run strata consumer verification
run: pnpm --filter strata-terrain-preview test:consumer
- name: Run strata editor verification
run: sh scripts/xvfb.sh pnpm --filter strata-terrain-preview test:terrain:editor
- name: Run strata authored-world reproduction
run: sh scripts/xvfb.sh pnpm --filter strata-terrain-preview test:terrain:authored
- name: Run strata custom-art swap
run: sh scripts/xvfb.sh pnpm --filter strata-terrain-preview test:terrain:custom
- name: Run strata static-world export
run: sh scripts/xvfb.sh pnpm --filter strata-terrain-preview test:terrain:export
- name: Retain failed Strata playtest evidence
if: failure()
uses: actions/upload-artifact@v7
with:
name: strata-playtest-${{ github.run_id }}-${{ github.run_attempt }}-${{ needs.scope.outputs.candidate_sha }}
path: examples/strata-terrain-preview/artifacts/playtest/
if-no-files-found: ignore
retention-days: 7

golden-path-template:
needs: [scope, build-artifacts]
if: ${{ (needs.scope.outputs.selection == 'full' || needs.scope.outputs.selection == 'template' || needs.scope.outputs.selection == 'review') && !contains(fromJSON(needs.scope.outputs.plan).carriedJobs, 'golden-path-template') }}
Expand Down Expand Up @@ -900,10 +950,10 @@ jobs:
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.scope.outputs.plan).templateMatrix }}
# Routes through the idle-pool switch with hosted fallback: forks fall through to hosted and
# snapshot fallback is best-effort, so queued legs may remain local.
runs-on: ${{ (github.event.pull_request.head.repo.fork || !vars.TN_RUNNER || !contains(fromJSON(needs.scope.outputs.runner_admission || '[]'), format('ci:template-nonvisual:{0}', matrix.template))) && 'ubuntu-24.04' || vars.TN_RUNNER }}
# rain relaunches the page for each of its five GPU-free scenarios. On the hosted SwiftShader
# Racing and Rain can use the opt-in GPU pool; other legs use the shared CPU pool with hosted fallback.
# Forks always stay hosted, and snapshot fallback is best-effort.
runs-on: ${{ github.event.pull_request.head.repo.fork && 'ubuntu-24.04' || ((matrix.template == 'racing' || matrix.template == 'rain') && ((!vars.TN_RUNNER_GPU_HEAD || (github.event.pull_request.head.sha || github.event.merge_group.head_sha || (github.event_name == 'push' && github.sha) || '') == vars.TN_RUNNER_GPU_HEAD) && vars.TN_RUNNER_GPU || '')) || ((!vars.TN_RUNNER || !contains(fromJSON(needs.scope.outputs.runner_admission || '[]'), format('ci:template-nonvisual:{0}', matrix.template))) && 'ubuntu-24.04' || vars.TN_RUNNER) }}
# Rain relaunches the page for each of its five nonvisual scenarios. On the hosted SwiftShader
# adapter each launch now takes about 7 minutes, against about 1 minute on develop (runs
# 38818830914 and 38824021621), so five launches exceed the 30-minute cap. Only rain gets the
# larger cap until that software launch cost is reduced; every other leg keeps 30 minutes.
Expand All @@ -918,7 +968,7 @@ jobs:
timeout-minutes: ${{ matrix.template == 'shooter' && 60 || matrix.template == 'rain' && 60 || 30 }}
env:
TN_CI_SHA: ${{ needs.scope.outputs.candidate_sha }}
TN_PLAYTEST_ALLOW_SOFTWARE: "1"
TN_PLAYTEST_ALLOW_SOFTWARE: ${{ (matrix.template == 'rain' && !github.event.pull_request.head.repo.fork && ((!vars.TN_RUNNER_GPU_HEAD || (github.event.pull_request.head.sha || github.event.merge_group.head_sha || (github.event_name == 'push' && github.sha) || '') == vars.TN_RUNNER_GPU_HEAD) && vars.TN_RUNNER_GPU) && '0') || '1' }}
steps:
- uses: actions/checkout@v7
with:
Expand Down Expand Up @@ -985,8 +1035,15 @@ jobs:
# assertion, frame bound and budget is unchanged, and an ordinary CLI run keeps 15 s.
pnpm --dir "$target" exec threenative-playtest "${scenario_args[@]}" \
--browser-recipe webgpu --headed --no-screenshots --server-timeout 120000 \
--artifacts "$GITHUB_WORKSPACE/artifacts/template-nonvisual/${{ matrix.template }}" \
--server-command "pnpm dev --host 127.0.0.1 --port \$PORT --strictPort"
# Engine parity guard: the same pose on engine "threejs" and on "threenative", compared by
- name: Retain failed template observations
if: failure()
uses: actions/upload-artifact@v7
with:
name: template-nonvisual-${{ matrix.template }}-failure
path: artifacts/template-nonvisual/${{ matrix.template }}/
# Engine parity guard: the same pose on engine "threejs" and on "threenative", compared by
# 4x4 tile means (scripts/engine-parity.ts). Both arms share this runner's adapter, so a
# software rasteriser still catches a wrong exposure, colour, fog or a missing object.
- name: Compare the two engines on one pose
Expand Down Expand Up @@ -1123,14 +1180,14 @@ jobs:
benchmark:
needs: [scope, build-artifacts]
if: ${{ needs.scope.outputs.selection == 'full' && !contains(fromJSON(needs.scope.outputs.plan).carriedJobs, 'benchmark') }}
runs-on: ${{ (github.event.pull_request.head.repo.fork || !vars.TN_RUNNER || !contains(fromJSON(needs.scope.outputs.runner_admission || '[]'), 'ci:benchmark')) && 'ubuntu-24.04' || vars.TN_RUNNER }}
runs-on: ${{ github.event.pull_request.head.repo.fork && 'ubuntu-24.04' || ((!vars.TN_RUNNER_GPU_HEAD || (github.event.pull_request.head.sha || github.event.merge_group.head_sha || (github.event_name == 'push' && github.sha) || '') == vars.TN_RUNNER_GPU_HEAD) && vars.TN_RUNNER_GPU || '') || ((!vars.TN_RUNNER || !contains(fromJSON(needs.scope.outputs.runner_admission || '[]'), 'ci:benchmark')) && 'ubuntu-24.04' || vars.TN_RUNNER) }}
timeout-minutes: 25
env:
TN_CI_SHA: ${{ needs.scope.outputs.candidate_sha }}
steps:
- uses: actions/checkout@v7
with:
ref: ${{ needs.scope.outputs.candidate_sha || github.sha }}
ref: ${{ needs.scope.outputs.candidate_sha }}
- uses: ./.github/actions/pnpm
- uses: actions/setup-node@v7
with:
Expand Down Expand Up @@ -1159,6 +1216,32 @@ jobs:
# a second copy of the slowest step in the workflow.
- if: github.event_name == 'schedule'
run: sh scripts/xvfb.sh pnpm exec playwright test --config=benchmark.playwright.config.ts
# Software startup regression contract only; hardware and visual acceptance remain separate.
- uses: actions/checkout@v7
with:
ref: 88b988cd70d5db7266eb0281e5f74bd0e030b3e7
path: .worktrees/strata-startup-baseline
- name: Build isolated reviewed Strata baseline
timeout-minutes: 5
working-directory: .worktrees/strata-startup-baseline
run: |
set -euo pipefail
pnpm install --frozen-lockfile
pnpm --filter strata-terrain-preview... build
- name: Bake candidate Strata source
timeout-minutes: 3
run: pnpm --filter strata-terrain-preview bake
- name: Enforce Strata startup median
timeout-minutes: 9
env:
EXPECTED_SOURCE_SHA: ${{ needs.scope.outputs.candidate_sha }}
run: timeout 9m pnpm tsx scripts/verify-strata-startup.ts
- uses: actions/upload-artifact@v4
if: always()
with:
name: strata-startup-${{ needs.scope.outputs.candidate_sha }}
path: artifacts/strata-startup/
if-no-files-found: warn

# visuals is NOT a job here any more. It captures frames from a WebGPU canvas, and this runner
# has no GPU — its first execution in the repository's history failed on
Expand Down Expand Up @@ -1222,7 +1305,7 @@ jobs:
node-version: 20
cache: pnpm
- run: pnpm install --frozen-lockfile
# Before the pack inside workspace-dist: runtime-native lists the web engine in `files`, and
# Before the pack inside workspace-dist: runtime-native lists the web engine in `files`, and
# `pnpm pack` drops a file that is not there yet.
- uses: ./.github/actions/native-engine-wasm
- uses: ./.github/actions/workspace-dist
Expand Down Expand Up @@ -1629,7 +1712,7 @@ jobs:
# The only required context after protected-develop cutover. Explicit exemptions are not passes.
# Legacy main contexts stay in place until the owner changes protection after full qualification.
ci-required:
needs: [scope, integration, native-platforms, native-engine, typecheck, lint, test, test-unit, test-native, test-browser, test-playtest, golden-path-template, template-nonvisual, template-engine-cost, golden-path, benchmark, build, build-artifacts, budgets, performance-contracts, supply-chain]
needs: [scope, integration, native-platforms, native-engine, typecheck, lint, test, test-unit, test-native, test-browser, test-playtest, strata, golden-path-template, template-nonvisual, template-engine-cost, golden-path, benchmark, build, build-artifacts, budgets, performance-contracts, supply-chain]
if: ${{ always() && !github.event.pull_request.draft }}
runs-on: ${{ (github.event.pull_request.head.repo.fork || !vars.TN_RUNNER_LIGHT) && 'ubuntu-24.04' || vars.TN_RUNNER_LIGHT }}
# 15, not 5: `fetch-depth: 0` pulls every branch and tag, which takes over five minutes on a
Expand Down Expand Up @@ -1724,6 +1807,7 @@ jobs:
- test-native
- test-browser
- test-playtest
- strata
- golden-path-template
- template-nonvisual
- template-engine-cost
Expand Down
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,8 @@ examples/auto-lod/public/

# Generated by prepack from packages/core/patches (the only tracked copy).
packages/create-threenative/template-assets/patches/
# scripts/stage-terrain-kits.mjs writes these kits from packages/terrain/starter, the only tracked copy.
/packages/create-threenative/template-assets/terrain/

# Licensed (non-redistributable) local art for review; never committed
examples/strata-terrain-preview/local-assets/
Expand All @@ -209,12 +211,16 @@ examples/native-css-hud/corpus/out-interaction/
examples/native-css-hud/corpus/out-desktop/
examples/native-css-hud/bench/out/

# Forest kit headless bake output (authored recipe and assets remain tracked).
/packages/terrain/starter/forest/world/
# Unreal reference project (PRD-631): run-time state and captures; only reference-stats.json and the baseline sheet are tracked
tools/unreal-reference/Saved/
tools/unreal-reference/Intermediate/
tools/unreal-reference/DerivedDataCache/
tools/unreal-reference/Content/
tools/unreal-reference/captures/
tools/unreal-reference/gi/**/__pycache__/
# The terrain preview's opt-in engine build (pnpm build:engine) writes here.
examples/strata-terrain-preview/dist-engine/

dist-one-spell/
3 changes: 2 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ One source, two runtimes: browser WebGPU and an owned C++ host for desktop/Andro
| --- | --- |
| Anything that **decides how it looks** — materials, shaders, TSL, lights, tonemapping, post, framing — and any preset or default picking one | `templates/*/src/render/`, as generated user source |
| The **mechanism** that puts it on screen — pooling, lifetime, billboarding, instancing, dispatch, culling — with every appearance parameter from the game; plumbing every game repeats | `packages/core/src/` |
| Optional terrain authoring and terrain-only editor companions, within the CHARTER allowance | `packages/terrain/`; appearance remains generated game source |
| Physics or navigation (WASM dep) · React HUD/menu bindings · C++ host, platform bring-up, native systems · scenario harness and assertions | `packages/physics/` · `ui/` · `runtime-native/` · `playtest/` |
| Gameplay, never in a package · proof that any of it works | an example or template · `<package>/__tests__/*.spec.ts` **and** a playtest scenario |

Expand All @@ -63,7 +64,7 @@ pnpm check:docs && pnpm exec vitest run scripts/__tests__/check-doc-links.spec.t
pnpm test:playtest # playtests against the in-repo example fixture
pnpm test:templates # playtests against each scaffolded template
pnpm budgets # hard invariants fail; LOC triggers only report
pnpm quality # file length, suppressions, lint holes; never fatal
pnpm quality # file length notices; a 3 000-line cap and suppressions are fatal
pnpm sync:agents # regenerate CLAUDE.md mirrors
pnpm prd:progress <prd file> # PRD boxes -> prd:25/50/75/100 label; exit 1 = no phase boxes
pnpm release:prepare # bump, build, preflight the release cohort
Expand Down
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,17 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

### Breaking

- `@threenative/terrain/export` removes `exportWorldGLB`. Prepare the browser scene with
`prepareWorldGLTF`, then encode it in Node with `cookTerrainWorld({ preparedWorld: prepared.json })`
from `@threenative/assets`; the editor already uses this shared cook.

- `@threenative/assets`'s `cookTerrainWorld` declaration adds a prepared-world JSON overload
for the terrain editor's portable GLB export. Existing state/species/out calls remain valid;
the new overload embeds the game's frozen scene without instancing or filesystem output.

- `@threenative/terrain`'s `makeExport` declaration adds a `"project"` overload accepting
a null terrain state, so recipes can be exported before the first evaluation. Existing
calls remain valid; non-project exports still require an evaluated state.
- `@threenative/core`'s `AutoExposureNode` extends Three's `Node` instead of the `TempNode` that
Three 0.187 deprecated (PRD-775), so its recorded signature changes. No game code names that
base class: `exposure` still returns the same node with the same constructor arguments, and the
Expand Down
Loading
Loading