geist v0.3.0
First release with the agent/CLI layer on top of the inference core. Everything since v0.2.1 is additive — no change to the STABLE include/geist.h ABI.
Highlights
Agent & CLI layer (header-only under tools/, links libgeist.a)
agent.h— a bounded, whitelist-gated tool-use loop over a resident session. The host, not the model, decides what runs: a request can only act through a fixed tool whitelist, capped bymax_steps.agent_main.h+geist_agent— a reusable CLI engine; a downstream app is ~15 lines (define tools + a system prompt, forward argv). One-shot or REPL.geist_chat— interactive multi-turn chat + a markdown "memory palace" (mind.h): notes as files + an in-contextINDEX.md, no DB/embeddings.- Tools:
doc_search(paragraph-granular, overlap-scored local RAG over a folder) andweb_fetch(curl, no-shell fork+execvp, scheme gate + host allowlist + --proto redirect lock).
Quality benchmark
- Cross-engine MMLU vs llama.cpp on identical weights: geist 52.8% vs 54.0% (Gemma 4 E2B Q4_K, 5-shot) — iso-quality. matplotlib reporting from result JSON.
CI hardening
- Integration + e2e tests now run against the real model (cached) — the product path is gated, not just unit tests.
- ASan + UBSan job; ccache across build jobs.
Binaries
Attached by CI: a fully static, dependency-free geist-linux-arm64 (musl) and geist-macos-arm64. See docs/agent.md and docs/DEPLOY.md.