mapv10 Roadmap
Status: M0-M10 implemented; active follow-up is source-of-truth documentation reconciliation
Scope: map generator and viewer only
Primary target: continent-scale 3D fantasy map, proved from smaller slices through the first full-continent streaming artifact
mapv10 now has useful artifacts on disk and a plain Three.js viewer reading those artifacts. The early smaller-slice path remains important because it proved the pipeline, product contracts, renderer separation, and visual direction before M10 scaled the same contract to a full continent.
Current implementation status:
- Milestone 0: implemented.
- Milestone 1: implemented for a deterministic
province-slicerun. - Milestone 2: implemented with a plain Three.js viewer boot and browser nonblank verification.
- Milestone 3: implemented with generated water topology, masks, material products, and viewer water/material rendering.
- Milestone 4: implemented with realm/province/Location products, semantic ID rasters, borders, and typed picking.
- Milestone 5: implemented with route, crossing, map feature, footprint, and label products plus viewer routes/markers/labels.
- Milestone 6: implemented with raster/vector/semantic/mesh tile manifests, z0/z1 tile assets, tile previews, viewer tile selection, cancellable terrain tile loading, cache budget, and LOD switching.
- Milestone 7: implemented with terrain chunk meshes, water meshes, route ribbons, border-SDF raster rendering, mesh manifests, mesh validation, and separated renderer passes.
- Milestone 8: implemented with a validated
regional-sliceusing the same stage pipeline, product contracts, tile API, mesh API, and viewer loading path asprovince-slice. - Milestone 9: implemented as readiness evidence: explicit memory/cache/artifact budgets, coordinate precision report, many-tile streaming proof, and draft
continentpreset config. Full continent generation was intentionally deferred from M9 to M10. - Milestone 10: implemented as the first real full-continent generation/viewer proof with performance-grade streaming telemetry, LOD evidence, required-product hard-failure verification, MZ z6/z7 physical LOD + semantic display policy, and concrete remaining-work analysis.
Guiding Rules
- Generator and viewer are separate projects.
- Rust generator writes typed artifacts, previews, and validation.
- Plain TypeScript + Three.js renderer consumes artifacts.
- UI talks to renderer through typed commands/events.
- React/R3F must not own the map scene.
- Use the same pipeline for
province-slice,regional-slice,realm-slice, andcontinent. - Produce real products at every stage; do not hide important data inside memory-only structures.
- Pretty PNGs are previews, never map truth.
Milestone 0 - Skeleton And Contracts
Goal: establish the repo shape and executable boundaries.
Deliverables:
generator/Rust crate skeleton.viewer/TypeScript/Three.js skeleton.schema/folder for artifact schemas/manifests.- typed renderer API draft.
- typed event model draft.
- initial roadmap, architecture, and viewer UX docs.
Exit criteria:
- folder structure matches
architecture.md. - no generator/viewer code depends on downstream application simulation.
- no React renderer architecture is introduced.
Milestone 1 - Minimal Artifact Run
Goal: produce a tiny deterministic province-slice artifact run.
Scale:
province-slice- 2,000-10,000 km²
- 5-10 Locations
Generator stages:
00-config01-continent02-geography-graph03-heightfield14-previews
Required products:
manifest.jsonconfig.jsonstage-index.jsoncontinentPolygons.jsoncoastlines.jsonseaRegions.jsonridgeGraph.jsonbasins.jsonheight.f32.binslope.f32.binnormal.rg16.bin- preview PNGs
Exit criteria:
- same seed/config produces identical core product bytes.
- previews render from generated data.
- validation catches malformed polygons and invalid raster dimensions.
Milestone 2 - Plain Three.js Viewer Boot
Goal: load the Milestone 1 artifact run and display a clean 3D terrain scene.
Viewer systems:
- manifest loader
- binary raster loader
- Three.js renderer core
- camera controls
- resize handling
- basic layer toggles
- debug product drawer
Renderer requirements:
- no React scene ownership
- no R3F
- renderer API exists as a framework-neutral TypeScript module
- canvas renders nonblank
- terrain uses generated height data
Exit criteria:
- viewer loads the canonical generated fixture (
public/continent-lod6, served as/mapv10/runs/continent-lod6/manifest.jsonfor the current browser proof). - terrain is visible.
- height/slope/normal previews are inspectable.
- Playwright screenshot verifies nonblank desktop and wide viewports.
Milestone 3 - Water And Materials
Goal: make the map read as a real landscape, not a bare heightfield.
Generator stages:
04-water05-biomes-materials
Required products:
riverGraph.jsonriverCenterlines.jsonlakePolygons.jsonseaRegions.jsonconsumed by the mesh stage as generated open-sea surface truthwaterMask.u8.binriverWidth.f32.binbiome.u8.binmaterialWeights.rgba8.binforestMask.u8.binwetlandMask.u8.bin- previews
Viewer systems:
- water mesh rendering
- terrain material/splat rendering
- geography map mode
Exit criteria:
- rivers/lakes derive from generated topology.
- lakes are rendered from polygons/meshes, not bbox quads.
- open sea is rendered from generated sea-region mesh products, not a viewer-created plane.
- terrain materials are driven by generated material products.
Milestone 4 - Provinces, Locations, Picking
Goal: prove the strategic map layer.
Generator stages:
06-political- basic semantic ID rasters
Required products:
realmPolygons.jsonprovincePolygons.jsonlocationPolygons.jsonprovinceId.u32.binlocationId.u32.binneighborGraph.jsonpolitical-preview.png
Viewer systems:
- border rendering
- hover/selection
- typed pick results
- political map mode
Exit criteria:
- one province contains 5-10 Locations.
- picking returns typed entity refs.
- borders render over 3D terrain.
- ID rasters are used for picking/debug, not preview PNG colors.
Milestone 5 - Routes, Features, Labels
Goal: make the map readable as a strategy map.
Generator stages:
07-routes08-map-features
Required products:
locationConnections.jsonroadNetwork.jsonrouteGraph.jsonrouteCenterlines.jsoncrossingAnchors.jsonmapFeatureAnchors.jsonmapFeatureFootprints.jsonlabelAnchors.json
Viewer systems:
- route ribbons
- sparse point markers
- label projection
- label collision/fade
Exit criteria:
- labels are generated anchors, not baked images.
- route and feature markers can be toggled.
- labels change by zoom band.
Milestone 6 - Tile Pyramid And LOD
Goal: make the architecture scale beyond the prototype slice.
Status: implemented for province-slice.
Generator stage:
11-tile-pyramid
Required products:
- raster tile manifests
- vector tile manifests
- semantic tile manifests
- mesh tile manifests
- tile previews
Viewer systems:
- camera-bound tile selection
- cancellable tile loading
- explicit tile cache
- LOD switching
Exit criteria:
province-sliceandregional-sliceuse the same tile API.- viewer does not load all high-detail products by default.
- missing required tiles fail visibly.
Milestone 7 - Mesh Products And Render Passes
Goal: move from prototype geometry to explicit render products.
Status: implemented for province-slice.
Generator stage:
12-meshes
Required products:
- terrain chunk meshes
- water meshes
- border-SDF raster products
- route ribbons
- mesh manifests
Viewer systems:
- terrain pass
- water pass
- route pass plus border-SDF terrain-shader branch
- overlay pass
- marker pass
- label pass
- picking/debug pass
Exit criteria:
- render systems are separate.
- meshes have finite, non-degenerate geometry.
- non-rectangular shapes use real generated geometry.
Milestone 8 - Regional Slice
Goal: prove the target strategic scale.
Status: implemented.
Scale:
regional-slice- 45,000 km²
- roughly 90-180 Locations
Exit criteria:
- same pipeline as
province-slice: implemented. - same viewer path: originally proven on a local regional fixture, now superseded by the canonical
viewer/public/continent-lod6browser proof. - zoom bands work from region to Location detail: browser verifier loads z0 overview and z1 detail tiles.
- generated products stay inspectable: implemented through manifests, previews, tile products, mesh products, and validation reports.
Milestone 9 - Continent Readiness
Goal: prepare for continent-scale generation.
Status: implemented as readiness artifacts; full continent generation is not part of this milestone.
Deliverables:
- memory budget documented.
- tile cache budget documented.
- artifact size budget documented.
- coordinate precision verified.
- streaming validated with many tiles.
- continent preset config drafted.
Exit criteria:
- no architecture changes required to move from
regional-slicetocontinent: readiness report and draft preset show the same config/product contract. - at the end of M9, only generator content/scale settings remained; M10 has since generated and verified the full continent run.
Milestone 10 - Full Continent Streaming And LOD Proof
Goal: turn the draft continent preset into the first real full-continent artifact run and prove that the viewer can stream it with useful LOD.
Status: implemented by the canonical viewer/public/continent-lod6 fixture and viewer/verification/m10-lod6-continuity-proof.json.
Scale:
continent- millions of km²
- thousands of strategic Locations
- many-tile artifact set loaded by viewport and zoom, not eagerly
Deliverables:
- validated full-continent generator run: implemented.
- continent artifact-size, count, tile, mesh, and coordinate-precision reports: implemented under
readiness/andstages/13-readiness/. - viewer proof that boot loads only overview/core products plus visible tiles: implemented by the browser probe network and debug-state telemetry.
- request cancellation, max in-flight request limit, cache bytes, and eviction counters: implemented in terrain/runtime/auxiliary mesh caches and exposed through debug telemetry.
- scripted browser performance probe across continent overview, province/realm zoom, Location detail, detail tile boundary pan, and zoom-back: implemented.
- LOD proof for terrain, water, borders, routes, labels, and markers: implemented through named visible tile bands and auxiliary mesh tile membership; visual quality remains subject to verifier-lane review.
- required-product hard-failure proof: implemented in
viewer/scripts/verify-browser.mjsand recorded by the focused M10 verifier artifact.
Exit criteria:
- full
continentrun uses the same product pipeline as smaller presets. - streaming is proven by counters and cache budgets, not by visual impression.
- LOD levels are proven by zoom-band/selection evidence, runtime counters, and screenshots.
- missing required products fail visibly and hard; the viewer must not silently fall back to
sample-runor fabricated products. - no downstream game/application logic is introduced.
Current Follow-Up Recommendation
M10 is structurally implemented and the LOD/Data Coherence Foundation chain (Waves 1-4.5) has now shipped on top of it. MZ extends that foundation with an eight-rung physical LOD ladder (z0..z7), repairs z1 so it is no longer a same-sample physical refinement, adds generated closeDetailNormal truth with close-detail scale metadata, and separates strategic semantic zoom into the generated semanticDisplayPolicy product. The R-25 route-adaptive-batching baseline (23 scenarios, 0 hard failures, 0 warnings) is historical: the gate vocabulary has since grown (Wave 1 added forbidZ0UnderlayAtPrimaryZ, ancestorZDistanceMax, sidecarReadyForActiveMeshes, noPlaceholderTextureBound, coverageHoleMax, labelTextUniqueness, labelTextMinDistinctCount, labelMaxDuplicatesForText; MZ added semanticPolicyLoaded, semanticBandEquals, primaryZAtLeast, closeDetailScaleMin, and influenceProductRequiredBeforeRendering) and the current scenario evidence covers all 32 defined scenarios. Current evidence in viewer/verification/scenarios/latest/scenario-results.json records scenarioCount: 32, stores 32 result entries, and reports 0 hard budget/fail-condition issues; the two warn-only budget entries are fallbackSlotCountMax=48 > 32 in mapv10_zoom_continent_to_location_clean_lowland and mapv10_zoom_realm_to_location_overlays_z5. PROC reclassifies remote/network-throttled stress metrics as non-blocking evidence for a local-only product; clean/local omitted-slot regressions still belong in blocking gates. The local browser screenshot baselines under viewer/baselines/browser/continent-lod6/ were captured 2026-05-07 against the pre-Wave-2 fixture and need a user-accepted recapture/update only after foundation behaviour is accepted; never update them to mask a regression. docs/wave-3b-lod-ladder-camera-decision.md records the accepted and implemented z6/z7 physical LOD decision.
The recent foundation passes:
- Moves byte-length checks, typed-array decode, mesh world-coordinate transform, per-vertex normal computation, and vector-tile JSON parse off the main thread into a fixed pool of decoder workers (transferable typed-array results, zero-copy on most browsers).
- Restores incremental batched merge for water/route meshes per material kind, with a per-batch dirty signature and a
FrameBudgetthat amortizes rebuild over frames so transitions never produce a synchronous burst; borders render from the generated border-SDF raster in the terrain shader. - Memoizes label canvas/texture pairs by text and caches footprint materials by kind, eliminating per-label canvas allocation churn and per-footprint material allocation.
- Keeps generator/viewer separation, the 24-tile request scheduler, the typed renderer events, and zero-fallback hard failure on missing required products.
- Established the scenario CLI, browser screenshot baseline commands, generated-artifact middleware boundary, and run-local Valenar export validation while keeping Valenar's runtime default on its small dummy fixture.
Remaining lane work after docs reconciliation:
- Wire scenario/browser verification into CI after the fixture/bootstrap and baseline-distribution policy is settled.
- Keep generated Valenar WorldData as a run-local product lane until an explicit import/package step selects it; do not switch Valenar's runtime default away from the dummy fixture in a docs reconciliation wave.
- Add targeted direct polish scenarios for borders and labels before changing their visual thresholds.
- Continue to treat full state-field producer transport, Stage 6 Voronoi optimization, and binary artifact fingerprinting as deferred unless explicitly scoped.