← Voxel World Model

Benchmarks

Measured benchmarks for appearance compiler milestones, scan/depth fusion, training cost, and runtime proofs.

Real capture (phone / webcam) Sensor (controlled ground truth) v2.2 (production default) v2.3 continue (not promoted) green = better red = worse
366/366 tests · kernel v1.0

V30, Kernel Finalization & Long-Term Stability

Final kernel milestone. Canonical worlds proven stable across replay, snapshot/restore, and replication — identical authoritative checksums.

Tests366/366
Kernelv1.0
Canonical worlds5/5 ALL OK
Replication health1.0
InvariantsPASS
Sig defaultHMAC
Kernel v1.0 panel with canonical regression ALL OK.
Live panel. TinyRoom · Hallway · Apartment · Office · Campus — replay ✓ snapshot ✓ replication ✓.
Definition-of-success proofs
ClaimVerified
Kernel v1.0 declaredkernel_version: 1.0 on /api/kernel/health
Observation-driven identityraw observations only; confidence recomputed; no object state on wire
Ed25519 public-keysign/verify; tampered/wrong-key rejected; HMAC remains fast default
Canonical regression5 worlds · replay + snapshot + replication checksum-identical
Governance / API contractGOVERNANCE.md · ADR-0001…0005 · KERNEL_API.md · KERNEL_V1.0.md
Last kernel milestonepost-v1.0 tracks version independently (no V31/V32)
Honest limits: pure-Python Ed25519 is slow (HMAC default); anti-entropy is throttled tick; policy migrations registered by apps; regression golden masters are geometry-authoritative.

Read full V30 narrative →

355/355 tests · ops not conclusions

V29, Distributed Kernel Hardening & Trust

Replicas exchange authoritative operations; derived confidence/hypotheses/facts are recomputed locally. Trust, signatures, provenance, and versioned policies are kernel-enforced.

Tests355/355
Ops applied (live)3
Recomputes1
Viewer denied5
Forged packageREJECTED
demo_trustconverged
Distributed Trust (V29) panel with CONVERGED via operations and forged REJECTED.
Live panel. CONVERGED via operations · recomputes · viewer denied · forged REJECTED.
Definition-of-success proofs
ClaimVerified
Operations, not conclusionsevidence/facts replicated; confidence recomputed locally
Trust enforcementviewer denied semantic ops; only admin may verify
Byzantine safetyforged/tampered packages rejected before mutation
Policy incompatibilitydiffering confidence policy reported, not merged
Compaction / partial / anti-entropyreplay preserved · region sync · detect+repair
Provenance invariantevidence retains origin after sync
Honest limits: HMAC (not ed25519 yet); policy migration detect-only; anti-entropy on-demand; identity ops by uuid+recompute (semantic+reasoning fully op-streamed).

Read full V29 narrative →

341/341 tests · distributed world

V28, Distributed World Replication & Synchronization

Many replicas, one logical world — converge through validated transactions, vector clocks, explicit conflicts, and abstract transport.

Tests341/341
E2E scenarios8/8
Live demo_syncconverged
EntitiesSink · Sofa
Transportsmem + file
Invariants after syncpreserved
Distributed World (V28) panel with CONVERGED sync and matching checksums.
Live panel. a→b / b→a 1 tx · CONVERGED · matching checksums · Sink · Sofa.
Definition-of-success proofs
ClaimVerified
Sync via validated transactions onlypeer changes → local world.transaction(source="sync"); no memory copy
Vector-clock causalitybefore/after/concurrent/equal; conflict only if concurrent + overlapping state
Explicit conflictsgeometry (manual) · semantic (preserve-alternatives) · schema (reject)
Offline / multi-replicaoffline robot · 3-replica multi-robot · file transfer · checkpoint recovery
V26 invariants after synctest_replication_never_violates_invariants
Honest live demofresh transactional replicas (hallway snapshot is not in the replication log)
Honest limits: mem+file transports only; state merge by uuid (not per-tx semantic deltas); discovery is abstract; HTTP/WebSocket not built.

Read full V28 narrative →

329/329 tests · world as service

V27, World Services & Query Engine

Applications use world.query only — spatial, temporal, semantic, identity, reasoning, and graph families, plus cross-layer explain.

Tests329/329
Query families6
Explain (live)~0.2 ms
Graph19n / 25e
Index entities4
Layers in explainall
World Query (V27) panel with cross-layer explanation.
Live panel. chairs → Chair1 · geometry + semantic + evidence + reasoning in one WorldExplanation.
Definition-of-success proofs
ClaimVerified
One app interfaceapps never import semantic/identity/reasoning internals
Cross-layer explainone call joins geometry + class/hyps + identity + evidence + facts + causal
World as graphEntity/Identity/Fact/Evidence/Event nodes with traversal
Spatial / temporalSVO LoS · free-space BFS reachable · changed(since=…)
Persistence / concurrencysnapshot→query · replay→query · concurrent query during capture
Honest ask()keyword parser, not NLP; same entrypoint for future LLM
Honest limits: ask() is not NLP; planner is index-vs-scan; large-world path planning out of scope.

Read full V27 narrative →

311/311 tests · kernel proof

V26, Integrated World Kernel

One labeled observation drives the whole stack via events — transactional commit, semantics, identity, reasoning, snapshot restore with identical authoritative checksum.

Tests311/311
Tx commit~1.4 ms
Invariant audit<1 ms
Hallway snapshot~120 ms
Invariants7 PASS
Checksumidentical
World Kernel (V26) panel with live correlation trace.
Live panel. ObservationReceived → … → WorldFactCreated · invariants PASS · 0 event failures.
Definition-of-success proofs
ClaimVerified
No manual downstream callsone observation → automatic event chain (correlation + causation linked)
Transactional authoritysingle-writer TransactionManager; ConflictError / NestedTransactionError; full rollback
Save → restore equivalencehallway 10,763 voxels · authoritative checksum identical
Replay determinismtwo identical runs → identical authoritative checksums
Invariant audit7/7 PASS live; modes audit/dev/test/production
Product e2e fixedtest_vwm_product_e2e.py 5/5 pass (reconstruction shadowing fixed)
Honest limits: no incremental snapshots; cross-layer query package deferred; learned perception not added; no many-worker stress suite.

Read full V26 narrative →

289/289 tests · stack complete

V25, World Reasoning Engine

Fourth layer of the stack: evidence-backed inference over the world. Classical rules, causal graphs, competing hypotheses, explanations — never mutates geometry, semantics, or identity.

Tests289/289
Live facts18
Inferred8
Rules6
Unresolved hyps1
E2E scenarios5
World Reasoning (V25) panel with causal chain for Light1 is off.
Live panel. Light1 is off 0.83 · Breaker1 tripped ⇒ Outlet1 no_power ⇒ Light1 off.
Definition-of-success proofs
ClaimVerified
Inference chain enforcedobservation → proposal → evidence → confidence → WorldFact; nothing skips
Classical rules without AIdoor→accessible, breaker→lights, chair→occupancy, disappearance→3 hyps
Causal chain reconstructionBreaker1 tripped → Outlet1 no_power → Light1 is off (live)
Competing hypothesesStatue disappearance keeps 3 unresolved alternatives
Never mutates the worldvoxels / semantics / identities byte-identical after infer/predict
Predictions are hypotheticalpredicted=True facts never overwrite current state
Honest limits: classical rules only; disappearance priors labelled as such; prediction is persistence projection; AI reasoner is a plugin interface.

Read full V25 narrative →

276/276 tests · time-travel ready

V24, Persistent World Identity

Objects keep UUIDs across observations. Probabilistic multi-signal matching, accumulated confidence, immutable history, and replay without mutating the present.

Tests276/276
Match signals7
Lifecycle states8
Live objects2
Chair versions5
E2E scenarios5
Persistent Identity (V24) panel with objects and change timeline.
Live panel. Chair Occluded · conf ~1.0 · v5 · added/moved/recolored timeline.
Definition-of-success proofs
ClaimVerified
Moved object keeps identitychair Office→Conference same UUID; spatial weight deliberately low
Attribute change ≠ new objectwall repainted; identity persists, recolored event recorded
Occlusion → re-matchlifecycle Tracked→Occluded; UUID preserved on reappear
New object stays distinctsize-dominated geometry; cup ≠ chair; ambiguity → competing hypotheses
Replay without mutationstate_at/replay/compare from immutable log; versions stamp detection time
Honest matcherweighted multi-signal heuristic; set_matcher/register_embedder hooks only
Honest limits: matcher is transparent heuristic not learned embeddings; auto merge/split is explicit API only; capture→identity auto-wiring is next integration.

Read full V24 narrative →

260/260 tests · meaning decoupled

V23, Semantic World Engine

Entities own meaning (hypotheses, attributes, relationships) and only reference authoritative voxels — one evidence path; AI/heuristics propose, humans verify.

Tests260/260
Ontology22 classes
Geometry mutations0
Review states3
Live entities3
AI proposalDoor 0.82
Semantic World (V23) panel with entities and 3D highlight.
Live panel. Entity list · competing hypotheses · highlight box over Wall region.
Definition-of-success proofs
ClaimVerified
Geometry never modifiedevery semantic op leaves world.coords byte-identical (14 tests)
Evidence-only mutationnoisy-OR confidence; human verify/override authoritative
Competing hypothesesWall entity: Door 0.82 vs Room 0.50 after AI + heuristic proposals
Relationships + inversecontains↔inside auto-inverse; persistent roundtrip
Highlight → worldreal bounds + voxel refs from authoritative coords
Honest proposerHeuristicProposer shape-based; no bundled perception model
Honest limits: search() is lexical; HeuristicProposer is geometric not deep AI; real detectors wire via propose(source="ai") through V22 registry later.

Read full V23 narrative →

246/246 tests · real CUDA

V22, Neural Enhancement Backends

Neural models as interchangeable evolution backends — never the renderer. Real-ESRGAN RRDBNet x4 runs on the RTX 2060 SUPER; registry-driven; world untouched.

Tests246/246
Live devicecuda
detail_gain0.75
Views / tiles3 / 3
Failures0
Backends5
Neural Backends (V22) panel with realesrgan CUDA diagnostics.
Live panel. Preferred realesrgan · VRAM · last cuda optimize.
Definition-of-success proofs
ClaimVerified
Real GPU inferenceRealESRGAN on RTX 2060 SUPER; 0 missing weight keys; live /api/neural/control optimize
Registry-onlyevolution calls backend.optimize(scene); engine names no model
New cached revisionhallway pass produces new evolution cache entry; world untouched
VRAM / fallbacktiling within budget; CPU fallback on CUDA error; OOM → classical
Honest stubsFLUX/SwinIR/HiDream report missing weights; never fake
Honest limits: scene update is neural-gated colour-detail transfer (detail_gain), not full splat inverse-rendering; quality_score can stay flat on colour-only changes.

Read full V22 narrative →

231/231 tests · reactive

V21, Reactive World Pipeline

Runtime becomes the backbone: immutable RuntimeEvents, bus + reactors, deterministic record/replay. One world edit cascades VoxelModified → … → GaussianFrameEnhanced with zero orchestration code.

Tests231/231
Canonical types22
Reactors4
Backpressure0
Orchestration in chain0
Replaydeterministic
Reactive Runtime (V21) panel with event stream.
Live panel. Colour-coded stream · named subscribers · cascade demo.
Definition-of-success proofs
ClaimVerified
Cascadedemo_edit → VoxelModified → ChunkInvalidated → ChunkCompiled → GaussianSceneCreated → SceneUpdated → GaussianFrameRendered → GaussianFrameEnhanced
Genuine eventsLegacyBridge republishes real V11 engine events
Independencereactors independently removable
Replayrecord → identical (seq, type) sequence
World authoritytest_world_untouched_by_reactive_layer
Honest limits: V11 mark_dirty still schedules compile internally; reactors stay lightweight; LoopbackChannel is in-process; SimulationTick/Playback* vocabulary not yet emitted from those sources.

Read full V21 narrative →

216/216 tests · unified intake

V20, Reality Capture Pipeline

Any source → ObservationPacket → Registration + Evidence → voxels. Never writes voxels directly. Closes the capture end of the E2E loop.

Tests216/216
Live voxels (via Evidence)1994
Live frames12
Direct voxel writes0
Record→replayidentical
Hardware stubsguarded
Reality Capture (V20) panel with synthetic capture stats.
Live panel. Synthetic capture routed through Evidence.
Definition-of-success proofs
ClaimVerified
Routing invariantvoxels_added == world coords from capture path
Multi-device synctimestamp bundles within tolerance
Replayidentical packet sequence + seek/step/speed
Extensibilitynew device = CaptureDevice + register
No invented depthrgb-only → needs_reconstruction
Honest limits: hardware drivers are guarded stubs; distortion/extrinsic application in fusion is stored but not fully applied yet.

Read full V20 narrative →

164/164 tests · async cache

V19, Gaussian Evolution Engine

Improves Gaussian scene data (not pixels) asynchronously: compiler scene → optimizer passes → cached revisions → best version served transparently. Complements V18. Voxel world untouched; rendering never blocks.

Tests164/164
Quality0.65→1.0
Optimizers10
Splats cached73 768
World mutations0
Blocking rendernever
Gaussian Evolution (V19) panel with best quality 1.0 and cache stats.
Live panel. /api/gevolution/diagnostics — balanced pass cached; quality 1.0.
Definition-of-success proofs
ClaimVerified
Data, not pixels8 classical optimizers transform splat arrays via GaussianOptimizer.optimize(scene)
Asyncpersistent queue + worker thread; render/sim never wait
Progressive cachenew revision per pass; hallway 0.65→1.0; history preserved
World untouchedtest_world_unchanged_by_evolution
Browser transparencyV18 path uses best_arrays() when cache is better
Extensibilitybrighten = class + register; engine unchanged
AI stubsFLUX / HiDream report blocker; skipped, not fatal
Honest limits: classical splat processing is what runs without GPU weights; quality score is a splat-data heuristic (not perceptual); camera-motion predictive prefetch is scaffolded, predictor TBD.

Read full V19 narrative →

150/150 tests · packet-only

V18, Gaussian Enhancement Pipeline

Enhances the Gaussian render itself (not the full display frame). Compiler Gaussian artifact → CPU splat rasterizer → GaussianImagePacket → visible-region 32-D embedding → chainable enhancers → enhanced image. Voxel world untouched.

Tests150/150
Enhancers10
Embedding32-D
Profileslow→cloud
World mutations0
Disabledpassthrough
Gaussian Enhancement (V18) panel with medium profile pipeline stats.
Live panel. /api/genh/diagnostics — enabled · medium · upscale→detail→material.
Definition-of-success proofs
ClaimVerified
Packet contractrgb + depth + normals + motion + semantic + material + object-ids + confidence + metadata
World untouchedtest_...world_untouched — enhancement is packet-only
Metadata conditioningvisible-region → 32-D embedding; never raw voxels / whole world
Passthroughdisabled / low profile identical to raw Gaussian render
Live image/api/genh/image?profile=medium → 320×240 enhanced hallway
Extensibilitynew enhancer (sepia) = class + register; engine unchanged
AI stubsRealESRGAN / photorealistic / reflection report exact blocker; no fabricate
Honest limits: classical-CV enhancement is what runs without GPU weights; CPU reference rasterizer ≠ browser WebGL splats; display-mode wiring for the enhanced frame is a follow-up; metadata unprojection is subsampled.

Read full V18 narrative →

135/135 tests · world alive

V17, World Simulation

Simulation evolves the authoritative world through time — no new foundation. Tick → behaviors → Runtime → Evidence → World → Compiler (auto) → Visualization. Door open auto-recompiles gaussian 768→764 with zero special integration code.

Tests135/135
Door → splats768→764
Behaviors9
Artifact writes by sim0
auto_wireChunkInvalidated
Determinism
Simulation (V17) panel showing running tick and object/behavior counts.
Simulation panel. Live tick / time / speed / objects / behaviors / triggers.
Pipeline + interaction proofs
ClaimVerified
Tick pipelinetick → behaviors+triggers → ctx.change_voxels → Runtime → Evidence → World → Compiler (auto) → Viz
Auto recompilebutton→door removes 4 voxels; gaussian chunk 768→764 splats, checksum changes
EventsDoorOpened + VoxelChanged both fire; sim never writes artifacts
Interactionsbutton→door · battery→light (to 0) · traffic-light cycle · proximity→open
Determinismsame world + events + seed → identical timeline
Extensibilitynew Behavior (sprinkler) = class + attach; engine unchanged
Honest limits: behaviors are illustrative (architecture over realism); browser play/pause/step UI is a follow-up; world edits should bump runtime revision the same way simulation does.

Read full V17 narrative →

118/118 tests · stack complete

V16, Universal Visualization Engine

One rendering entry point. Every renderer consumes V15 compiler artifacts — never voxels. Hot-switch never recompiles. Caps the major subsystem stack.

Tests118/118
Renderers17
Gaussian via artifacts73 768
Hot-switch compiles0
World mutations0
source=compiler_artifacts
Visualization Engine (V16) panel listing 17 geometry and debug renderers.
Visualization Engine panel. 17 renderers · active voxel · artifacts-only invariant.
Renderer catalog + invariants
CategoryRenderers
Geometry (10)voxel · gaussian · mesh · wireframe · normals · semantic · materials · lighting · occupancy · bounding_boxes
Debug (7)chunk_boundaries · dirty_regions · registration_graph · evidence_confidence · compiler_artifacts · component_hierarchy · runtime_events
Live verify/api/viz/render?renderer=gaussian → n=73 768 · source: "compiler_artifacts"
Honest limits: Three.js live modes still draw via V8–V15 representation paths (browser migration remaining); stylized renderers are the extensible target; screenshots/recording descriptions are engine-side, pixels captured in-browser.

Read full V16 narrative →

105/105 tests · Part 1

V15 Part 1, World Compiler Framework

One runtime owns all derived-artifact compilation. Five built-in plugins wrap real Gaussian / SVO / mesh / semantic / lighting logic; dependency ordering, transactions, cache, and error isolation are verified.

Tests105/105
Compilers5
Bus events10
Kernel modules15
World writes0
Extensibilityregister()
World Compiler (V15) panel showing 5 compilers and cache/transaction stats.
World Compiler panel. Live compiler count, artifacts, transactions, failures, and cache rate.
Kernel guarantees (verified in tests)
PropertyVerified behavior
Dependency ordergaussian before lighting; topological (compiler, chunk) work
Incrementalonly dirty-chunk artifacts recompile
Transactionalinvisible until commit · atomic swap · rollback on failure
Cachesame chunk/revision/params → hit, no recompile
Determinismidentical inputs → identical content checksum
Isolationthrowing compiler fails alone; world untouched
Extensibilityimplement Compiler + register(); runtime class unchanged
Part 1 honest limits: viewer still reads V11 runtime.compilers for live Gaussian/SVO (Part 2 routes through world.compiler); single-threaded drain today; persistence is metadata + per-compiler payloads.

Read full V15 Part 1 narrative →

88/88 tests

V14, Complete Registration & Mapping

Global SE(3) pose-graph optimization, loop closure, landmarks, anchors, and incremental world corrections. Synthetic-GT benchmark deliberately surfaces the hard cases — not just the wins.

Tests88/88
Loop drift8.99→0 m
Optimize time70 ms
Chi²241→0
Rotated GT0.0°
No-overlaprejected
Registration / Mapping (V14) diagnostics panel over the voxel hallway.
Registration / Mapping panel. Live pose-graph stats, quality, drift, sessions, landmarks, anchors.
Synthetic GT registration benchmark (artifacts/registration/benchmark.json)
SceneFitness / errorAccepted?Notes
Loop opt (12 nodes)8.99 m → 0.0 m · chi² 241 → 0yes5 iters · 70 ms
Rotated 0.4 radfitness 1.0 · 0.0°yesexact recovery
Large overlap 90%fitness 0.90 · 1.4°yesaccepted
Scale 1.8× from identityfitness 0.03noICP needs scale-aware init
Tiny overlap 16%fitness 0.38 · 151° wrongyes (shouldn’t)raise confidence gate
No overlapfitness 0.02rejectedcorrect gate
Measured on CPU synthetic GT only — real-sensor / real-model registration is not claimed. Numerical Jacobians today; analytic + sparse Cholesky for scale-up.

Read full V14 narrative →

72/72 tests

V12, Streaming Reconstruction & Persistent Gaussians

Provider-driven streaming perception into the V11 evidence engine, ICP registration that closes the V10 gap, and a chunked persistent Gaussian scene with a real elliptical splat renderer. Real LingBot inference is unsupported here (no CUDA / no checkpoint) — and that is stated, not faked.

Tests72/72
Splats live73 768
Gaussian chunks268
ICP fitness>0.9
Scale recovery2.5× exact
LingBot drift0
Gaussian Splat (v12) representation: elliptical splat reconstruction of the hallway with Runtime panel showing gaussian_scene 268.
Gaussian Splat (v12). 73 768 elliptical splats from 268 compiled chunks — instanced quads with gaussian falloff, not point sprites.
Measured (docs/V12_BENCHMARKS.md) — synthetic GT + real algorithms
MetricValueBasis
ICP known-transform recoveryfitness >0.9 · rmse <0.05 · ~0° rot errsynthetic GT
Umeyama scale recoveryexact (2.5×)synthetic GT
Non-overlap registrationrejected → pending alignmentsynthetic
Gaussian full compile (hallway)268 chunks / 73 768 splats / ~7.3 smeasured
Gaussian incremental (1 new voxel)1 chunk recompiled · 23 unchangedmeasured
Gaussian serializationSHA-256 checksummed · corruption detectedmeasured
Real LingBot throughput / VRAM / traj errorNOT MEASUREDneeds GPU + checkpoint
Unavailable hardware was never converted into a passing benchmark. The synthetic provider proves plumbing and math; LingBot’s perception quality is not claimed.

Read full V12 narrative →

47/47 tests

V11, Persistent World Runtime & Evidence Engine

Every modification flows through one runtime: evidence accumulation, six-layer dirty propagation, prioritized incremental recompiles, and a pub/sub event bus. Derived systems consume events; nothing polls, nothing rebuilds globally.

Tests47/47
Events / upload12 028
Dirty chunks31
Dirty layers6
Event types10
Evidence voxels79 439
Runtime Inspector panel with live stats, confidence histogram, and streaming ChunkInvalidated event feed.
Runtime Inspector, live. Evidence stats, dirty state, scheduler queue, event totals, confidence histogram, and the streaming event feed.
One GLB upload through the runtime, measured live
EventCountWhat it proves
RevisionCreated1The upload became a world revision
CaptureImported1Provenance recorded as a Capture
ObservationAdded5 997Every voxel backed by an observation
ConfidenceUpdated5 997Evidence engine ran per observed voxel
ChunkInvalidated31Only affected chunks marked dirty — never a global rebuild
Honest notes carried from the report: confidence is uniform 1.0 on a fresh single-capture world (the mechanism only diverges with re-observation, conflict, and decay); per-voxel heatmap modes are partial; runtime state is in-memory this build; per-voxel evidence dicts need vectorization for very large worlds.

Read full V11 narrative →

33/33 tests

V10, Universal World Engine

The world-OS milestone: universal upload pipeline, persistent components, SVO-routed queries, revision timeline, and full provenance — trace(point) walks voxel → SVO node → Component → observations → Capture → original file, verified live.

Tests33/33
Raycast speedup4.3×
Formats ingested9
Honest-error routes6
GLB upload5 671 vox
World rev1
VWM viewer with the World OS panel: drag-and-drop upload, query search, and live stats line.
World OS panel. Upload, query search, and the live stats line: voxels 79 439 · svo 237 697 nodes · components 3 · captures 1 · world rev 1.
SVO-routed queries vs linear baseline (wos_query_benchmark.json, 73 768 voxels)
Reported plainly: SVO nearest-neighbour currently loses to a vectorized numpy scan at this scale; a Morton neighbour-search optimization is future work. Raycast-shaped queries are where the octree's empty-space skipping pays.
Universal upload pipeline — format coverage
StatusFormats
End-to-endglTF / GLB · OBJ · PLY mesh · PLY/XYZ point cloud · Polycam zip · VWM voxel npz · image heightmap
Routed, honest errorLAS/LAZ · video (offline SfM job) · USD/USDZ · FBX · Gaussian splats · COLMAP — specific reasons, never fake success
Every successful upload creates a Capture + world revision + incremental SVO update, via an async job queue with progress, ETA, and retry.

Read full V10 narrative →

19/19 tests

Sparse Voxel Octree Integration

A derived octree acceleration structure built from the unchanged authoritative VoxelWorld — algorithms audited and adapted from MIT-licensed otaku690/SparseVoxelOctree, no upstream code compiled in. Exact occupancy on all scenes; openings verified open.

Tests19/19
Incremental edit19 ms
Collision95–148k q/s
Sparse topology7.6×
Thin recall1.00
Compression6.7–12×
SVO Depth mode: nested wireframe octree boxes colored by level over the scanned hallway.
SVO Depth mode. Node boxes coloured by octree level — huge cells over empty space, fine cells only at the scanned surface (99 121 nodes served, depth 8).
Four benchmark scenes (artifacts/svo/benchmark.json)
SceneVoxelsIncremental vs fullCollision q/sRay q/sTopology vs dense grid
Hallway (real scan)73 76819.6 ms / 1 223 ms101 6076 6310.25× (grid wins)
Thin features4 5196.3 ms / 40 ms148 62910 597~1×
Large sparse19 9989.1 ms / 1 550 ms94 9391 5097.6× smaller
Dense indoor13 25616.1 ms / 123 ms109 7384 9630.12× (grid wins)
Honest limitation, stated in the report: on a small dense surface shell a 1-byte dense grid is more compact in RAM. The SVO wins on sparse scaling, empty-space skipping, hierarchical aggregates, and incremental maintenance — its advantage grows with sparsity. Accuracy verified on every scene: 0 false-occupied, 0 false-empty, thin recall 1.00, doorways open.
SVO Leaves mode: solid green occupied leaf shell of the hallway.
Leaves. The occupied leaf shell the collision suite queries.
SVO Interior mode: gold wireframe hierarchy nodes above the leaves.
Interior. Aggregate nodes that let traversal skip empty space.

Read full SVO narrative →

Error bounded by construction

V9, Error-Driven Adaptive Voxelization

v8's heuristic ("is there detail?") replaced by a guarantee: a region stays one voxel iff it approximates the mesh within a configurable error budget. Appearance is decoupled from geometry via a texture-patch atlas — paintings no longer spawn tiny voxels.

Within 12 mm budget99.9%
Preview voxels8 888
Appearance patches1 534
Plane-snapped1 685
LOD stability0.939
Budget profiles6
Three top-down panels: v8 heuristic voxels, v9 error-driven voxels colored by budget status, and the v9 appearance layer.
v8 heuristic vs v9 error-driven vs v9 appearance layer. Middle: grey = within the 12 mm budget, red = subdivided for geometry, blue = topology. Right: coloured voxels carry texture patches that display detail without subdividing.
v8 heuristic vs v9 error-driven (benchmark_v8_v9.json)
Independent error terms drive subdivision: geometry (master, p95 residual to best-fit plane), normal (p90), curvature (p90 dihedral), topology (never bridge gaps), thin, silhouette — appearance is metadata only and never triggers subdivision. Robust percentiles replaced max after a single LiDAR speckle forced 67k voxels; budgets are calibrated to measured mesh noise (3.3 mm RMS flat / 9.6 mm edges at 24 cm cells).
Error-budget profiles — tolerances change, algorithm doesn't
ProfileGeometry budgetVoxelsp95 geometry errorLOD stabilityPatches
preview55 mm8 88816.2 mm0.9581 404
gaming26 mm15 3998.4 mm0.9471 249
architectural12 mm18 8496.3 mm0.9561 078
museum6 mm23 4684.4 mm0.967886
Tighter budget → more voxels. Honest finding: this phone-LiDAR mesh has ~3–5 mm intrinsic surface noise, so budgets below that force fine voxels everywhere — the sensor sets the floor.
Geometry-only mode: blue coarse within-budget blocks, orange fine voxels where error demanded subdivision.
Geometry only. Blue = coarse, within budget; orange = subdivided by measured error.
Appearance-layer mode: large voxels displaying projected texture patches.
Appearance layer. Same geometry, texture patches supply the visual fidelity.

Read full v9 narrative →

Measured fidelity

V8, Feature-Preserving Adaptive Voxelization

The Polycam mesh voxelized by measured curvature: 24 cm blocks on flat walls, 3 cm voxels only at edges, corners, and trim. Every voxel anchored to a measured surface sample; zero invented geometry.

Feature voxels10 231
vs uniform13.6×
Wall RMS2.8 cm
Corner error0.28°
Trim uplift3.2×
Invented0
Three top-down panels: textured Polycam mesh, uniform 3 cm voxels, and feature voxels with blue coarse walls and red fine edges.
Mesh vs uniform vs feature voxels, top-down. 138 910 undifferentiated 3 cm blocks (middle) become 10 231 feature voxels (right): blue 24 cm on flat walls, red 3 cm at edges and frames.
Uniform @3 cm vs feature voxels, same surface
Fidelity measured from the mesh + emitted voxels, nothing assumed: 15 fitted planes flat to 2.8 cm RMS; 48 wall–wall corners at 89.7° (0.28° mean error, 1.48° max) with 51% fine voxels at the seams. Tuning insight: on noisy phone-LiDAR, curv_flat ≈ 0.35 — 0.10 left 93% at the finest level, 0.55 over-coarsened the detail away.
Voxel-size mode: blue large flat-wall voxels, orange and red fine voxels at features.
Voxel-size mode. Blue coarse walls, red fine detail — resolution allocated where measured.
Feature-density mode: green quiet surfaces, red feature-rich regions.
Feature-density mode. The measured curvature signal that drives subdivision.

Read full v8 narrative →

Live in the viewer

The Polycam Scan in the VWM Viewer

The Polycam capture served standalone by the authoritative-world server — extracted surface by default, 73 768 literal voxels one click away, all render modes and per-voxel inspection working unchanged.

Voxels73 768
Mesh verts30 974
Texture8192²
Scale12.3 m
Grid106×55×246
FPS63
Fly-mode view down the voxelized Polycam hallway in real-color mode with the voxel inspector open.
Literal Voxels, real color, fly mode. The Polycam scan voxelized at 5 cm, with per-voxel inspection (class SURFACE, provenance observed_surface, metric position) at 64 FPS.
Occupancy mode: all voxels classified SURFACE, stats panel showing FREE 0.
Occupancy mode. All-SURFACE, FREE 0 — this direct import is surface-only; carving is the named next step.
Wireframe mode exposing the voxel structure of the hallway.
Wireframe mode. Voxel structure exposed down the corridor, 65 FPS.
Direct Polycam import, measured
MetricValueNote
Extracted surface30 974 verts / 49 475 facesThe real Polycam mesh with its 8192² texture, default view
Literal voxels73 768 @ 5 cmGrid 106×55×246, correctly metric (12.3 m hallway)
Render performance63–65 FPSFly mode through the voxel hallway, all modes instant-switch
Free space0 (surface-only)No carving run on this import yet — Walk has nothing to stand on; next step

Read full narrative with all mode screenshots →

Multi-source, measured

Reality-Capture v7, Polycam Multi-Source Fusion

A LiDAR-metric Polycam scan of the same hallway fused into the persistent authoritative VoxelWorld as another observation source. Registration is computed, not hand-tweaked; fusion accumulates, never overwrites.

ICP median0.030 vox
Scale error4.9×
Confidence+15%
Coverage+528
Cross-confirmed2 818
Merge stability1.0
Registration: Polycam → video-built world (PCA coarse + robust ICP)
MetricValueMeaning
ICP median residual0.030 voxelsSub-voxel — two independent reconstructions are provably the same hallway
ICP mean residual0.056 voxelsRobust alignment throughout
Implied metric scale1 unit = 4.91 mMonocular world was compressed ~4.9× (real hallway 12.3 m, video had ~2.5 m)
The long-standing monocular scale error — flagged honestly since v2 — is now exposed and quantified by a metric source, exactly the value of a second heterogeneous sensor.
Viewer source mode: blue video-only voxels, orange Polycam-only voxels, green voxels observed by both sources.
Source mode. Blue video-only (6 418), orange Polycam-only (528), green both-agree (2 818) — the green mass is cross-source validation.
Fusion: video-only world vs after Polycam merge
Polycam import: 30 974 verts / 49 475 faces, metric 12.28 × 5.28 × 2.72 m, 8192² PBR texture baked to vertex colors, 120 000 sampled observations. Not yet done (honest): applying the metric-scale correction (re-voxelization is a deliberate, reversible next step), metric-density surface re-extraction, semantic re-estimation, live Luanti walkthrough.

Read full v7 narrative →

Representation ≠ storage

Reality-Capture v5, Extracted-Surface Reconstruction

The VoxelWorld/HAV is unchanged — it stores the TSDF field. The viewer now renders the continuous surface extracted from that field (marching cubes) instead of storage cubes. Extraction runs only where the field was observed; zero geometry invented.

Fidelity (EFS)0.962
Vertices7 809
Faces14 452
Manifold edges0.924
Area12.8 m²
Gaps closed4
Same authoritative TSDF field rendered as literal voxel cubes (left) and as the smooth extracted surface mesh (right) in the VWM viewer.
The decisive comparison. Same authoritative TSDF field: literal voxels (left) vs the extracted marching-cubes surface (right), vertex colors from observed appearance. A pure representation change; the world is untouched.
v4 (literal voxels) vs v5 (extracted surface), same field
Signal v4 literal voxels v5 extracted surface
Representation rendered 11k+ storage cubes 7 809-vert / 14 452-face mesh
Manifold-edge fraction n/a 0.924
Surface area 12.8 m²
Environment Fidelity Score 0.962
Look blocky blob smooth architectural surface
Authoritative world changed no (derived view only)
Viewer default is now Extracted Surface with a one-click toggle to Literal Voxels, both from the same field via /api/surface. Honest limits: walls are smooth-but-wavy and corners rounded (marching cubes) — plane-snapping + dual contouring is the named next step; fine features need a capture that observed them. Nothing was faked.

Read full v5 narrative →

No invented geometry

Reality-Capture v4, Recognizable Adaptive Reconstruction

Same authoritative v3 world, made recognizable: conservative hole-filling (every fill provenance-tagged INFERRED, free air never touched) plus adaptive per-voxel detail levels. Viewer upgraded with Walk mode and three new render modes.

EIS0.743
vs v3+47%
Holes427 → 0
Free voxelsunchanged
FPS63
Walk modeyes
v3 → v4, same authoritative world
Fill rule: an UNKNOWN voxel enclosed by observed matter on ≥4 of 6 faces is a gap in a real surface, not open space. Free air never qualifies, so doorways and unseen rooms stay open. Filled-voxel appearance is interpolated from neighbouring observed colour.
Side-by-side viewer screenshots: v3 with speckled reconstruction holes, v4 with continuous filled surfaces.
v3 (left) vs v4 (right), real-color mode. 427 enclosed holes closed; the shell reads as a continuous surface. Free space untouched.
LOD heatmap: blue coarse, green medium, red fine detail on edges and corners.
LOD heatmap. Fine detail (red) concentrates on edges/corners.
Inferred-fill mode: pink voxels mark every hole-fill addition.
Inferred-fill mode. Every fill visible in pink — auditable provenance.

Read full v4 narrative →

Working, measured

QA Loop + Three.js VWM Viewer

Automated QA over the v3 world (3 iterations, measured fixes) plus the official browser engineering client: a Three.js viewer/editor over the single authoritative VoxelWorld, which owns no world state of its own.

FPS63
Voxels15 613
Acceptance13/15
Render modes9
Edit scope3×3×3
Global rebuildfalse
The VWM Three.js viewer rendering the reconstructed hallway in real-color mode with mode buttons, voxel inspector, and live stats panel.
The viewer on the v3 world, real-color mode. Live stats bottom right: 61 FPS, 15 613 voxels, SURFACE 8 047 / FREE 4 850. Bottom left: the click-to-inspect panel with one voxel's authoritative metadata.
QA loop, defects fixed with before/after measurements
IterationDefectMeasured result
1 → 2 Spawn out-of-bounds (12,22,−2); 146 voxels dropped; connectivity 0.0 Unified shift → 0 dropped, connectivity 0.992, spawn in-bounds
3 Spawn had no floor (only 9% of free voxels have observed floor below) find_standable_spawn → spawn on observed floor with head clearance
Remaining defects are capture-data limitations (floor coverage, absolute scale), not code bugs. Full log: v3/qa/ENGINEERING_LOG.md.
Viewer measurements
MetricValueNote
Render performance63 FPS15 613 instanced voxels, single draw call, no culling needed
Mode switchinginstant9 modes, in-place instance recolour, no geometry rebuild
Edit round-triplocal 3×3×3POST → authoritative mutation → revision++ → dirty region; global_rebuild=false
Camera movement0 server callsPure client render — the zero-regeneration invariant at the viewer level
World state in clientnoneAll state from /api/world|meta|stats|edit; Three.js r128 vendored, no CDN
Luanti edit-reflectionpartialEdits hit the shared world Luanti reads; Luanti not connected this session

Read full viewer narrative →

Proven, not asserted

Reality-Capture v3, Hollow Interior + Live Import

Same canonical video, pipeline extended with an occupancy stage (FREE / SURFACE / OCCUPIED / UNKNOWN), a free-space connectivity graph, and a working live VoxelWorld/HAV import. The rule a room is free space bounded by voxelized matter is measured, not asserted.

VerdictHOLLOW
Centreline free1.0
Flood-fill reach99.2%
False-occ air0
HAV import9.9 s
Free spawnyes
v1 → v2 → v3, same canonical video
The HAV stall fix was structural, not a tweak: TSDF yields a compact shell over a ~31³ span versus v1's 137k splats over a 1 000-unit span, so live import now runs at 1 090 fills/s. Wall thickness (2 716 inferred voxels) extrudes ≤2 voxels behind surfaces, only into UNKNOWN, never into FREE, and is provenance-tagged as inferred.
Occupancy slice: green flood-filled free interior bounded by tan matter voxels.
Flood-fill proof. Green FREE interior (99.2% reached from the camera, one region) bounded by tan matter.
Side occupancy slice showing the thin matter shell and unobserved space left unknown.
Side slice. Thin matter shell with bounded inferred thickness; unseen space stays UNKNOWN.
Not run this pass (honest)
ItemStatusNote
Live Luanti client walkthroughnot runNeeds interactive human session; world imported with free-space spawn, ready
Restart persistence round-tripnot runExport-import round-trip deferred
Held-out appearance / exposure normnot this passIterative refinement, not blocked by the model
Portals / multi-room segmentationnot emittedFree-space graph exists; this capture is a single hallway region
Absolute metric scalebest-effort (~2 m)Compressed monocular cloud; richer capture (orbit / AR poses) is the lever

Read full v3 narrative →

v1 vs v2, measured

Reality-Capture v2, TSDF Fusion

Same canonical phone video as the walkthrough below; fusion upgraded from point-splat to true TSDF volumetric fusion with free-space carving, plane-based semantics, and a 42″-door metric anchor. Deterministic run, same authoritative pipeline order.

Reprojection L10.0543
vs v1−28%
Obs / voxel15.2
Watertight0.99
Surface voxels9.6k
Scale0.0098 m/u
v1 (point-splat) vs v2 (TSDF), same video
TSDF weighting merges duplicate shells and removes floaters: 14× fewer voxels that reproject 28% more accurately. Coverage drop is the honest cost of keeping only confident voxels; L1 improves anyway. Absolute scale passes its sanity gate but the monocular cloud is geometrically compressed — treat scale as approximate.
Side-by-side of v1 point-splat reconstruction and v2 TSDF reconstruction of the same hallway view.
v1 vs v2, same view. Left: 137k single-view splats stacked into fan shells. Right: 9.6k TSDF voxels averaging ~15 observations each — sparser on screen but geometrically truer.
Side view comparing v1's thick fan of duplicate shells with v2's single flat coherent wall surface.
Where the 14× reduction came from. Side view: v1's duplicate single-view shells sweep out a thick fan (left); v2's TSDF weighting collapses them into one coherent wall (right).
New capabilities in v2
CapabilityMeasuredNote
Free-space carving4 416 free / 24 283 unknownUnseen space never filled solid; confidence + provenance per voxel
Watertightness0.99 backed fraction99% of surface voxels backed by ≥2 occupied neighbours
Plane semantics8 RANSAC planeswall / floor / ceiling by geometry, inlier-count confidence, wall thickness via parallel planes
Metric anchor42″ door, conf 0.98Outlier-robust percentile width + scene-size sanity gate (2–40 m)
Voxel confidencemean weight 7.27Real accumulated weight everywhere (v1: single unweighted observations)
Honest limits in v2
LimitMeasuredFix
Absolute scale approximate ~2 m scene, too small for a real hallway In-frame metric measurement (ARKit depth / ruler)
Render coverage 0.49 (was 0.99) Back-and-forth / orbit pass spreads the cloud
Scale-consistency CoV 0.576 unchanged ARKit/ARCore poses remove SfM scale drift
No loop closure one-way walk, no revisit Detected + reported, not invented; capture with revisit

Read full v2 narrative →

End to end, measured

Real-Video Reconstruction, Phone Walkthrough

Real phone walkthrough of a home (laundry area to hallway), 464×848, 19.4 s, 582 frames. No synthetic data. Full pipeline in 13.7 s (excl. persistent-world build). v2.4 not trained.

Reprojection L10.076
Coverage0.99
SfM tracked24/24
Scale CoV0.576
HAV leaves38.3k
Processing13.7 s
Phone walkthrough vs BRIO webcam (same pipeline)
Same pipeline, better capture motion. Forward walking fixed what tiny webcam baselines could not. Three bugs fixed in this run: gauge-normalisation (negative depth), NumPy 2.x .ptp(), and a slow per-voxel render loop (vectorised).
Three keyframes showing original phone frame beside reconstructed voxel render from the same recovered pose.
The reprojection benchmark, visually. Each pair: real frame (left) vs reconstruction rendered from the same recovered pose (right). This is the source of the L1 0.076 / coverage 0.99 numbers above.
Full pipeline run (reconstruction_report.json)
StageMetricValue
CaptureVideo frames / extracted / keyframes582 / 155 / 24
SfMFrames tracked / mean confidence24 / 24, 0.897
AlignmentOverlap edges / triangulated samples156 / 19 170
AlignmentSolved cross-frame scale CoV0.576
FusionPoint-cloud points120 000
FusionSurface voxels (confirmed)137 685 (311)
ComponentsProposed (connected-component)9
ReprojectionPhotometric L1 vs original frames0.076
ReprojectionCoverage0.99
Persistent worldHAV leaves materialized38 284
RuntimeReconstruction processing13.7 s
Bugs fixed in this run
BugSymptomFix
Gauge normalisation Aligned depth went negative SfM poses define scale; no gauge normalisation
NumPy 2.x .ptp() API break under NumPy 2 Replaced with portable range call
Per-voxel render loop Slow novel-view / reprojection path Vectorised render path
Honest weaknesses in this run
WeaknessMeasuredFix
Single-view voxels 137 374 provisional vs 311 confirmed Orbit / back-and-forth capture
Residual scale drift CoV 0.576 Metric anchor or AR poses
HAV materialization cliff fills stall on large SfM span; in-process deadlock Separate process; reopen from voxel_grid.npz
No free-space carving disabled for speed Re-enable + TSDF fusion
Weak component labels extent-ratio heuristic, conf 0.4 Real semantic segmenter

Read full reconstruction narrative →

Partial milestone

Reality Capture, Real Webcam Scan

Logitech BRIO, 18 s / 425 frames, real bedroom. End-to-end: keyframes → visual SfM → depth-anything → alignment graph → fusion → real RGB → novel view. v2.4 not trained.

Frames425
Keyframes14
SIFT matches540
Surface voxels6154
Align samples16.6k
Processing10.3 s
Synthetic vs real: domain gap confirmed
Real photos unlock depth-anything and feature geometry. Multi-view metric consistency needs larger baselines, AR poses, or a metric anchor.
Real pipeline run (real_scan_report.json)
StageMetricValue
CaptureTotal frames / keyframes425 / 14
SfMTracked frames / mean confidence14 / 0.89
AlignmentOverlap edges / triangulated samples56 / 16 626
AlignmentSolved scale CoV30.4
FusionSurface voxels (0.04 m)6 154
FusionConfirmed / provisional3 200 / 2 954
RuntimeEnd-to-end processing10.3 s
Single-view vs multi-view (honest)

Read full real capture narrative →

Controlled depth benchmarks
Scan pipeline

Depth Source Comparison

Controlled room, 20-frame trajectory, identical poses and fusion. Only depth source varies. Monocular runs use robust pooled calibration (not frame-0 anchor).

Sensor recall0.918
Sensor backproj0.17
DA3 recall0.564
DA2 recall0.449
DA3 scale CoV0.47
Calib fix2.5×

3-way depth benchmark

Trends vs RGB-D / LiDAR sensor ground truth. Lower backproj/abs err and scale CoV are better; higher recall and IoU are better.

Fusion quality by depth source
Source: checkpoints/vwm_scan/DEPTH_SOURCE_COMPARISON.md. DA3 beats DA2 on this synthetic test; neither approaches sensor without reliable depth.
Monocular vs monocular (DA3 vs DA2)
Calibration methodology (caught bug)
Frame 0 was a scale outlier (8.1 vs typical ~3.9). Pooled calibration cut error >2.5×. Lesson: never anchor scale on one frame.
Surface recall, visual comparison
Sens. 0.918
DA3 0.564
DA2 0.449

Read full depth scan narrative →

Appearance compiler benchmarks
v2.3, not promoted

Appearance v2.3

Data engine + rare geometry training. Headline: 100k stress test found and fixed a fused-renderer memory leak. v2.2 stays production default.

RSS (100k fixed)3056 MB
RSS growth0 MB
Dataset2757
Rare thin_surv.0.965
Std. L1 Δ+45%
Defaultv2.2
100k stress test: memory leak found and fixed
StageResult
Pre-fix RSS (45 min)>9700 MB (monotonic climb)
Root cause_repair unbounded keyframes (~57 KB/frame); _build capped at 24
FixShared _insert_keyframe() with eviction; both paths use it
8k regressionKeyframes 24/24, RSS +1.4 MB
100k post-fix (52 min)RSS flat 3056 MB (0 growth)
Compiler invariant0 model/compiler calls (unaffected)
Source: fused_renderer_leak_fix.json, proof100k_fixed/memory_fix_validation.json. Applies to production v2.2 fused renderer.
Data engine (v2.3 infrastructure)
ComponentResult
Dataset scale1,050 → 2,757 obs (1,707 new rare)
Cycles factory1.79 obs/s (2.24× speedup)
Active plannerAvoids 90% of Cycles work
Rare generators25 thin-geometry classes + 17 material families
10k targetPartial (2,757 / 10,000, resumable)

v2.2 vs v2.3 benchmark

Frozen standard held-out (production comparison) and rare-geometry held-out (where v2.3 wins). Trends vs v2.2.

Standard held-out (VWMScore v3)
VWMScore edge driven by structure term; standard L1 regresses +45%. Scratch over-sharpens (edge-IoU 0.872). Source: vwmscore_v3_frozen.json.
Rare / compositional held-out (v2.3 wins)
Rare geometry gains are real; material adherence regressed (training pool 74% rare geometry).
Promotion verdict
Criterionv2.3 continue
Rare geometry improved✓ (thin_survival 0.965)
Standard photographic L1✗ (+45% regression)
Clean win on aggregate✗ (structure-for-photo trade)
Memory leak fixed (renderer)✓ (benefits v2.2 prod)
Promoted✗ — v2.2 stays default
v2.2, production default

Appearance Model v2.2

Production default. Structural fidelity without sacrificing photographic appearance. Memory leak fix from v2.3 applies to this renderer.

VWMScore v30.773
Edge IoU0.691
Structural ID0.698
Thin survival0.841
Gate failures0
10k frames0 runs
Architecture fix summary
ChangeEffect
Decoupled intrinsic decoderStops light-invariance from flattening final-head features
Structure-guided final decoderG-buffer boundary map (never Cycles RGB) guides edges
Anti-blur + bleed + structure-aware localityEdges preserved; boundaries never flattened by locality loss
Root causeintrinsic~lightinv cosine +0.89 on shared trunk (amplification imbalance)
Invariant proof (10,000 camera frames)
Testv2.2 result
Neural model invocations (camera-only)0
Compiler invocations (camera-only)0
Median FPS48.6
Modules import clean85

4-way benchmark (VWMScore v3)

Frozen benchmark on same held-out split. v2.2 promoted (Pareto-dominates v2 on all six axes). Trends vs v2 (was production).

Quality, structure, and aggregate score
Source: benchmark_final/benchmark_full.json. Trends in v2.1/v2.2 columns vs v2 (previous production default).
Photographic L1, version comparison
v2 0.019
v2.1 0.014
v2.2 0.018

Structural torture house

Thin geometry: chair legs, railing balusters, cables, handles, keyboard keys, vent slats. Trends vs v2.

Hard-structure survival
No edge hallucination: boundary precision held at 0.95 on standard set (aggressive-loss candidates painted fake edges).
v2.1, not promoted

Appearance Model v2.1

16 held-out scenes · 96 views · edit-locality + relight supervision · VWMScore v2 benchmark. Best photographic L1; v2 wins aggregate score and stays default.

Photographic L10.014
VWMScore v20.833
Observations1050
Edit drift0
Light variance8×10⁻⁶
Gate failures1%
New capabilities measured in v2.1
Capabilityv2.1 resultNotes
Edit-locality losswiredEMA 0.0005; 270 edit pairs
Unchanged-component drift08 sequential edits torture test
Intrinsic light invariance8×10⁻⁶Matched Cycles relight groups
Dataset audit1050/10500 rejected
In-Luanti capturenot re-runpath wired; headless proof only
Training & dataset (v2.1)
Metricv2.1v2
Total observations1050600
Standard pairs600600
Edit pairs270-
Relight groups180-
Training steps50003000
Training time~180 s105 s
Peak VRAM215 MB215 MB
Batch mix40/30/30standard

Historical: v1 / v2 / v2.1 (VWMScore v2)

Earlier unified evaluation. Superseded by VWMScore v3 benchmark above.

Quality, geometry, and aggregate score (archived)
Trends vs prior column. v2 won production default at this stage; later superseded by v2.2.
v2, superseded

Appearance Model v2

Former production default. Promoted after v1; superseded by v2.2.

VWMScore v20.871
Photographic L10.019
Surface variance0.0
Gate failures0
Camera FPS209
Quality benchmark, deferred vs v1 vs v2
Metric Deferred v1 v2
Photographic L1 → Cycles 0.316 0.033 0.019
Edge IoU (geometry) - 0.635 0.580
Multi-view surface variance - - 0.0
Geometry-gate failure rate - 0.0 0.0
VWMScore v2 - 0.717 0.871
Lower L1 is better. v2 wins aggregate VWMScore v2 on unified benchmark. See 3-way compare for v2.1.
Photographic L1, visual comparison
Def. 0.316
v1 0.033
v2 0.019
Training & dataset
Metricv2v1 (ref)
Training pairs60050
Scenes10010
Scene classes101
Training steps3,000600
Training time105 s13 s
Peak VRAM215 MB395 MB
Parameters1.45Mcompact U-Net
Silhouette IoU (parity)0.970.97
Pairs rejected (parity)0-
Runtime invariant, model runs only at compile time
Testv2 result
Model runs during house compile17 (once per view)
Model runs, 1,000 camera-only frames0
Median FPS (camera-only)209
p95 frame time5.5 ms
Test suites greenall
Modules import clean83
Failed iteration (honest), intrinsic-only v2 before dual-head fix
Metricv1Intrinsic-only v2
VWMScore0.7920.584
Photographic L10.0330.135
Outcome-not promoted
Dual-head architecture was added and re-benchmarked; promoted v2 is the row in the quality table above.
v1, Superseded

Appearance Model v1

First real checkpoint, 2 held-out scenes (1008, 1009) · narrow procedural distribution · proof that the full pipeline works.

L1 improvement21×
Held-out L10.016
Silhouette IoU0.97
Edge IoU0.72
Peak VRAM395 MB
Camera FPS242
Quality benchmark, narrow held-out (scenes 1008, 1009)
Metric Deferred v1 model Change
Photographic L1 → Cycles 0.343 0.016 21× better
Views improved - 100% -
Silhouette IoU (camera parity) - 0.971 -
Edge IoU (geometry) - 0.72 -
Geometry-gate failure rate - 0.0 -
v1 channel ablation later showed only deferred RGB contributed, v1 learned tone/GI, not structure. Source: vwm_appearance_v1.report.json
Photographic L1, visual comparison (v1 held-out)
Def. 0.343
v1 0.016
Training & dataset
Metricv1
Training pairs50
Scenes × views10 × 5
Held-out scenes1008, 1009
Training steps600
Training time13 s
Peak VRAM395 MB
Resolution160²
Runtime invariant
Testv1 result
Model runs during compile (6 views)6
Model runs, 500 camera-only frames0
Camera-only FPS242
1,000-frame proof median FPS89
Test suites green46
Modules import clean82

Cross-milestone comparison

Headline metrics across checkpoints. Current default: v2.2. Latest evaluated: v2.3 (not promoted).

Headline metrics at a glance
v2.3 improves rare geometry and fixes long-session memory; v2.2 kept for standard photographic quality. See v2.2 vs v2.3 for full tables.

Read full milestone narratives →