Symptom
For full-JSON-imported worlds, the Burgs layer renders nothing at world zooms. Digia (2,871 burgs) and Jolliariana (19,474) show zero burgs until zoom 6.
Root cause
Two conventions collide:
fmg-full-json ingest stores FMG's raw population points verbatim (Digia max 239, Jolliariana max 320; p90 = 1 and 6).
components/maps/questables-style-factory.ts BURG_ZOOM_RULES were calibrated for the legacy import's absolute populations (snoopia max 221,168; 45 burgs ≥ 10k): zoom 2–3 need ≥10,000, zoom 4 ≥1,000, zoom 5 ≥250 → FMG-point worlds render nothing until zoom 6 (threshold 0).
FMG's own convention: displayed population = points × settings.populationRate × settings.urbanization (both present in the Full JSON settings block).
Fix options
- (Preferred) Scale at ingest: store absolute people (
b.population * populationRate * urbanization, rounded) so all downstream consumers (zoom rules, settlemaker inputs, shops/encounters, LLM context) see one convention; backfill existing full-JSON worlds using their stored settings.
- Or keep points in DB and scale in the style factory — but that leaves every other population consumer reading points.
Audit note: anything already consuming Jolliariana burg populations (settlement generation, narrative context) has been seeing points since 2026-08-09.
Found browser-testing lazy-world-tiles 2026-08-10; pre-existing Plan B ingest behavior, unrelated to that branch.
Symptom
For full-JSON-imported worlds, the Burgs layer renders nothing at world zooms. Digia (2,871 burgs) and Jolliariana (19,474) show zero burgs until zoom 6.
Root cause
Two conventions collide:
fmg-full-jsoningest stores FMG's raw population points verbatim (Digia max 239, Jolliariana max 320; p90 = 1 and 6).components/maps/questables-style-factory.tsBURG_ZOOM_RULES were calibrated for the legacy import's absolute populations (snoopia max 221,168; 45 burgs ≥ 10k): zoom 2–3 need ≥10,000, zoom 4 ≥1,000, zoom 5 ≥250 → FMG-point worlds render nothing until zoom 6 (threshold 0).FMG's own convention: displayed population = points × settings.populationRate × settings.urbanization (both present in the Full JSON
settingsblock).Fix options
b.population * populationRate * urbanization, rounded) so all downstream consumers (zoom rules, settlemaker inputs, shops/encounters, LLM context) see one convention; backfill existing full-JSON worlds using their stored settings.Audit note: anything already consuming Jolliariana burg populations (settlement generation, narrative context) has been seeing points since 2026-08-09.
Found browser-testing lazy-world-tiles 2026-08-10; pre-existing Plan B ingest behavior, unrelated to that branch.