ELIPS keeps an ADR log under docs/adr/. The cards below distil each record into the choice it made. They are listed roughly in the order the runtime was built.
Core ADRs
ELIPS targets C++23 to use std::span, structured bindings, designated initialisers, and concepts. The Core Guidelines are non-negotiable.
No server, no daemon. A database is a directory, a process opens it, and a file lock coordinates writers.
Hierarchical Navigable Small World offers the best recall / latency trade-off at the embedded scale ELIPS targets.
Record-framed with CRC32C. Recovery truncates at the first invalid record. Logical, not physical.
Single-writer, multi-reader. Atomic batched transactions buffer in memory and commit at once.
Lightweight, zero-overhead bindings that mirror the C++ surface 1:1 plus a typed wrapper for ergonomics.
The snapshot is the consistent baseline; the WAL is the log of mutations since. Together they make checkpoint atomic.
flock-based advisory locks. RAII-bound. No background coordination.
Payloads are typed variants, not a fixed schema. Filters operate on the same type system.
A small expression-oriented language with a lexer, parser, AST, and executor. EQL output is the same Filter / QueryPlan the SDK produces.
GPU ADRs
GPU support is Metal-first: the Metal backend is the implemented, implemented path (Beta, validated on Apple M4) on Apple silicon, CUDA and HIP/ROCm are experimental and off by default, and CPU is always available. SYCL and Vulkan backends were removed. See the GPU engine overview for the maturity table.
Backends live behind a GpuBackend abstraction, selected once at startup by BackendSelector. Metal is the implemented path; CUDA and HIP/ROCm are experimental; CPU is the universal fallback.
ELIPS ships its own distance and top-k kernels rather than depending on vendor graph libraries. Metal implements distance/top-k; richer GPU index kernels are future work.
Index build can use the GPU even when serving stays on CPU. The transfer manager handles the handoff.
A pool allocator keeps allocations stable across queries; the memory manager owns the lifetime.
QueryBatcher coalesces concurrent single-vector queries into one launch to amortise kernel overhead.
On Apple silicon ELIPS skips host↔device copies entirely — the Metal backend's main advantage.
FP32 by default; mixed precision is opt-in per index, never silent.
Backend → device → CPU. A named-but-absent backend raises BackendUnavailableError unless fallback is requested.
Reading the ADRs in the repo
The originals live under docs/adr/ on GitHub and use a consistent template — context, decision, status, consequences. They are the canonical source whenever this page summarises something.