COOLJAPAN
← All posts

OxiZ 0.3.1 Released — Wide Bit-Vectors Stop Lying, MBQI Reaches Completeness, and 168/168 Correct on the Z3 Parity Suite

OxiZ 0.3.1 is a soundness-and-honesty release: five reported GitHub issues plus 40+ bugs of the same silently-wrong-answer shape are fixed, wide (>64-bit) bit-vectors are now exact via BigUint, and MBQI completeness brings the Z3 differential parity suite to 168/168 Correct, 0 Wrong. 9,668 tests passing. Pure Rust, Apache-2.0.

release oxiz smt-solver z3 formal-verification pure-rust bit-vector soundness

A model that says x = 0 when the formula demands x = 2^64 isn’t an edge case — it’s the solver lying about the one thing it exists to get right.

Today we released OxiZ 0.3.1 — a soundness-and-honesty release that started as a sweep of five reported GitHub issues and became a workspace-wide hunt for one recurring bug shape: an input the code didn’t handle, silently dropped or defaulted instead of raising an error. Confirmed at release time: 9,668 tests passing, 8 skipped, plus 110 doc-tests, all --all-features, clippy/rustdoc -D warnings clean.

No C. No C++. No Fortran. OxiZ reimplements Z3 entirely in Rust — the SAT core, theory solvers, quantifier instantiation, optimization, and proof system are all memory-safe Rust you can read end to end. 0.3.1 turns that same read-it-end-to-end property into an audit tool: every silent-wrong-answer bug in this release was found by grepping the codebase for a shape — a catch-all match, a fallible conversion with a silent default, a guard that skipped a write — not by chasing one specific symptom.

Why OxiZ 0.3.1 is a game changer

Before this release, OxiZ could be confidently, silently wrong in ways that never showed up as a crash:

0.3.1 ends all of that:

This is not a blanket “100% Z3 compatibility” claim — it’s 100% of this differential parity suite, measured under a comparator that refuses to score Unknown as agreement. TODO.md itemizes every remaining gap.

Technical Deep Dive: how the wrong answers were found and fixed

Wide bit-vector correctness (oxiz-theories/src/bv/solver.rs, oxiz-solver/src/solver/theory_bv_encode.rs, theory_manager.rs, model_builder.rs). Three independent code paths for values above 64 bits — constant assertion, EUF congruence keying, and model read-out — each keyed or truncated on the low 64 bits alone. All three now carry or read every limb of the value, via assert_const_limbs/assert_const_big and BvSolver::get_value_big.

Recursion, depth and resource hardening (~400 sites). Every remaining unguarded recursive term walk — parsers, printers, the model evaluator, substitution, and the derived Drop/Clone/PartialEq implementations on deep public enums that never appear in a backtrace — is now an explicit heap stack. The SMT-LIB term parser is fully iterative, with its old recursion-depth constant repurposed as an honest resource bound.

MBQI completeness mechanisms (oxiz-solver/src/solver/encode/finite_expand.rs, encode/exists_skolem.rs, mbqi/model_certify/). A bounded integer quantifier is expanded into the finite conjunction/disjunction it actually is; a positive-polarity existential is Skolemized so the ground solver searches for the witness instead of MBQI guessing it; and certify answers sat only after building a concrete, total interpretation of every symbol the goal mentions and checking every assertion true under it.

Repeated-(check-sat) fixes. Hyper-binary-resolution clauses now register in the learned and assertion ledgers instead of going invisible to pop; Solver::pop retracts Tseitin-memo entries per-entry through the undo journal rather than clearing the whole memo (the fix for the 25→361-clause leak above); MBQI search state is checkpointed and restored around each check; and the new verdict cache short-circuits the common unchanged-goal case entirely.

Getting Started

Add OxiZ to your project:

cargo add oxiz

The wide bit-vector fix, demonstrated — this query was silently sat before 0.3.1:

use oxiz_solver::Context;

let mut ctx = Context::new();
let output = ctx.execute_script(r#"
    (set-logic QF_BV)
    (declare-const x (_ BitVec 128))
    (assert (= x (_ bv18446744073709551616 128))) ; 2^64
    (assert (bvult x (_ bv1 128)))
    (check-sat)
"#).expect("script should parse and run");

assert_eq!(output[0], "unsat");
// Before 0.3.1, truncating to the low 64 bits encoded x as 0,
// and 0 <u 1 is true — a spurious `sat` on an unsatisfiable query.

Feature flags are unchanged from previous releases: nlsat for nonlinear arithmetic, optimization for MaxSMT/OMT, spacer for CHC model checking, proof for DRAT/Alethe/LFSC export, full for everything.

What’s New in 0.3.1

Breaking

Fixed

Added

Changed

Full itemized detail, crate by crate, is in the CHANGELOG.

Tips

This is the foundation

OxiZ is the formal-reasoning backbone of the COOLJAPAN ecosystem. OxiLean uses it as its SMT proof backend; OxiRS leans on it for validation; Legalis-RS uses it for legal formal verification, and OxigenAI builds on Legalis-RS and OxiZ together. OxiCAD, OxiCar, OxiEDA, OxiAutoRS, OxiMed, and OxiQuant all depend on oxiz-core/oxiz-solver/oxiz-proof for constraint solving. Underneath, OxiZ relies on pure-Rust OxiARC for compression. The whole stack is C/C++/Fortran-free — sovereign from the SAT core all the way up to the application.

Repository: https://github.com/cool-japan/oxiz

Star the repo if you want an SMT solver whose bit-vectors don’t quietly lose bits past 64 — and that tells you Unknown rather than guessing.

Pure Rust formal reasoning is here — audited, honest, and sovereign.

KitaSan at COOLJAPAN OÜ July 31, 2026

↑ Back to all posts