Releases: voidwest/ember
Releases · voidwest/ember
Release list
v0.6.8 - Agentic Phase 2: multi-call steps, approval gating, trace tooling
- Multi-call steps: one assistant turn may request several tools; the loop validates, approves, executes, and reinjects them in order with limits and cancellation checked between calls. All three protocols now parse every well-formed call per step.
- Approval gating: every tool declares a risk class (ReadOnly / LocalWrite / ExternalSideEffect). The default policy denies declared external effects as structured, traced, model-visible rejections; hosts embed custom gates via
ApprovalPolicy::custom. CLI:--allow-unsafe-effects. - Trace tooling:
ember trace diff- structural comparison of two runs (status, totals, final-answer digest, event-type skeleton with first divergence;--fail-on-difffor scripting)ember trace replay- re-executes recorded deterministic tool calls offline against a fresh registry (no model loaded) and verifies stable payload digestsember trace report- self-contained HTML report: summary card, timeline bars, artifacts, full event table; inline CSS only, no JavaScript
- Replay digests: every execution records
payload_sha256plus a rerun-stablereplay_sha256under all privacy modes. - image_fixture built-in: deterministic PNG through the artifact path (
image/png), proving binary media flows end-to-end. - Docs:
docs/agent-runtime.md; README gains an agentic section.
Also fixes the last platform-dependent serialization site in protocol renders (aarch64-only serde_json preserve_order flip) and adds a source-level regression guard.
Tests: 47 lib unit + 27 hermetic integration tests; replay verified against a live Qwen2.5-1.5B run (3/3 digests match).
v0.6.7 - Agentic Phase 1: tool runtime, structured calls, research tracing
- Agentic execution layer (
ember::agent): model -> parsed structured tool call -> schema validation -> execution -> result reinjection into the same session -> continuation -> final answer, as an explicit state machine with hard limits (steps, tool calls, wall time, per-tool timeout, per-turn tokens, result bytes). - Tool runtime: JSON-Schema-compatible schemas (string/number/integer/bool/array/object/enum), strict validation collecting every violation, frozen registry with duplicate rejection, watchdog timeouts, contained panics.
- Protocol boundary: Qwen2.5
<tool_call>and Llama 3.x<|python_tag|>codecs plus a generic-JSON testing mode; renders pinned byte-exactly; broken calls reject loudly instead of silently degrading to text. One call per step (documented). - Research tracing: crash-tolerant JSONL (
ember.agent.trace.v1, monotonic sequence, torn-line tolerant), privacy knobs with documented defaults, provenance events (version/git/rustc/target/model sha256/quant/tokenizer hash/tool-schema snapshot), hashed artifact records. - Deterministic built-in tools: calculate, lookup, echo, write_artifact, fail, sandboxed read_text_file/search_text. No shell/network tools by design.
- CLI:
ember agent run,ember agent demo,ember trace inspect. - Validation: 40 lib unit tests + 19 hermetic scripted-model integration tests; real-GGUF gate executed against Llama-3.2-1B-Instruct-Q8_0 (llama3 protocol) and Qwen2.5-1.5B-Q8_0 (qwen25 protocol, 4-tool research workflow with correct arithmetic and a hashed artifact).
- Performance: orchestration overhead ~0.5-1.9 ms per mock run; tracing adds ~0.2 ms; ~16 events (~5 KB) per one-tool run.
All changes are additive: no attention/KV/tokenization/encoder/tensor code touched, zero unsafe added.
Ember v0.6.6 — multimodal patch
Multimodal patch on top of the v0.6.5 foundation: live voice conversation and Arabic speech output at reference parity.
Highlights
ember voice --converse— full model-in-the-loop conversation in one command: capture ring → energy VAD → streaming audio → VoiceSession → LLM → speech out → playback ring, with barge-in (generation-phase cancel + KV rollback, playback-phase interrupt) and a hermetically pinned transition graph.- MMS-TTS (VITS) engine in Rust (
src/tts/vits.rs) — first genuinely Arabic-capable open-weight TTS path (character vocab over raw Arabic script, no G2P). Full parity ladder vs HuggingFace reference: embeddings exact, encoder 2.5e-7 rms_rel, flow z 3.4e-7, decoder substages ≤5e-6, waveform rms_rel 8.8e-6 / cosine 0.99999999996 with exact sample counts; residual proven below torch's own f32-vs-f64 cross-precision floor. - SpeechOut seam — OuteTTS and MMS-VITS interchangeable behind one streaming API (
--vits-model); Arabic S2S integration test drives bank audio → transcript → reply → PCM against real weights. - Duplex rework: onset+endpoint survive one chunk, utterance head never lost, single validated resample path.
Fixed
- CI:
benches/multimodal_batch.rsexited 2 when run argless bycargo test --all-targets, turning the v0.6.5 release run red on both tiers; now skips silently.
Ember v0.6.2
Changed
- Q4_K/Q6_K production matmul now uses canonical transient Q8_K activation
packing and integer dots for decode and prefill. The exact-f32 dequantize/dot
implementation remains an explicit slow oracle. Non-finite activations fail
before destination mutation; warmed workspace and accumulate semantics are
explicit contracts. - Execution plans retain loader fallback provenance and identify the numerical
runtime withkernel_revision = 2while preserving offline verification and
hashes of historical revision-1 plans. Plan/dispatch disagreement is a
release-mode error, and the cache key now includes Rayon thread count. - The superseded internal K-quant modules (
k_gemv,k_prefill,
k_matmul_x86) and their ad-hoc examples/benches were replaced by
k_quant_matmul. Ember's Rust library is internal/unstable; this is an
intentional source-level break rather than compatibility shims over dead hot
paths. - The v0.4 planned-decode interpreter moved out of
src/llama.rsinto
src/planned_decode.rs(resolved ops, scratch-arena session, planned and
fused kernels,forward_last_logits_planned). Zero behavioral change;
src/llama.rskeeps the model, eager forward, dispatch, and plan
construction. The v0.5 research contract's reference to the interpreter
path was updated accordingly. - Toolchain pinned via
rust-toolchain.tomlto 1.92.0 (the declared MSRV
and CI toolchain); local builds now match CI. - Dependencies:
crossbeam-epoch0.9.18 → 0.9.20 (RUSTSEC-2026-0204),
anyhow→ 1.0.104 (RUSTSEC-2026-0190),memmap2→ 0.9.11
(RUSTSEC-2026-0186).cargo auditis now part of CI.
Added
- First-class KV-prefix snapshots for the Llama/Qwen CPU runtime through the
ember kvcommand family: deterministicember.kv-snapshot.v1artifacts,
strict integrity and compatibility checks, bit-exact same-model replay,
cache comparison and perturbation diagnostics, replay traces, and explicit
RoPE remove/reapply research utilities. The validation matrix and benchmark
evidence are recorded underartifacts/benchmark-kv-v1/2026-08-08/. - The bilingual “Road to Ember 1.0” documentation series and a substantial
native-console visual refresh, while preserving the same v0.5 experiment
execution path and offline behavior. - A pinned llama.cpp known-answer verifier for Q8_K bytes and Q4_K/Q6_K dots,
fail-closed 1B real-model scalar/x86 validation, a dedicated x86 CI gate,
adversarial kernel matrices, and schema-4 path-interleaved benchmark output
with checksums and full dispatch/workspace provenance. tests/property.rs: proptest suite (tensor shape ops vs hand-rolled
references, decode-arena disjointness/alignment/isolation, K-quant dequant
contracts) plus fuzz-style robustness tests for the untrusted-input
boundaries: the GGUF loader, the v0.5 spec parser, and the npy reader must
never panic on arbitrary input.benches/hooks_overhead.rs: planned-decode cost with a noop experiment
runner attached vs bare (Gate H evidence; measured ≈0% overhead).- Rustdoc lints (
broken_intra_doc_links,private_intra_doc_links) and a
CI docs step (RUSTDOCFLAGS=-D warnings cargo doc).
Fixed
forward_last_logits_plannedhad hard-codedExecutionMode::Planned, so
planned-fusedparity tests never executed F1-F5. It now routes the model's
actual mode; tests use execution counters. This exposed Q8_0 F5 overwriting
the residual (Q8_0 assigns rather than accumulates), so Q8_0 F5 now de-fuses
with a serialized reason while f32 and canonical K kernels execute F5.- Owned reader-backed K weights now receive the loader-resolved execution tier
at construction, matching mmap-backed weights. Loader fallback reasons and
original dtype survive model construction into execution plans. - Build provenance now exports the
EMBER_GIT_COMMITname consumed by plans,
traces, and benchmarks (plus dirty-tree status for benchmark records). tests/k_parity.rs::v04_planned_inactive_hooks_real_modelfailed on Q8_0
models: the plain run uses the v0.3 native fast path (contract D1) while
the hooked run uses the generic hooked path, so bit-exact logits were not
the right contract there (tokens always matched). The test now skips
models without K-quant tensors; all parity suites (Q8_0, Q6_K, Q4_K_M)
pass 5/5.- All 8 rustdoc warnings (math-notation brackets parsed as links,
private-item links, unclosed HTML tag in a doc comment). - Stale
#[allow(dead_code)]onKQuantWeight::try_from_mmap(the loader
calls it), on the genericLlamaMlp/Attention/Blockstructs, and dead
gemma4forward_fullpaths (test-only attention ported behind
#[cfg(test)]). // Safety:comments on the previously undocumentedunsafesites: the
matrixmultiply::sgemmcall intensor.rsand 29 SIMD kernels in
simd.rs.
Ember v0.6.1
Added
ember gui(native console): light/dark theme toggle in the header
(defaults to dark). Every color role in the console switches with the
palette, including iced widgets (inputs, combo boxes, editor, buttons)
which follow the icedTheme.
Ember v0.6.0
Added
ember gui— a native, single-window experiment console for live demos
(v0.6): an iced app on the tiny-skia software renderer (no GPU or
webview dependency) with embedded Noto fonts (src/gui_fonts/) for
offline Latin + Arabic coverage, dark console theme.ember web-gui— an offline, single-page browser console for live demos
(v0.6). A thin presentation layer over the existing v0.5 pipeline: the
page translates every action into anember.experiment.v1specification,
validates it through the standardRawExperimentSpec::resolve()gate, and
executes it with the sameprepare_run/execute_preparedcode as
ember experiment run. One resident model session serves repeated
baseline / intervention / restore runs, so the demo loop never reloads the
model. Bundles are written and self-verified exactly as in v0.5; the
restore-original leg reports a bit-exact match against the baseline.
Light/dark theme toggle (defaults to the system preference, persisted in
localStorage). Seedocs/v06-gui.md.src/gui_native.rs: the native console — sameGuiSessioncore and
parse_run_requestgate as the browser console, runs executed in a
worker thread so the UI never blocks.src/gui.rs+src/gui_page.html: tiny embedded HTTP server (tiny_http,
localhost only) and a self-contained page (no web framework, no external
assets) with Arabic/RTL rendering via the browser (dir="auto"per field;
the UI itself stays LTR).cli_experiment::prepare_run/execute_prepared: the v0.5 run path was
split into a reusable model-load step and an execute step so a loaded
model can be kept resident.ember experiment runbehavior is unchanged
(it calls both in sequence).
Ember v0.5.1
Patch release on top of v0.5.0 (CI-green on the pinned Rust 1.92 toolchain).
Fixed
- CI clippy on Rust 1.92:
src/v05/testutil.rshad a file-level
#![cfg(test)]alongside the#[cfg(test)]module gate inmod.rs;
rustc 1.92 rejects the duplicated attribute. Verified locally with
cargo +1.92.0 clippy -- -D warningsandcargo +1.92.0 test --all-targets(237 + 19 + 46 + 5 tests green). - Docs:
docs/usage.mdrepointed the v0.2 activation-artifact schema
reference fromdocs/experiments.md(now the v0.5 doc) to
activation-artifacts.md/activation-patching.md.
Added
- Recorded capture-from-bundle real-model workflow (Gate D evidence)
on Llama-3.2-1B-Instruct-Q8_0: baseline captures prompt-final
attention-outputacross all layers; a second run replaces layer 8's
row with the baseline bundle's layer-3 row; a third run adds
restore-original. Results: layers 0-8 bit-exact, 9-15 diverge;
restoration reproduces the baseline with all 16 capture layers exact
and outputs equal. Specs/hashes under
artifacts/benchmark-v05/capture-from-bundle/, commands in
docs/interventions.md. - Refreshed Gate H matrix with the release binary: ordinary runs
2.58 s / 2,751,028 kB RSS vs 2.61 s / 2,751,024 kB with experiment
machinery unused; experiment workloads +2.2% RSS (gate ≤3%).
Binaries: build from source (cargo build --release); no model files
are distributed.