- _export_pbr vertex branch returns (trimesh, pre_simplified) per contract
- materialize vertex_normals pre-export (glTF NORMAL, same trick as _raw_trimesh)
- gltf_validation: COLOR_0-without-UVs primitives are a legitimate color-bearing
static asset (glTF default material x COLOR_0); texture checks skip for them
Full gate now EXIT=0: 71.96s e2e, 26.5GB peak (from A0 216.6s / 75.4GB).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- sparse_conv_metal: fused gather-GEMM kernel, parity 8e-4 vs stock;
honest verdict: stock chunking already bounds memory at decoder scale
(1.97GB synthetic peak) and beats the scalar kernel on speed — kept as
TRELLIS2_METAL_SPCONV=1 opt-in + upstream reference, NOT default.
- _attempt_schedule: preferred=vertex now runs the vertex baker (was
silently falling through to the 5h+ pure-python kdtree grind).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>