engine v5.2.19
Engine v5.2.19
August 6, 2026
A patch in the Lume line.
what's new
- Small windows render sharp: shrinking the game window no longer melts distant detail into mush — thin lines, far-off structures, and in-world text stay readable at small window sizes, because the engine now refuses to drop its internal rendering resolution below a legibility floor on ordinary screens.
- Places stop coming back empty: after a server crash or reconnect, a place players were standing in could lose all its objects until the room recycled — the world's cleanup sweep now notices an occupied place with no live copy and brings its objects back within moments.
- Fixed an issue where Savi wasn't able to manage your game's database properly — database setup and reads/writes she does on your behalf now land reliably in multiplayer rooms.
- Fixed an issue where crons weren't running properly — scheduled game work (timed events, recurring jobs) now fires the way your scripts scheduled it.
- Savi finishes her own checklist: when Savi completes something from your world notes (tab+f), she checks it off herself instead of leaving every done item hanging as "attempted" for you to sweep up — taste calls and anything you sent back for a redo still wait for your verdict.
›technical notes
- Engine test/verify infrastructure riding this version, no shipped-bundle behavior change: probe harness repaired for the relay era (four breaks fixed, relay-ground seams added, dead frozen-world parity rows re-pinned — #12249) · verify-fpv-transparent device-in-the-loop A/B pin at the transparent×camera-attach seam (#12255 — ledger-2055's deterministic code-path-skip theory rejected on device evidence; the harness caught the field-signature transparent-lane dropout in miniature and soaks for it with --runs N) · sql-api relay-digest race flake killed at the await (#12223) · mint tooling refuses the repo-root .changesets/ trap where records silently never minted (#12229).
- lume: absolute internal-resolution floor in the quality governor (#12252): the ladder cuts renderScale as a FRACTION of the canvas, but thin-content legibility runs on absolute pixels — ×0.55 of a 1707×916 window is a 939×504 scene pass (far wires gone, world text mush) while the same fraction at 4K is fine. Effective scale = max(ladder scale, 1440 / canvasWidth) clamped ≤1, folded at the one seam where the fraction becomes a buffer size (renderer.ts frame args), so rung cuts, the judder hold, persisted landings and ?rungPin are floored by construction and live resizes track frame-by-frame. DPR > 1.5 passes through untouched (the deliberate density law). New wires-road render-harness fixture pins the class at the repro window (unfloored deepest rung fails 3/3 far-content probes; floored reads all 3).
- Res-floor follow-up (#12262, review findings fixed forward):
?sceneScalepins are held as hrefScenePin and bypass the floor at the consumption seam (the rig's A/B pins again); F2 names the floor as the true asker when it clamps to ×1 ('internal-width floor 1440px — ladder asked ×0.55') instead of reading 'session opening'; the seam doc's shared-clamp claim trued in both homes (shared THRESHOLD, not shared input — the divergence is deliberate). - The '[Tome] Juice call has no audience target' teach-rail line no longer floods the prod error lane (#12230, ledger 2045; 61 lines/78min from one app): it now rides the standard 30s content-key window (claimRepeatingReportKey — one claim gates the getLogs half, the ledger-1671 diagnostic forward, and the DD line) at WARN (a teach is not an engine error), carrying an unthrottled running classTotal so consecutive lines still answer rate questions. run_script overlays take only the runtime-log half (one returned teach per exec, no DD line, no stats write through the transaction merge). Sibling teach lanes untouched. Red-first: a 20-call storm mints ONE warn line; past the window the next carries classTotal=21.
- placeCleanupSystem keeps the occupied⇒resident invariant in BOTH directions (#12228, ledger 2044, dig de367ce4): a session avatar standing in a place with no residency entry was a permanent hole — the sweep only REFRESHED existing entries, applySpec skips non-resident places, and no writer ever re-created the entry, so the place's objects existed in the spec doc and nowhere else (Fire Nuke Island after a crash-reboot: 44 spec rows, 0 live). The sweep now creates the missing entry from the SessionOwner⋈PlaceMembership occupancy index it already maintains, gated on the place existing (authored or live instance row), loud on the recovery. Red-first pins in
reconnect-place-residency.test.ts, including current join semantics (spawnPlayer re-seats at the default place) as an explicit receipt. - Worker-layer completion of the relay game-database lane, recorded here at tucker's direction (creators experience these as engine behavior; the fixes ride worker deploys, not this kernel tarball): #11685's player SQL lane got its config half everywhere (#12220 — STORAGE_DO bound on staging+prod relays, prod room-mode + sql-manifest rows), cf-edge stopped knocking fresh games off the relay (#12250 — ABSENT engineSemver means UNPINNED, not unprovable; the P0 floor fix), and the prod relay now deploys on the same train as the edge that routes to it (#12236 — the 5.2.18-promote incident where sql-using rooms landed on a relay with no storage doors can no longer recur by omission). Scheduled work (crons) on relay-hosted rooms rides the same lane.
- api.sql array-misread guard (#12224, incident dde237bc 'Be Somebody'): every tagged-template SQL library resolves an ARRAY, so sessions read
.length/r[0]straight offSqlQueryResultand the misread was perfectly silent — that incident's session concluded "api.sql is a silent no-op" and rebuilt persistence AROUND a working database.mintSqlQueryResultnow defines a non-enumerable.lengthgetter that throws the shape teach at the exact property that carried the misread; all data paths untouched (own non-enumerable props ride none of them). Iteration needs no guard (for…of on a plain object already throws loud) and a Symbol.iterator trap is deliberately absent (it would break honest feature probes). Plus the 501→unconfigured remint pin on the relay lane (game-db-relay test). - World notes: Savi checks off her own finished work (#12231 — contract 8's missing half; jacob's ruling 2026-08-03: "she can do that — this is her todolist"). The studio-chat mutate route's lane guard refused every Savi-sent 'done' (all 50 closed rows on the reporting app were creator- or wisp-closed; Savi's finish could only park a row at 'attempted'), which also made a wisp she dispatched more able to close rows than Savi herself. Now: kiln's markSaviTodoDoneBySavi moves → done from any open state (note required, recorded as a completed attempt — honest trail for reopen; CAS pins read status + owner_wisp_id IS NULL so wisp-parked rows refuse), the mutate route dispatches status 'done', and the world-notes skill teaches the done/attempted split ('done' for plain finish lines she saw land, 'attempted' for taste calls and any redo of a row the creator bounced — their eyes close disputed rows). Creator reopen/bounce stays the override; no creator-surface UI change (savi-closed rows ride the exact read path wisp/creator closes already ride). Rides the skills manifest + studio-chat/kiln deploys.