curl -sSLO https://github.com/aselimc/jepa.cpp/releases/download/v0.1.1/jepa-0.1.1-linux-x86_64.tar.gz
tar xzf jepa-0.1.1-linux-x86_64.tar.gz && jepa-0.1.1-linux-x86_64/bin/jepa-info --versionLinux x86-64, CPU only, built for x86-64-v3 (AVX2/FMA/F16C/BMI2) against glibc 2.35.
SHA256SUMS next to the archive is its checksum; the copy inside lists every packaged file.
Added
- Hardening of the untrusted-input paths — a GGUF is a download and an image is bytes off a
network, and both are now range-checked before anything is allocated. The loader validates every
jepa.*integer and float against a documented bound, refuses an unknown activation or attention
mode, checks that each tensor's bytes are actually inside the file, that its dtype is one the
engine can compute with, and that every weight, bias and vector of every block has the shape and
the f32-ness the graph will assume — so a file that promises a predictor or a head it does not
carry is refused at load rather than aborting on first use. Call-time guards cover non-positive
and overflowing shapes, ids off the predictor's grid, and the$JEPA_MAX_GRAPH_MIBceiling, which
now also applies to the masked predictor and the LeWM rollout. The image pipeline caps the
intermediate of the shortest-edge resize at 64 megapixels. Nothing is clamped silently: every
refusal names the key or tensor, onstderrand injepa_error_text().
docs/architecture.md "Robustness". - Thread-safety contract, stated in
include/jepa.hand checked by the newthreadsctest
suite: ajepa_modelis immutable after load and shareable across threads, ajepa_context
belongs to one thread,jepa_error_text()is thread-local, preprocessing is re-entrant, and
concurrent encodes through per-thread contexts are bit-identical to the same work run serially. errorsandthreadsctest suites (tests/test-errors.cpp,tests/test-threads.cpp), and a
GGUF loader fuzz target (tests/fuzz/fuzz-gguf-load.cpp,-DJEPA_FUZZ=ON, off by default)
with a corpus generator (scripts/make_fuzz_corpus.py). The first two need no weights, so the
ASAN+UBSAN CI job runs them; the fuzz target is build-only in CI.
Fixed
- Fourteen input classes that crashed, hung or over-allocated the loader or a tool now return an
error: a zero head count (SIGFPE), an integer-typed matmul weight (a null kernel pointer),
block vectors of the wrong length, an f16 table in the f32 graph, tensor bytes beyond the end of
the file, an unknown activation, a promised predictor or head with no tensors, an odd head width
on a 3-D RoPE family, mask or frame counts past their tables, RoPE interpolation without a
reference grid, signed overflow in the rollout and batch size arithmetic, a degenerate image
aspect ratio, and a 32-bit seek that made GGUFs over 2 GB unloadable on Windows. Every case has a
regression test intests/test-errors.cpp. - A data race on the engine's one-shot warning flags (now atomic).