Ingest & cache
A VASP run directory, a flat archive of standalone CHGCARs from the Materials Project, or an already-prepared cache — all three normalize through one MaterialSource contract before anything downstream has to care which it was. Every material is then spectrally downsampled once to the training resolution and written to a per-material cache directory, so a second run over the same data costs nothing. Each cache remembers exactly what built it — resolution, potential source, every ingestion path — so two runs with different settings can never silently share stale fields under the same name.