Cross-Driver Conformance Summary¶
Generated 2026-10-15 — SecantusDB 0.7.0b3. Each per-driver gauge runs the driver vendor’s own integration test suite (unmodified) against a SecantusDB daemon and emits its raw output to .validation/. This summary normalises on test count so the 13 gauges compare like for like — every row counts one assertion outcome, whether it landed as a JUnit <testcase>, a Mocha test, an RSpec example, a go test event, or a pytest collected item.
Failures split into two columns: Failed counts tests that actually need a fix on SecantusDB; Expected counts tests with a documented reason for failing (driver-side cascade, out-of-scope feature, single-node-topology assumption, known intermittent flake). The expected list lives in validation_summary/expected_failures.py and each entry carries a rationale. Adjusted pass rate = passes ÷ (passes + actual failures).
Summary by driver¶
Driver |
Language |
Driver version |
Tests run |
Passed |
Failed |
Expected |
Skipped |
Pass rate |
Adjusted |
|---|---|---|---|---|---|---|---|---|---|
|
Python |
|
1501 |
1206 |
0 |
5 |
290 |
99.5% |
100.0% |
|
Python |
|
1423 |
1111 |
0 |
6 |
306 |
99.4% |
100.0% |
|
Java |
|
900 |
496 |
0 |
0 |
404 |
100.0% |
100.0% |
|
Kotlin |
|
538 |
340 |
0 |
0 |
198 |
100.0% |
100.0% |
|
Go |
|
659 |
598 |
12 |
0 |
49 |
98.0% |
98.0% |
|
Node.js |
|
364 |
357 |
0 |
1 |
6 |
99.7% |
100.0% |
|
Ruby |
|
283 |
258 |
0 |
1 |
24 |
99.6% |
100.0% |
|
Rust |
|
105 |
104 |
1 |
0 |
0 |
99.0% |
99.0% |
|
PHP |
|
2221 |
2197 |
1 |
0 |
23 |
99.9% |
99.9% |
|
PHP |
|
271 |
254 |
0 |
0 |
17 |
100.0% |
100.0% |
|
C |
|
841 |
790 |
1 |
2 |
48 |
99.6% |
99.8% |
|
C++ |
|
901 |
892 |
0 |
0 |
9 |
100.0% |
100.0% |
|
C# |
|
228 |
228 |
0 |
0 |
0 |
100.0% |
100.0% |
All drivers |
— |
— |
10235 |
8831 |
15 |
15 |
1374 |
99.6% |
99.8% |
Per-driver scope¶
pymongo— curated server-touching pytest paths under vendor/pymongo-tests/test/.pymongo (async)— AsyncMongoClient suite under vendor/pymongo-tests/test/asynchronous/.mongo-java-driver— driver-sync functional integration tests.mongo-kotlin-driver— driver-kotlin-sync integrationTest (ships in the mongo-java-driver monorepo).mongo-go-driver— vendor/mongo-go-driver/internal/integration/….mongo-node-driver— curated test/integration/ spec set.mongo-ruby-driver— curated spec/mongo/*.rb spec files.mongo-rust-driver— curated driver/src/test/ in-tree tests.mongo-php-library— curated functional tests (Operation / Collection / Database / Command).mongo-php-driver— curated .phpt wire-protocol tests (bson serialization units excluded).mongo-c-driver— curated test-libmongoc wire-protocol suites (CRUD / cursor / aggregate / command).mongo-cxx-driver— curated mongocxx test_driver Catch2 suite (CRUD / cursor / aggregate / gridfs).mongo-csharp-driver— curated MongoDB.Driver.Tests CRUD specification suite (xUnit).
Expected failures¶
These tests fail for documented reasons that have no SecantusDB-side fix (driver-internal behaviour we can’t influence, features intentionally out of scope, single-node topology assumptions in tests that assume a 3-node replica set, etc.). Each entry has a rationale in validation_summary/expected_failures.py. If you fix one of these gaps, delete its entry there.
pymongo (5)¶
vendor/pymongo-tests/test/test_collection.py::TestCollection::test_index_hashed — Hashed indexes are intentionally out of scope per CLAUDE.md.
createIndexesrejects them explicitly withCannotCreateIndex(67) ‘hashed indexes are not supported by SecantusDB’ — a faithful not-supported error, which is the documented preference over a half-implemented index type.vendor/pymongo-tests/test/test_collection.py::TestCollection::test_index_text — Text indexes are intentionally out of scope per CLAUDE.md (same gap as the node gauge’s text-search test).
createIndexesrejects them withCannotCreateIndex(67) ‘text indexes are not supported by SecantusDB’.vendor/pymongo-tests/test/test_cursor.py::TestCursor::test_maxtime_ms_message — Blocked by
$where, not by the behaviour under test. The test builds a deliberately slow query withfind({'$where': delay(...)})and asserts the resulting timeout error names the configured timeouts. SecantusDB rejects$whereup front (BadValue 2), so the command fails before any timeout can elapse. NOTE: this leaves the maxTimeMS error-message shape unverified by this gauge rather than known-good — it is untested here, not proven correct.vendor/pymongo-tests/test/test_cursor.py::TestCursor::test_to_list_csot_applied — Blocked by
$where, same astest_maxtime_ms_message: the test delays the query withfind({'$where': delay(1)})and asserts the raised error carries.timeout == True.$whereis rejected up front, so the error is a BadValue rather than a timeout. NOTE: CSOT behaviour is therefore unverified by this gauge, not confirmed.vendor/pymongo-tests/test/test_cursor.py::TestCursor::test_where —
$whereruns server-side JavaScript and SecantusDB ships no JS runtime, so it is rejected withBadValue(2) ‘unsupported top-level operator: $where’. Out of scope per tasks/backlog.md §4 — supporting it would mean embedding a JS engine as mongod does.
pymongo (async) (6)¶
vendor/pymongo-tests/test/asynchronous/test_collection.py::AsyncTestCollection::test_index_hashed — Hashed indexes are intentionally out of scope per CLAUDE.md.
createIndexesrejects them explicitly withCannotCreateIndex(67) ‘hashed indexes are not supported by SecantusDB’ — a faithful not-supported error, which is the documented preference over a half-implemented index type.vendor/pymongo-tests/test/asynchronous/test_collection.py::AsyncTestCollection::test_index_text — Text indexes are intentionally out of scope per CLAUDE.md (same gap as the node gauge’s text-search test).
createIndexesrejects them withCannotCreateIndex(67) ‘text indexes are not supported by SecantusDB’.vendor/pymongo-tests/test/asynchronous/test_cursor.py::TestCursor::test_maxtime_ms_message — Blocked by
$where, not by the behaviour under test. The test builds a deliberately slow query withfind({'$where': delay(...)})and asserts the resulting timeout error names the configured timeouts. SecantusDB rejects$whereup front (BadValue 2), so the command fails before any timeout can elapse. NOTE: this leaves the maxTimeMS error-message shape unverified by this gauge rather than known-good — it is untested here, not proven correct.vendor/pymongo-tests/test/asynchronous/test_cursor.py::TestCursor::test_to_list_csot_applied — Blocked by
$where, same astest_maxtime_ms_message: the test delays the query withfind({'$where': delay(1)})and asserts the raised error carries.timeout == True.$whereis rejected up front, so the error is a BadValue rather than a timeout. NOTE: CSOT behaviour is therefore unverified by this gauge, not confirmed.vendor/pymongo-tests/test/asynchronous/test_cursor.py::TestCursor::test_where —
$whereruns server-side JavaScript and SecantusDB ships no JS runtime, so it is rejected withBadValue(2) ‘unsupported top-level operator: $where’. Out of scope per tasks/backlog.md §4 — supporting it would mean embedding a JS engine as mongod does.vendor/pymongo-tests/test/asynchronous/test_read_preferences.py::TestMongosAndReadPreference::test_read_preference_hedge_deprecated — Async-only, and never reaches the wire: the test constructs
PrimaryPreferred(hedge={'enabled': True})and asserts aDeprecationWarningis raised by the driver’s own constructor. Purely client-side pymongo behaviour, dependent on the ambient warning filters — no server can influence the outcome.
mongo-node-driver (1)¶
Find should correctly sort using text search in find — Text indexes (
$text,$meta: textScore, text-index creation) are intentionally out of scope per CLAUDE.md — would require a full-text index implementation. Documented in tasks/backlog.md §4.
mongo-ruby-driver (1)¶
Mongo::Collection#create when the collection has options when the collection has a write concern when write concern passed in as an option applies the write concern passed in as an option — The test passes
w: 2and expects success — it assumes the canonical multi-node replica-set test cluster the Ruby driver’s own CI runs against. SecantusDB advertises as a single-node replica set, sow: 2returnsCannotSatisfyWriteConcern(the correct mongod emulation). Documented in tasks/backlog.md §5.
mongo-c-driver (2)¶
/Client/ipv6/single — Requires an IPv6 listener (
MONGOC_TEST_IPV6); the gauge daemon binds IPv4127.0.0.1only. Environment-specific, not a protocol gap./Client/ipv6/single — Requires an IPv6 listener (
MONGOC_TEST_IPV6); the gauge daemon binds IPv4127.0.0.1only. Environment-specific, not a protocol gap.
Per-driver reports¶
Each gauge ships its own detailed report — per-category breakdown, named failures for triage, and the gauge’s own setup notes. Open the one whose pass / fail counts you want to dig into:
Refreshing¶
Run all 13 gauges plus this summary:
uv run python -m invoke validate-all
uv run python -m invoke validate-summary
Run a single gauge (still updates that one report) plus the summary:
uv run python -m invoke validate-java # or validate / validate-go / etc.
uv run python -m invoke validate-summary
The summary reads whatever is currently in .validation/; a gauge that’s never been run is silently omitted from the table.