@jgengine/convex 0.51.0 → 0.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -26,6 +26,234 @@ At publish, rename this heading to the new version and mirror the entries into
26
26
  `packages/core/src/meta/changelog.ts` (the typed `CHANGELOG` export).
27
27
  -->
28
28
 
29
+ ## 0.53.0
30
+
31
+ ### Migrate
32
+
33
+ - **Bump lockstep SDK packages to `^0.53.0`:** `@jgengine/{core,rapier,react,ws,node,sql,convex,shell,editor,assets,navbake}`. CLI `jgengine` is `0.50.0`; `@jgengine/github` is `0.40.0`.
34
+ - buildCatalog takes packs: [kaykitDungeon, ...] imported from @jgengine/assets/generated/packs instead of sources: ["kaykit-dungeon", ...].
35
+ - defineGame's uiKit takes the kit object (import { inkKit } from "@jgengine/core/ui/kit/uiKitInk.view") instead of a name; resolveUiKit is removed.
36
+ - an editor or tool that needs every scene kind without a game scene calls registerAllSceneKinds() and registerAllSceneKindRenderers().
37
+
38
+ ### Added
39
+
40
+ - apps/web build:checked, the checked build deploy:cloudflare uploads and the release checks
41
+ - `STARTER_MODEL_PACKS` (`@jgengine/assets`): The model packs behind the curated starter assets: the same packs, in order, as `STARTER_SOURCE_PACKS`. Also `AssetPack`, `generatedPacks`, `packExportName`.
42
+ - `STARTER_MODEL_PACKS` (`@jgengine/assets/catalogs/starter`): The model packs behind the curated starter assets: the same packs, in order, as `STARTER_SOURCE_PACKS`.
43
+ - `generatedPacks` (`@jgengine/assets/generated`): Every pulled pack.
44
+ - `kaykitAdventurers` (`@jgengine/assets/generated/pack/kaykit-adventurers`): ⚠ undocumented
45
+ - `kaykitCityBuilder` (`@jgengine/assets/generated/pack/kaykit-city-builder`): ⚠ undocumented
46
+ - `kaykitDungeon` (`@jgengine/assets/generated/pack/kaykit-dungeon`): ⚠ undocumented
47
+ - `kaykitForest` (`@jgengine/assets/generated/pack/kaykit-forest`): ⚠ undocumented
48
+ - `kaykitFurniture` (`@jgengine/assets/generated/pack/kaykit-furniture`): ⚠ undocumented
49
+ - `kaykitMedievalHexagon` (`@jgengine/assets/generated/pack/kaykit-medieval-hexagon`): ⚠ undocumented
50
+ - `kaykitSkeletons` (`@jgengine/assets/generated/pack/kaykit-skeletons`): ⚠ undocumented
51
+ - `kaykitSpaceBase` (`@jgengine/assets/generated/pack/kaykit-space-base`): ⚠ undocumented
52
+ - `quaternius5LowPolyAnimals` (`@jgengine/assets/generated/pack/quaternius-5-low-poly-animals`): ⚠ undocumented
53
+ - `quaterniusAnimatedAnimalesLowPoly` (`@jgengine/assets/generated/pack/quaternius-animated-animales-low-poly`): ⚠ undocumented
54
+ - `quaterniusAnimatedAnimals` (`@jgengine/assets/generated/pack/quaternius-animated-animals`): ⚠ undocumented
55
+ - `quaterniusAnimatedCharactersPack` (`@jgengine/assets/generated/pack/quaternius-animated-characters-pack`): ⚠ undocumented
56
+ - `quaterniusAnimatedDinosaurs` (`@jgengine/assets/generated/pack/quaternius-animated-dinosaurs`): ⚠ undocumented
57
+ - `quaterniusAnimatedFish` (`@jgengine/assets/generated/pack/quaternius-animated-fish`): ⚠ undocumented
58
+ - `quaterniusAnimatedHumanLowPoly` (`@jgengine/assets/generated/pack/quaternius-animated-human-low-poly`): ⚠ undocumented
59
+ - `quaterniusAnimatedLowpolyRobot` (`@jgengine/assets/generated/pack/quaternius-animated-lowpoly-robot`): ⚠ undocumented
60
+ - `quaterniusAnimatedMechPack` (`@jgengine/assets/generated/pack/quaternius-animated-mech-pack`): ⚠ undocumented
61
+ - `quaterniusFantasyLowPolyTreesAndBushes` (`@jgengine/assets/generated/pack/quaternius-fantasy-low-poly-trees-and-bushes`): ⚠ undocumented
62
+ - `quaterniusFantasyProps` (`@jgengine/assets/generated/pack/quaternius-fantasy-props`): ⚠ undocumented
63
+ - `quaterniusFurnitureLowPoly` (`@jgengine/assets/generated/pack/quaternius-furniture-low-poly`): ⚠ undocumented
64
+ - `quaterniusLowPolyAnimatedGuns` (`@jgengine/assets/generated/pack/quaternius-low-poly-animated-guns`): ⚠ undocumented
65
+ - `quaterniusLowPolyCars0` (`@jgengine/assets/generated/pack/quaternius-low-poly-cars-0`): ⚠ undocumented
66
+ - `quaterniusLowPolyDesertAssets` (`@jgengine/assets/generated/pack/quaternius-low-poly-desert-assets`): ⚠ undocumented
67
+ - `quaterniusLowPolyFoodPack` (`@jgengine/assets/generated/pack/quaternius-low-poly-food-pack`): ⚠ undocumented
68
+ - `quaterniusLowPolyFurniture1` (`@jgengine/assets/generated/pack/quaternius-low-poly-furniture-1`): ⚠ undocumented
69
+ - `quaterniusLowPolyGuns` (`@jgengine/assets/generated/pack/quaternius-low-poly-guns`): ⚠ undocumented
70
+ - `quaterniusLowPolyGunsPack` (`@jgengine/assets/generated/pack/quaternius-low-poly-guns-pack`): ⚠ undocumented
71
+ - `quaterniusLowPolyMedievalWeapons` (`@jgengine/assets/generated/pack/quaternius-low-poly-medieval-weapons`): ⚠ undocumented
72
+ - `quaterniusLowPolyNaturePack1` (`@jgengine/assets/generated/pack/quaternius-low-poly-nature-pack-1`): ⚠ undocumented
73
+ - `quaterniusLowPolyPiratePack` (`@jgengine/assets/generated/pack/quaternius-low-poly-pirate-pack`): ⚠ undocumented
74
+ - `quaterniusLowPolyRpgPack` (`@jgengine/assets/generated/pack/quaternius-low-poly-rpg-pack`): ⚠ undocumented
75
+ - `quaterniusLowPolySpaceAssets` (`@jgengine/assets/generated/pack/quaternius-low-poly-space-assets`): ⚠ undocumented
76
+ - `quaterniusLowpolyAnimatedFarmAnimalPack` (`@jgengine/assets/generated/pack/quaternius-lowpoly-animated-farm-animal-pack`): ⚠ undocumented
77
+ - `quaterniusLowpolyAnimatedKnight` (`@jgengine/assets/generated/pack/quaternius-lowpoly-animated-knight`): ⚠ undocumented
78
+ - `quaterniusLowpolyAnimatedMonsters` (`@jgengine/assets/generated/pack/quaternius-lowpoly-animated-monsters`): ⚠ undocumented
79
+ - `quaterniusLowpolyBuildings` (`@jgengine/assets/generated/pack/quaternius-lowpoly-buildings`): ⚠ undocumented
80
+ - `quaterniusLowpolyBuildingsPack` (`@jgengine/assets/generated/pack/quaternius-lowpoly-buildings-pack`): ⚠ undocumented
81
+ - `quaterniusLowpolyCars` (`@jgengine/assets/generated/pack/quaternius-lowpoly-cars`): ⚠ undocumented
82
+ - `quaterniusLowpolyCropsPack` (`@jgengine/assets/generated/pack/quaternius-lowpoly-crops-pack`): ⚠ undocumented
83
+ - `quaterniusLowpolyHouseInteriorPack` (`@jgengine/assets/generated/pack/quaternius-lowpoly-house-interior-pack`): ⚠ undocumented
84
+ - `quaterniusLowpolyMedievalBuildings` (`@jgengine/assets/generated/pack/quaternius-lowpoly-medieval-buildings`): ⚠ undocumented
85
+ - `quaterniusLowpolyMedievalVillagePack` (`@jgengine/assets/generated/pack/quaternius-lowpoly-medieval-village-pack`): ⚠ undocumented
86
+ - `quaterniusLowpolyMedievalWeapons` (`@jgengine/assets/generated/pack/quaternius-lowpoly-medieval-weapons`): ⚠ undocumented
87
+ - `quaterniusLowpolyModularDungeonPack` (`@jgengine/assets/generated/pack/quaternius-lowpoly-modular-dungeon-pack`): ⚠ undocumented
88
+ - `quaterniusLowpolyModularSciFiEnvironments` (`@jgengine/assets/generated/pack/quaternius-lowpoly-modular-sci-fi-environments`): ⚠ undocumented
89
+ - `quaterniusLowpolyModularStreetPack` (`@jgengine/assets/generated/pack/quaternius-lowpoly-modular-street-pack`): ⚠ undocumented
90
+ - `quaterniusLowpolyNaturePack` (`@jgengine/assets/generated/pack/quaternius-lowpoly-nature-pack`): ⚠ undocumented
91
+ - `quaterniusLowpolyPosedHumans` (`@jgengine/assets/generated/pack/quaternius-lowpoly-posed-humans`): ⚠ undocumented
92
+ - `quaterniusLowpolyPublicTransport` (`@jgengine/assets/generated/pack/quaternius-lowpoly-public-transport`): ⚠ undocumented
93
+ - `quaterniusLowpolyRpg` (`@jgengine/assets/generated/pack/quaternius-lowpoly-rpg`): ⚠ undocumented
94
+ - `quaterniusLowpolyRpgCharacters` (`@jgengine/assets/generated/pack/quaternius-lowpoly-rpg-characters`): ⚠ undocumented
95
+ - `quaterniusLowpolyShipPack` (`@jgengine/assets/generated/pack/quaternius-lowpoly-ship-pack`): ⚠ undocumented
96
+ - `quaterniusLowpolySpaceshipsPack` (`@jgengine/assets/generated/pack/quaternius-lowpoly-spaceships-pack`): ⚠ undocumented
97
+ - `quaterniusLowpolySteampunkTurrets` (`@jgengine/assets/generated/pack/quaternius-lowpoly-steampunk-turrets`): ⚠ undocumented
98
+ - `quaterniusLowpolySurvivalPack` (`@jgengine/assets/generated/pack/quaternius-lowpoly-survival-pack`): ⚠ undocumented
99
+ - `quaterniusLowpolyTexturedTrees` (`@jgengine/assets/generated/pack/quaternius-lowpoly-textured-trees`): ⚠ undocumented
100
+ - `quaterniusMedievalVillage` (`@jgengine/assets/generated/pack/quaternius-medieval-village`): ⚠ undocumented
101
+ - `quaterniusModularMen` (`@jgengine/assets/generated/pack/quaternius-modular-men`): ⚠ undocumented
102
+ - `quaterniusModularScifi` (`@jgengine/assets/generated/pack/quaternius-modular-scifi`): ⚠ undocumented
103
+ - `quaterniusModularWomen` (`@jgengine/assets/generated/pack/quaternius-modular-women`): ⚠ undocumented
104
+ - `quaterniusStylizedNature` (`@jgengine/assets/generated/pack/quaternius-stylized-nature`): ⚠ undocumented
105
+ - `quaterniusTexturedCuteMonsterPack` (`@jgengine/assets/generated/pack/quaternius-textured-cute-monster-pack`): ⚠ undocumented
106
+ - `quaterniusToonShooter` (`@jgengine/assets/generated/pack/quaternius-toon-shooter`): ⚠ undocumented
107
+ - `kaykitAdventurers` (`@jgengine/assets/generated/packs`): ⚠ undocumented Also `kaykitCityBuilder`, `kaykitDungeon`, `kaykitForest`, `kaykitFurniture`, `kaykitMedievalHexagon`, `kaykitSkeletons`, `kaykitSpaceBase`, `quaternius5LowPolyAnimals` and 54 more.
108
+ - `writeIndexBarrels` (`@jgengine/assets/indexGen`): Writes the generated pack modules and the barrel over every `<source>.json` already in `outDir`.
109
+ - `packExportName` (`@jgengine/assets/manifest`): The name a pack is exported under in `generated/packs`: its source id in camelCase (`kaykit-dungeon` → `kaykitDungeon`). Also `AssetPack`.
110
+ - `OnDemandSceneKindId` (`@jgengine/core/scene/onDemandSceneKinds`): A heavy built-in system a scene loads only when it uses one of its kinds or generators. Also `SceneKindNeeds`.
111
+
112
+ ### Changed
113
+
114
+ - every library species is checked for a valid record that grows finite, non-negative sizes and builds a mesh, open and in a stand
115
+
116
+ ### Fixed
117
+
118
+ - the shrub fit reads its 3 to 30 stem limits from SHRUB_STEMS instead of its own copy
119
+ - a test edit no longer reruns the skill-api, capabilities, barrels, export-manifest, games-ledger, part-stats and skill-routing generators or the doc-symbols gate, none of which read test files (a run-stages row says so with skipsTests)
120
+ - when one test fails, the test batches already running finish instead of being killed, so the next run reuses their passes
121
+ - a failed test batch still records every file in it whose own tests passed, read from its junit report, so the retry reruns only the failing file
122
+ - tarballInstall.test runs only when every package's dist is fresh; it used to pack a stale dist on every engine lane in a worktree that had built once, 35 to 230 s that proved nothing about the change (CI builds right before it, so it still runs there)
123
+ - a release builds jgengine.com and runs its asset check before cutting, and stops with nothing published if that fails; 0.52.0 went to npm while the site deploy failed its bundle check, leaving npm and jgengine.com on different versions
124
+ - the UI kit tests no longer fail when they share a CI shard with the pointer probe test: tests that stub document now put back exactly what was there instead of leaving a document key set to undefined, which made the probe keep its stub
125
+ - every game downloaded about 3.7 MB of shared engine code, so the site build failed its size budgets. Each game now downloads 2.3 to 2.8 MB, and the code shared by every game fell from about 3.7 MB to 1.75 MB.
126
+ - a game bundles only the 3D model packs it names, only its own UI kit, and procedural cities and grown plants only when its scene uses them.
127
+ - download size is checked before merge (bun run check site-bundles in CI's web-build job): the shared engine once, against apps/dev/bundle-budget.json, and each game's own part against bundleKb, with the reason in bundleBaseline. The release's site check now checks only assets.
128
+
129
+ ### Removed
130
+
131
+ - plant and tree tests that compared species to published forestry tables (Carmean height, FIA diameter, Tallo, Ek and Bechtold crown width, BAAD leaf per sapwood, Jenkins foliage mass, Reineke's thinning slope, USDA PLANTS heights, per-species fork and crown-shape bands); the species records from #2919 and #2921 are unchanged
132
+ - forestGrownCrownWidthM (@jgengine/core/plants/validation/crownAllometry), whose only user was a removed test
133
+ - `@jgengine/core/plants/validation/crownAllometry` no longer exports `forestGrownCrownWidthM`.
134
+ - `@jgengine/core/ui/kit/uiKits.view` no longer exports `resolveUiKit`.
135
+ - `@jgengine/react` no longer exports `resolveUiKit`.
136
+
137
+ ## 0.52.0
138
+
139
+ ### Migrate
140
+
141
+ - **Bump lockstep SDK packages to `^0.52.0`:** `@jgengine/{core,rapier,react,ws,node,sql,convex,shell,editor,assets,navbake}`. CLI `jgengine` is `0.49.0`; `@jgengine/github` is `0.39.0`.
142
+ - jgengine.json capabilities no longer has debt; CapabilityDebt is removed
143
+
144
+ ### Added
145
+
146
+ - scripts/skillDocs.test.ts keeps the two skill-sync assertions that catch SDK-user breakage: valid SKILL.md frontmatter named for its folder, and every @jgengine path a skill doc names exists
147
+ - lane:close runs once per worktree; a second run is refused with exit 4 and names the run that holds it, and a lock left by a crashed run is broken on its own
148
+ - trees are lit from the side as well as from above, through their own crown and, in a stand, their neighbours' crowns, so stand-grown trees prune up
149
+ - decurrent broadleaves divide into codominant stems as their leader weakens; excurrent conifers keep one leader and level branches
150
+ - each seed grows a distinct individual (apical control, branch angle, internode) within a fifth of its species' typical height
151
+ - autumn leaves turn their sunlit colour, or in shade a separate `autumnShade` colour
152
+ - the plant library demo takes ?age= to show every species at another age
153
+ - `SideLight` (`@jgengine/core/plants/growth/lightField`): Sky light arriving from the side.
154
+ - `SIDE_LIGHT_SHARE` (`@jgengine/core/plants/growth/plantEnvironment`): Share of an overcast sky's light that reaches a randomly oriented leaf from more than 45° off the zenith: with sky radiance ∝ 1 + 2 cos θ (Moon & Spencer 1942, the CIE standard overcast sky) it is (cos 45° + cos² 45°) / 2 ≈ 0.6.
155
+ - `PlantGrowthOptions` (`@jgengine/core/plants/growth/plantGrowth`): How {@link createPlantGrowth} grows a plant beyond its species, site and seed.
156
+ - `CrownForm` (`@jgengine/core/plants/species/plantSpecies`): Where a tree's crown carries its spread (Brown, McAlpine & Kormanik 1967): a decurrent tree loses its leader and divides into a few large limbs, an excurrent one keeps one stem to the top.
157
+ - `PLANT_SHOOT_LEAF_SPAN` (`@jgengine/core/plants/structure/plantStructure`): Share of a shoot, from its tip back, its leaves hang along; the rest is bare.
158
+ - `CODOMINANT_RATIO` (`@jgengine/core/plants/validation/crownArchitecture`): A limb this share of the diameter of the stem it leaves, or more, is a codominant stem (Gilman 2011). Also `CROWN_ARCHITECTURE_AGE`, `CROWN_ARCHITECTURE_MEASURES`, `CROWN_ARCHITECTURE_MISSES_ALLOWED`, `CROWN_ARCHITECTURE_SEEDS`, `CrownArchitecture`, `CrownArchitectureOptions`, `CrownArchitectureTarget`, `CrownShapeBands` and 5 more.
159
+ - withDerivedEditorLayers shows code-built markers, volumes and paths in the editor, tagged so saves leave them out; a save reports how many it left out
160
+ - `withDerivedEditorLayers` (`@jgengine/core/editor`): Adds code-built layers to an authored scene for display, tagged `meta.derived` so every save drops them again: the scene file keeps only what was authored. Also `DerivedEditorLayers`.
161
+ - `withDerivedEditorLayers` (`@jgengine/core/editor/document`): Adds code-built layers to an authored scene for display, tagged `meta.derived` so every save drops them again: the scene file keeps only what was authored. Also `DerivedEditorLayers`.
162
+ - bun run gen library-index writes each folder's index; the assets suite fails when an index misses a file or an entry's id is not its file name.
163
+ - `LIBRARY_LISTS` (`@jgengine/assets/catalogs/entryFiles`): Every shared library list kept as one file per entry. Also `LibraryList`.
164
+ - `FONT_LIBRARY` (`@jgengine/assets/catalogs/fonts`): The shipped font families, each a display or a body face.
165
+ - `LUT_GRADES` (`@jgengine/assets/catalogs/grades`): The shipped colour grades, each a recipe baked into a 32³ cube.
166
+ - `HDRI_LIBRARY` (`@jgengine/assets/catalogs/hdris`): The shipped HDRIs, each one Poly Haven asset under a plain id.
167
+ - `MATERIAL_LIBRARY` (`@jgengine/assets/catalogs/materials`): The shared library: ambientCG PBR materials plus the glass and water surfaces that need a shader rather than a scan.
168
+ - `AMBIENTCG_PINNED` (`@jgengine/assets/sources/ambientcg`): Exact upstream ambientCG materials the shared library pins, beyond the numbered family sweep. Also `AmbientcgPinnedMaterial`.
169
+ - a to-counters capture flow that holds aim and checks the crosshair closes, and frames an enemy's wind-up warning
170
+ - Scrap Signal's enemies wind up before they hit: a melee swing shows a red arc and lands only on a player still inside it, a gunner draws its aim line and fires where it locked, killing a fighter mid-swing calls the blow off, and a gunner the player rushes backs away
171
+ - pointInTelegraph is public, so a game can resolve its own dodgeable attack
172
+ - Scrap Signal's guns handle through the engine's weapon handling: right mouse aims down sights with a zoom and a tighter cone, crouching braces, moving widens the cone, held fire blooms it, the crosshair opens with it, and sprinting lowers the gun
173
+ - the camera's weapon hook receives the running game context, so a game reads its per-run weapon state there
174
+ - `pointInTelegraph` (`@jgengine/core/combat/telegraph`): Whether a world point stands inside a telegraph's shape, on the ground plane.
175
+ - Beacon Bastion pays a held wave: once the road is clear after a wave arrives, the garrison draws wages for every wave since the last pay, the purse earns 10% interest (up to 20), and walls that took no leak earn 10 more
176
+ - every life lost is a breach; with the road clear, R or the Mend sign beside the purse mends one for 20 gold
177
+ - a breached capture state, the first wave walked into an empty keep
178
+ - Brightway Park rides take one refit for 40% of their price: Efficient cuts upkeep 30% and wear 40% for half a point of appeal; Premium seats half as many again, adds 1.5 appeal and costs 50% more to run
179
+ - a ride can be closed to refurbish it: guests stay off, upkeep drops to a quarter, one run of wear comes off every 6 seconds, and the dashboard says refurbishing instead of ride down
180
+ - Drift Foundry tells a driver stopped at a barricade why it will not open: the missing plow blade or coil springs and how far back the drop lies, counting down while reversing onto it; that the crusher already has it; or, with springs on, to back up for a faster run-up
181
+ - a walled capture state (dev-only), the kart stopped at the first plow wall without its blade
182
+ - Asset sources can download Poly Pizza bundles and free itch.io uploads; Quaternius Toon Shooter, Modular Men and Women, Animated Animals and Dinosaurs and KayKit Forest join the catalog, each CC0, and the packs release mirrors them for cloud sessions.
183
+ - Scrap Signal's look pass: comic look at desert noon, Quaternius Toon Shooter crews, mechs and robot, desert props, cracked ground, sun-bleached grade and the broadcast kit in signal orange.
184
+ - Beacon Bastion's look pass: KayKit Adventurers raiders with weapons in hand, Medieval Hexagon towers and keep, KayKit Forest trees and rocks, golden highland light, warm filmic grade and the parchment kit in beacon ember.
185
+ - Quaternius humanoid bone mapping; Fernwild's survivors are Quaternius Modular Men and Women, and purlovia, allosaurus, baryonyx and diplodocus wear Quaternius models.
186
+
187
+ ### Changed
188
+
189
+ - bun run check: killed at the 600 s limit before (games-depth still running), 112 s and passing after. verify:fast --no-cache on a one-line Fernwild change: 332 s and failing before, 23 s and passing after
190
+ - 27 broadleaf and pine species keep their earlier growth numbers, which render fuller, rounder crowns on this model than a refit did (black ash no longer dies back, walnut and elm spread, ashes and silver maple are rounded instead of conical); the other species keep the refit, which looked as good or better
191
+ - tests loosened, because these records are picked for how the tree looks, not fitted to forestry tables: in `plantLibrary.test.ts` the 28 look-picked species (those 27 plus the sugar maple) get stand height within 25% (was 15%), DBH within 45% (was 25%) and 0.75x to 1.3x the Tallo crown band, and skip the crown-kind check (fork, centroid, leaf shell); in `crownAllometry.test.ts` the sugar maple's open width may reach 1.6x Ek 1974 (was 1.25x), its stand crown 1.1x Tallo and its stand crown ratio 0.75 (was 0.55); in `fuelSources.test.ts` its open-grown 20-year foliage may reach 3x Jenkins 2003 (was 1.4x), since a young open tree keeps leafy limbs to the ground. Every other species keeps the strict checks
192
+ - tried and dropped: two fork-logic fixes (codominant stems counted as laterals in the vigour split; a codominant chance 5x lower than documented) made no visible difference in renders
193
+ - Part of #2894
194
+ - lane-close, land, land-batch, land-queue, ci-status and its --sweep all go through scripts/github.ts, which runs every call as gh api REST, so they work the same on this PC and in cloud sessions. The land:queue label replaces auto-merge, and the GraphQL-to-REST fallback switch (scripts/gh-rest.ts) is deleted.
195
+ - release --wait merges its PR through the landing queue, since land now labels instead of arming auto-merge.
196
+ - mirror-assets reads, creates and uploads to the packs release with gh api and gh release upload. pr-video reads the repository id with gh api; its attachment upload has no gh command and no API, so it keeps the browser upload flow.
197
+ - Root cause of the stray nul: scripts/bg-tasks.test.ts ran `ping ... >nul` through bash on Linux, which writes a file named nul at the repository root, and lane:close stages new files
198
+ - Rebuilds the refit and refurbishment parts of the closed JGengine-games #40 on today's upgrade paths, world flows and ride sim
199
+ - Rebuilds the blocked-gate recovery part of the closed JGengine-games #44 on today's run session and route gates
200
+
201
+ ### Fixed
202
+
203
+ - background await that runs out of time says the task is still running and how to keep waiting (exit 6), instead of also claiming it never reported an exit code
204
+ - background tasks on Windows outlive whatever ends their caller's process tree, so lane:close's landing queue no longer dies at random with an empty log; commands with double quotes (bun -e "...") also reach cmd.exe intact
205
+ - CI test shard i runs its 186 files in four lanes; the physics reference sims (bonded rock 140 s, DEM 86 s) ran one after another in a single process for 410 s
206
+ - background await could report a failed task as exit 0 when it read the exit file before the code was written
207
+ - two captures or drives started together no longer fight over one browser debugger port: every launcher starts Chrome on port 0 and reads back the port it published, including the games capability probe
208
+ - the sugar maple grows a broad, divided, rounded crown with leaves to the ground instead of a narrow cone (hand-tuned for looks: weaker leader with age, longer shoots, stronger side growth)
209
+ - a shaded seedling starves slowly instead of dropping every leaf in one year
210
+ - the sugar maple individual-height check passes again instead of being marked a known gap
211
+ - the capture tool's temp cleanup deletes only browser profiles, never an agent's own jg- folder such as %TEMP%\jg-scratch of screenshots
212
+ - speed checks in unit tests measure every run but fail only in the perf job; 'fails at once' checks allow half their wait Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
213
+ - editor saves (Ctrl+S, save_scene, CLI --save) no longer write a game's code-built layers into editor.scene.json, so save, load, save is stable (#1538)
214
+ - Scrap Signal's scene file loses the 87 AI range volumes an earlier save baked into it; the game still builds them at load
215
+ - check path-portability, which every verify:fast and CI run, fails on a GitHub API URL, SDK or token read in tooling outside the product packages, and on a landing script that builds its own gh call.
216
+ - the entry-index helpers are internal tooling, and the gen-order test narrows instead of asserting
217
+ - the folder-home check skips one-file-per-entry data folders, whose folders group entries rather than features
218
+ - fonts, HDRIs, colour grades, materials and pinned ambientCG scans keep one file per entry, so two branches adding the same id conflict in git instead of both landing (#2881)
219
+ - every package and game test script preloads three too, so bun --cwd=<folder> run test anywhere gets the same fix as the CLI suite
220
+ - asset provisioning reads a game's editor scene like the site check does, so surfaces only the scene names (Brightway Park's and Ember Command's ground) are pulled before a site build
221
+ - package and game test scripts preload three like a root run does, so the CLI suite on Windows no longer fails with require() async module; two tests that load a lot cold get longer time limits
222
+ - release --wait reads main's CI run for the release commit, not beta's run of the same commit, and picks the newest run whatever order gh lists them
223
+ - the editor's Step button moves the game by exactly one simulation step; a render frame shorter than one fixed step used to spend the step and leave time where it was
224
+ - a vehicle clamp that pushes a car out of an overlap (a track wall, traffic, a game's own clampMove) moves it but no longer turns the push into speed, a reverse or crash damage (#1935)
225
+ - a game's clampMove combined with obstacles hands its recovery to the obstacle pass as position, so it no longer counts as a crash
226
+ - Scrap Signal's crosshair shows over the world with a dark edge; it sat under the HUD layer and its cream ticks vanished against the sand
227
+ - a Scrap Signal save that lost the player's chassis no longer boots into an empty world; the chassis is rebuilt at the nearest discovered station with its level, gear, cash and missions, the rebuild fee is charged once, and a notice says what was lost
228
+ - cone and line telegraphs draw facing the way their hit test faces; they were turned by the wrong angle and mirrored
229
+ - Scrap Signal's reload key cancels a reload in flight, and the trigger cuts a reload short while rounds are still loaded
230
+ - Scrap Signal's walk speed keeps the move-speed talent after a respawn or a Power Surge
231
+ - Post effects that read depth sample the scene pass's own target, so a frame never writes into the depth it reads and the 3D view no longer boots black (#2902).
232
+ - Terrain scans and streamed cell models load through the asset base, so a game served from its folder gets its ground textures instead of an HTML page.
233
+ - A hidden or attached node whose name a multi-primitive mesh's loader-named part also uses resolves to the authored node instead of failing as ambiguous.
234
+ - Fernwild's Quaternius survivors keep the engine's jump, swim, punch, swing and gather actions on top of their own idle, walk and run.
235
+ - Beacon Bastion's forest is tinted toward highland moss and sized like the old pines; the keep and towers stand tall enough to read from the defense camera.
236
+ - The KayKit Medieval Hexagon pack is listed in the asset library once, from its measured pack index.
237
+ - The curated HDRI count allows the two new skies (cap 16 to 18, as each earlier look pass raised it for its own skies).
238
+
239
+ ### Removed
240
+
241
+ - the games-depth check. It failed games on content minutes and pacing (Fernwild at 112 of 120 minutes), which is design taste, not broken code, and it blocked every games change. The from-zero flows stay as playable proofs.
242
+ - checks that judged taste, pacing, budgets or process instead of broken code: games-design, game-feel, art-direction, content-gate, concept-homes, stateful-ratchet, type-escapes, changelog, script-help, browser-test-budget, test-spawn-timeouts, fixture-location, no-blocking-wait, recursive-walk, capture-hygiene, scaffold-launch, games-framework, games-capabilities, module-globals, game-front-end, skills, stage-skills --check, the skill-api JSDoc and orphan ratchets, the load guard, the CPU and frame timing gates, and verify:fast's exit 2 for files no test reaches
243
+ - CI's perf-cpu, perf and smoke placeholder jobs; branch protection requires only ci
244
+ - the exemption markers (framework-ok, home-ok, walk-ok, wait-ok, fixture-location) and the capability debt entries that only those checks read, and every doc line telling agents to satisfy them
245
+ - the preload in the other package and game test scripts; only the CLI suite runs from its own folder in CI, and a change reaching the games is blocked by Fernwild's depth gate on beta
246
+ - consumeRuntimePlayStep, which encoded the same per-frame model and had no users.
247
+ - `@jgengine/core/editor` no longer exports `consumeRuntimePlayStep`.
248
+ - `@jgengine/core/editor/runtimeInspector` no longer exports `consumeRuntimePlayStep`.
249
+
250
+ ### Api
251
+
252
+ - `ItchDownload` (`@jgengine/assets`): A free itch.io download: the game page URL and the title of the upload to take. Also `PolyPizzaBundleDownload`.
253
+ - `ItchDownload` (`@jgengine/assets/manifest`): A free itch.io download: the game page URL and the title of the upload to take. Also `PolyPizzaBundleDownload`.
254
+ - `PolyPizzaModel` (`@jgengine/assets/polyPizzaArchive`): One model card on a Poly Pizza bundle page.
255
+ - `QUATERNIUS_HUMANOID_SCHEME` (`@jgengine/core/anim/skeletonStandard`): Quaternius humanoids (Ultimate Modular Men and Women, Toon Shooter): `Root > Body > Hips > Abdomen > Torso > Chest`, a shoulder per side the standard folds into `chest`, and `Wrist.L/.R` as the hand.
256
+
29
257
  ## 0.51.0
30
258
 
31
259
  ### Migrate
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jgengine/convex",
3
- "version": "0.51.0",
3
+ "version": "0.53.0",
4
4
  "description": "Convex adapters for JGengine: game transport, presence transport, and backend wiring over @jgengine/core.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -30,7 +30,7 @@
30
30
  "check-types": "tsgo --noEmit -p tsconfig.json"
31
31
  },
32
32
  "dependencies": {
33
- "@jgengine/core": "^0.51.0"
33
+ "@jgengine/core": "^0.53.0"
34
34
  },
35
35
  "peerDependencies": {
36
36
  "convex": "^1.31.2",
@@ -6,7 +6,7 @@
6
6
 
7
7
  - `CHANGELOG` (const): const CHANGELOG: Record<string, ChangelogEntry> — Per-version engine changelog keyed by semver string (e.g. `"0.10.0"`).
8
8
  - `ChangelogEntry` (interface): interface ChangelogEntry — One release's migrate steps plus added/changed/removed notes (typed mirror of CHANGELOG.md).
9
- - `VERSION` (const): const VERSION: "0.51.0" — Installed `@jgengine/core` semver - compare against {@link CHANGELOG} keys when migrating.
9
+ - `VERSION` (const): const VERSION: "0.53.0" — Installed `@jgengine/core` semver - compare against {@link CHANGELOG} keys when migrating.
10
10
 
11
11
  ## @jgengine/core/authoring
12
12
 
@@ -445,7 +445,7 @@
445
445
 
446
446
  - `CHANGELOG` (const): const CHANGELOG: Record<string, ChangelogEntry> — Per-version engine changelog keyed by semver string (e.g. `"0.10.0"`).
447
447
  - `ChangelogEntry` (interface): interface ChangelogEntry — One release's migrate steps plus added/changed/removed notes (typed mirror of CHANGELOG.md).
448
- - `VERSION` (const): const VERSION: "0.51.0" — Installed `@jgengine/core` semver - compare against {@link CHANGELOG} keys when migrating.
448
+ - `VERSION` (const): const VERSION: "0.53.0" — Installed `@jgengine/core` semver - compare against {@link CHANGELOG} keys when migrating.
449
449
 
450
450
  ## @jgengine/core/runtime/adapter
451
451