World lettering places readable signs inside the scene. The editor's Signs & lettering panel supports two short lines, a world-space center, sign height, color, Classic/Simple type, an optional dark signboard, reading distance, and either fixed direction or a camera-facing label. Preview is reversible; Save retains the source and Apply publishes it through the shared development-room barrier.
Travelers can also pause and choose Read the signs to read the current place's wording in semantic HTML. Both the atlas painter and this reading view treat authored strings literally. Creator markup, font URLs, scripts, and CSS are not accepted.
#Data and resource bounds
World format 15 adds optional Place.lettering, with compiler identity lettering-world.15. The set-world-text command replaces a place's list; null removes the optional field. Saved undo can restore the exact previous source format. Older world formats reject lettering rather than ignoring it. Presentation envelope 9 carries the field; both editor and player projections use the same validated data.
A place supports 32 signs, each with 128 Unicode code points, at most 256 UTF-16 code units, and at most two lines. Bounds also cover positions, height, color, facing, yaw and distance. Signs do not create canonical entities, colliders or gameplay state. Their settings belong to world content identity; no per-frame text data is replicated.
The renderer reserves fixed 512×128 atlas cells. One sign uses 256 KiB; the largest atlas is 2048×1024 / 8 MiB. Active and staged replacements can coexist, so the atlas replacement peak is 16 MiB, plus two bounded instance buffers. An empty place owns no lettering texture or buffer. Font painting occurs in a fixed-origin scratch cell, and exact pixels are copied into each atlas slot. This prevents a label's raster appearance from depending on where its cell happens to be packed. Native font choices use browser/system fallback; fonts are not downloaded or accepted from creators.
Letters use an sRGB atlas sampled into the linear HDR scene. Fixed signs show their front face; billboards face each camera. Draws test the existing scene depth, do not write depth or cast shadows, and use premultiplied alpha. Centers are sorted far-to-near with stable ties. Distance fades reduce abrupt disappearance at the configured reading limit. The distance-filtered draw count includes signs subsequently clipped or occluded by the GPU; it is not an occlusion statistic.
A normal presentation update retains only the latest pending source. The next idle frame replaces its atlas. Shared revision preparation builds its candidate atlas before committing the scene and retains the accepted atlas on cancellation or preparation failure. Model and lettering upload share the existing 20-second replacement deadline. Cancellation releases the staged atlas immediately; an operation identity prevents delayed cleanup from clearing a newer revision’s rendering barrier. Device recovery repaints from retained validated source. Diagnostic exports expose textLabels, textDraws and textAtlasBytes; the observatory shows their counts and atlas size.
#Verification
Run npm run check and npm test for source contracts, presentation versioning, checkpoint invariance, atlas bounds and durable undo. npm run test:browser:world-text uses the isolated editor fixture to exercise preview, save/reload, exact undo/redo, literal text, shared publication and actual device recovery. tests/browser/development-recovery.spec.ts additionally retains the old-checkpoint and cancelled-revision recovery journeys.
The native renderer probe (tests/browser/probe.spec.ts, “owned renderer works”) tests actual pixels and GPU ownership: wall occlusion, fixed-sign back faces, camera-facing text, reading-distance culling, center sorting, maximum atlas size, rejected/cancelled candidates, cancellation while upload completion is held, a newer revision arriving before that old completion, raster failure, repeated replacement, device destruction and final disposal. The native tolerance for source-order permutation is one color-channel unit; it is not a cross-platform font comparison.
#Scope
This is the first bounded world-text path, using short planar signs. Center sorting does not solve intersecting translucent surfaces. Font fallback, long-line readability, physical device performance, signed-distance-field text, arbitrary typography, bone-attached labels, and general transparent materials remain separate work. The reading view lists the place's signs, including signs that may currently be behind scenery. It does not claim scene visibility.
The WGSL texture and shader contract is described by the W3C specification. Acceptance is based on this repository's native renderer and authoring tests, not on an assumed cross-vendor pixel identity.