engine v5.2.21
Engine v5.2.21
August 7, 2026
A patch in the Lume line.
what's new
- When a database operation takes a moment longer than a script run allows, Savi now gets a plain explanation — the database is answering, nothing hung, just re-run — instead of a scary "hung await" error that used to send her hunting for a bug that wasn't there.
- Physics (mantle worlds): characters and objects no longer catch on invisible snags while moving across smooth terrain and mesh seams, and worlds full of settled objects now truly go to sleep — an idle pile costs almost nothing, so big physics scenes stay fast.
- Fixed a case where "I've reported this to the team" was wrong: in some multiplayer rooms, engine bug reports Savi filed looked sent but quietly went nowhere. Now she's told straight away when a report can't leave that room, so she can tell you the truth — and reports that CAN be sent still go through exactly as before.
›technical notes
- Exec budget abort with api.sql in flight names the fact — never "a hung await" (#12441, ledger 2092 fork B). sql-api.ts grows a register→settle in-flight lifetime (separate from the drain's take-and-clear pending set, whose taken-but-unsettled entries are exactly the invisible case);
buildAsyncSettleAbortErrorprobeslistInFlightExecSqlWorkat mint and, when non-empty, mints the honest verdict: call named, lane's bounded window stated (relay reply deadline 30s, direct door fetch 10s), rollback fact stands, action = re-run once settled. The 5000ms budget itself is untouched; the fire-and-forget drain abort already named its sql fact and is untouched. Origin: dump 339d9450 — published call shapes blew the budget by ~5ms, then settled after rollback, and the "hung await" text got the planned event filed as an engine hang. - mantle: box3d-guided fixes + frontier optimizations (#12311). Trimesh weld probes neighbor cells (box3d b3SpatialHash shape, 8-cell probe at cellSize = 2×tolerance) — seam vertices 2e-8 apart no longer cook to distinct representatives that read coplanar seams as boundary edges; 200k-tri mesh cook 946→475ms vs the 27-probe draft. Near-parallel edge-axis rejection at box3d's relative tolerance; face manifolds never stripped by edge axes in box-tri. Broadphase goes O(degree) per moved body. Sleeping worlds cost nothing (island-granular sleep; per-axis sleep extents). New pinned suites: wake-seam purity, sticky-zero scratch, tick-pair set, plane-lock extent, near-parallel edge rejection. Full box3d HEAD re-comparison recorded in docs/physics-native/box3d-harvest-notes.md (zero solver-constant drift; ζ=5 warm-start re-run rejected on new grounds; solver-sets rejection superseded by the derived-frontier design). frozen-receipts.ts retired.
- reportEngineBug: ok:true must imply a lane (#12436, ledger 2089 — intake-death mechanism #2).
resolveEngineBugDispatchLaneresolves rail | sp-forward | none BEFORE the verb returns; sp-forward requires client + singleplayer + POSITIVELY-sniffed kernel wire + live connection (isGameDbForwardEligible's gate shape — an undetermined pre-sniff wire refuses rather than gambling, since a fire-and-forget command has no typed reject at the relay egress). Exec snapshots can't see lane facts (all live-channel), so the exec host stamps the live verdict into the snapshot-riding config mirror at snapshot cut (the lastReportAtMs pattern). Lane "none" returns the throttle-style structured failure Savi already relays; nothing minted, no floor consumed.dispatchEngineBugReportnow returns whether the report left, and the belt-and-suspenders no-lane warn carries networkingMode + wire. Test table covers every session shape: each row either lands the incident in a store or returns the honest refusal — zero silent-drop paths. Completes postmortem 2026-08-07-relay-sp-dead-db-lane §4.1; the kiln RPC lane for relay filings stays §6.2's owned follow-up.