Beta Past initial proving, but the Python API surface may still shift before 1.0. WiredTiger on-disk format is stable, but there's no migration tool yet — don't put production data here.

The errors are the feature

26 September 2026 · Joe Drumgoole · Releases

Summary: The errors are the feature (v0.6.0b17).

For three weeks the work was almost entirely about what SecantusDB says when something is wrong. Rejecting a malformed command is easy; rejecting it the way mongod does — same code, same message, validated in the same order, so a driver's own error handling behaves identically — is what makes a surrogate usable rather than merely available. Three hundred and forty-one slices landed in this release, and the largest group of them move an error from "generic" to "mongod's".

Fourteen were worse than a wrong message. A null argument to createIndexes, malformed cursor arguments, non-numeric input to $stdDevPop, a NaN in $expr, an integer overflow in the update path — these crashed the server rather than raising. They are fixed, and the wrong-type sweep across the command surface now reports zero divergences. A crash is not a bad error message; it is the absence of one, and in a database it takes the connection with it.

The Rust PostgreSQL server grew up over the same period — client_encoding, composite types over the binary wire, column precision and scale, backend termination and cancellation, two-phase commit — and a column-level UNIQUE that had been accepted and then silently not enforced, which is data corruption rather than a missing feature. Both Rust binaries now stamp the git tree they were built from and report it in --version, because an artifact older than the tree it is tested against produces failures that look like somebody else's regression, and the evidence is never in the diff.

The binaries themselves were the last thing to get that treatment, and they needed it. Both published macOS archives linked liblz4 by its absolute Homebrew path and would not launch on a Mac that did not happen to have Homebrew lz4 installed there; the Linux archives wanted liblz4.so.1 and libz.so.1 from the host, which a slim container image often does not carry. Both are fixed — every archive now links only its platform's own C runtime — but the more useful change is that the release no longer takes anyone's word for it. Before an archive is packaged, the workflow reads the binary's real dependency table (Mach-O load commands, ELF DT_NEEDED, or the PE import directory) and refuses to publish one that reaches outside a per-platform allowlist. The macOS bug had survived every build, test and smoke run for two releases because the machine that builds the artifact is the one machine where it works.

Full release notes on GitHub · Install from PyPI · Tag