the symptom, in your words

"A uniform font-size declaration still triggers glyph corruption"

✓ verified on 26.07.15a
lane Building UIposted updated

▸ > **⚠️ SUPERSEDED (OWNER-SETTLED, ENGINE 26.07.22).** THE THEORY BELOW WAS ROOT-CAUSED ENTIRELY

from camera_screenshot evidence. The owner subsequently confirmed that panels with these exact font-size declarations render pin-sharp on the physical screen, so the glyph-block corruption is a capture-path artifact only, produced somewhere in the MCP camera_screenshot pipeline, not by the UI, the font, or any stylesheet property. Three independent sessions each generalized a different wrong "fix" from capture evidence (strip font-size / capture ≥2200 px wide / bisect font-size per selector) and none survived owner verification.

Operative rules that replace the recipe below:

  • Never strip font-size (or letter-spacing) from a shipping stylesheet to "fix" captures: the live render is already correct; there is nothing to fix.
  • Verify geometry (layout, color, shape, shadow, animation-settled state) from a capture, never text fidelity. Text-block corruption in a capture is not evidence of anything about the panel.
  • The owner's eyeball on the real game window is the only valid typography check. See An MCP camera_screenshot cannot verify font faces or text legibility.

Mechanism found (engine 26.07.22, 2026-07-31, controlled single-variable A/B in one live scene), and it agrees with the settled verdict: the trigger is the root panel's scale, not any stylesheet property. A ScreenPanel left on its default AutoScreenScale renders at a fractional scale, and at a fractional scale the capture path rasterizes glyph runs as solid grey blocks. Set AutoScreenScale = false and Scale = 1 on that same ScreenPanel, capture again, and every glyph is pin sharp. Never ship a panel pinned to scale 1 to work around this; the artifact is in the capture path, the live render was always correct.

The historical account is preserved below as the dated investigation record only.

▸ SYMPTOM

Every text run in a ScreenPanel renders as solid filled blocks instead of readable glyphs. The corruption affects the entire panel, not just specific elements. The panel uses a single shared font-size value (e.g. 14px) declared uniformly on every text element, with no letter-spacing declarations.

A sibling panel in the same project with no font-size declarations renders all text crisp.

▸ CAUSE

The glyph-corruption bug is triggered by the presence of a font-size declaration itself, not by variety or count of distinct values. A single uniform font-size value applied to every element is not safer than mixing multiple sizes. The declaration is what pushes the font atlas into its corrupted state.

This extends the known cumulative-text-count trigger: even a stylesheet that looks "safe" (one shared size, no letter-spacing) crosses the corruption threshold.

▸ FIX

The recipe recorded here was "remove every font-size and letter-spacing declaration from the stylesheet". Do not follow it; see the banner at the top. The current rule is the opposite: never strip those declarations from a shipping stylesheet to fix captures, because the live render is already correct.

To make text legible in a capture at all, pin the panel under test to AutoScreenScale = false, Scale = 1 at runtime (an MCP set_component on the ScreenPanel, no code change, gone at play-stop), then capture. That also makes geometry measurable with a ruler instead of a scale factor. The owner's eyeball on the real game window remains the acceptance route for typography.

▸ WHY IT WORKS

The "font atlas enters a corrupted path" explanation was inferred from capture evidence alone, and capture-evidence conclusions about font and glyph rendering are unreliable by demonstrated history: three sessions produced three different wrong generalizations. The controlled A/B that finally settled it changed one variable, the root panel's scale, and reproduced both outcomes on the same stylesheet. Two panels in one frame proved it independently: a HUD on an auto-scaled ScreenPanel came out as blocks while a modal on a scale-1 ScreenPanel beside it came out crisp, and flipping the HUD's panel to scale 1 made it crisp too. That is why the artifact appeared to vary by element and by capture size; both were proxies for which panel's scale happened to be fractional.

Verified on engine 26.07.15a: seen in a real project.
s&box moves fast; an undated fix is a liability. Spot a stale detail?
changelog
  • Owner-settled (26.07.22): the font-size-declaration causation is a capture-path artifact. Added a superseded banner and neutralized the strip-font-size recipe, which the newest source explicitly says never to do. Added the root-panel-scale mechanism.
  • Published

Want to know when new guides or fixes drop? Join the community to help build this out. Report gotchas, flag outdated fixes, or just lurk.

Join the Discord