v0.4.0b2: SecantusDB enters beta
Summary: SecantusDB graduates from alpha to beta. The pymongo conformance gauge sits at 100.0%, the cross-driver matrix now covers 15 features across mongosh, Go, Node, and Java, and the functional surface has filled in enough — real session tracking, multikey indexes, custom and cluster role bundles, noop oplog heartbeats, malformed-BSON wire robustness, an admin UI building out — that "alpha" no longer described it honestly.
Why beta now. The pymongo gauge is at 100.0%. Every feature that has shipped has cross-driver smoke coverage in the matrix — sessions, cluster roles, custom roles, change streams, indexing, aggregation, geo, all of it — so we're no longer relying on a single driver as the conformance proof. The functional surface that justifies the promotion: real session tracking (server-side lsid lifecycle, not stubs); multikey indexes (array values get one entry per element, queries against array fields hit the index instead of falling back to a scan); custom roles and the cluster role bundles (clusterMonitor, clusterAdmin, backup, restore); noop oplog heartbeats so quiet change-stream resume tokens don't fall outside oplog retention; malformed-BSON wire robustness so a bad request body returns a structured BadValue reply instead of dropping the connection; and an admin UI that's now building out connections and cursors pages. None of that's experimental anymore.
What "beta" means here. Past initial proving — the surface is stable enough that a pymongo client can't tell SecantusDB apart from mongod for the operations it supports. Not yet API-frozen — the Python embedding API (SecantusDBServer(...) constructor, the Storage config knobs, the change-stream tailable hooks) may still shift before 1.0. The on-disk WiredTiger schema is stable, but there's no migration tool yet, so don't put production data in a SecantusDB instance and expect a smooth upgrade path across releases. Beta means "use it for tests and dev with confidence; treat the stored bytes as ephemeral until 1.0."
This release also bundles: noop oplog heartbeats are now opt-in via Storage(noop_heartbeat_seconds=N) — op: "n" rows advance cluster time so long-quiet change streams keep their resume tokens within the oplog retention window. The release-prepare task now tolerates the version-already-bumped-on-HEAD case so parallel-session merges that bump the version first don't break the release pipeline. Admin UI slice 8 ships the /connections and /cursors pages with a kill-cursors confirm modal. CI is now green across all eight (Python × OS) job combinations after three rounds of parallel-session lint cleanup.