# MariaDB standardisation and RD21 qualification — 24 October 2026 RD21 is **resolved within the qualified MariaDB 12.2.2 save/concurrency scope**. The pinned official Linux/amd64 image passes the actual Docker Compose persistence lane and a native browser/API recovery journey with independent SQL reads. This supersedes the earlier addendum's missing-MariaDB blocker; it does not reaccept all of Phase 9 or authorize release. Baseline: `0d16a691e0249fe1264bf960de5e59eaa9b87fed`. Implementation checkpoint: `a2c9bda` on `codex/rd21-mariadb-standardisation`. Main stays `5f835e54a9b74e6b71418422e28431b2af06453f`. Raw runtime timestamps are UTC on 23 October; the owner's local report date is 24 October. See [machine-readable validation](validation.json), [setup](README.md), and [runtime provenance](runtime-provenance.json). ## Separate decisions | Gate | Verdict | Evidence or remaining blocker | | --- | --- | --- | | MariaDB 12.2.2 RD21 qualification | **PASS, bounded resolution** | 32 real-provider cases and one native browser journey; durable SQL state, transactions, rejected drafts, revision conflicts, recovery and tenant isolation. No production image equality claim. | | MariaDB local development | **READY** | Pinned Compose image, healthy loopback service, separate persistent development volume, API startup applies 51 migrations; synthetic company survives database stop/start. | | MariaDB CI/integration tests | **LOCAL READY; HOSTED UNVERIFIED** | Same fail-closed runner passes 32/32 using Docker, locked restore, isolated tmpfs and generated schemas. Workflow added; no successful hosted run claimed. Runner must provide Docker/Compose and .NET 9.0.317. | | Historical fixture repairs | **PASS** | Three obsolete revision fixtures corrected without weakening assertions: diagnostics 18/18, volume 3/3. Stale writes now assert 409 and preservation of the winner/source/history. | | SQLite retirement | **PLAN READY; REMOVAL NO-GO** | Complete baseline classification; defaults corrected. Remaining legacy coverage, full-fidelity transfer and preservation/restore gates must precede package/branch removal. | | MariaDB 12.3 LTS migration | **INVESTIGATION READY; MIGRATION NO-GO** | Separate 12.3.3 rehearsal proposed; target image/driver certification, copied-data upgrade, backup/restore and rollback-after-writes remain untested. | | Phase 9 reacceptance | **NO-GO** | RD21's provider blocker closes; wider manual/device/provider/security/output/release qualifications remain. Preservation remains 57 groups/33 routes, 56 PARTIAL and C11 DEFERRED. | | Phase 10 readiness | **NO-GO** | Phase 9 not fully reaccepted; implementation explicitly prohibited. | | Production readiness | **NO-GO** | No production qualification, infrastructure/backup-restore/release acceptance, deployed identity verification or reviewed pinning change. No production operation performed. | ## Verified scope and accounting | Lane | Final distinct results | Limits | | --- | --- | --- | | Existing backend Release | 1,123 passed, 0 failed/skipped | Includes 14 configuration cases; retained SQLite/InMemory contracts do not count as MariaDB qualification. | | MariaDB Docker Compose Release | 32 passed, 0 failed/skipped | Exact official 12.2.2 image; repeated run after bridge-network cleanup fix also passes. Repeats are not added to the count. | | Native MariaDB browser | 1 passed | Real API, Chromium and SQL client against the same pinned Docker image; controlled network failure, not power-loss testing. | | Corrected diagnostics | 18 passed | Explicit temporary SQLite browser lane; includes data/sustained fixtures. | | Corrected volume fixtures | 3 passed | Explicit temporary SQLite lane; separate configuration. | | Disposable-runner guards | 5 passed | Offline subprocess doubles, including setup/cleanup failure; not database proof. | | Browser connection guards | 10 passed | Duplicate/alias keys, remote/existing schema and port mismatches rejected. | | Static checks | Passed | Full frontend typecheck/lint and targeted browser/config TypeScript compilation. | The initial real-server run failed: startup omitted three Identity columns. After schema repair, the writer-lock test exposed dirty tracked entities when Pomelo wrapped error 1205 in `InvalidOperationException`. Both defects were repaired and covered by real-provider assertions. The browser then exposed an untranslatable import-history ordering query; ordering/limiting the tenant-filtered entities before DTO projection repairs the MariaDB path. A later browser failure used a stale Release binary after a Debug-only rebuild; the Release suite was rebuilt and the final browser rerun passed, including import-history HTTP 200. These failures remain recorded in validation. The final 32 cases exercise Career Profile and Job saves, stale revision rejection, missing/legacy revision handling, atomic projection/history/job/event updates, independent reads after commits, controlled concurrent writes and lock timeout recovery, repeated/populated startup, additive RD21 migration preservation and tenant isolation. They use actual InnoDB persistence with independent TCP connections. Identity/summarizer doubles in controller fixtures do not replace database behavior; the separate browser uses the real hosted API. They do not certify every application query or historically restore data already overwritten before RD21. Existing creation/idempotency and unrelated Phase 9 reliability qualifications remain outside this bounded repair. Production's owner-reported server is `12.2.2-MariaDB-ubu2404`, but its reported configuration ID differs from the verified official image config. Version parity is established; exact production image/configuration/environment parity is not. The [image record](image-provenance.json) distinguishes manifest and config digests. Locked provider versions are Pomelo 9.0.0, EF Core 9.0.14 and MySqlConnector 2.4.0. Real 12.2.2 results establish this application's tested compatibility, despite Pomelo's published older tested-server matrix; they do not certify 12.3. ## Preservation, review and operational limits The [SQLite audit](SQLITE_AUDIT.md) classifies 1,602 baseline references in 415 tracked files: 1,169 required historical/preservation references, 420 temporary transition references and 13 obsolete defaults/guidance references. The obsolete active defaults/guidance were corrected; SQLite dependencies, compatibility branches, historical migrations and user data remain preserved. The three fixture changes have exact before/after deltas in [fixture-delta.json](fixture-delta.json). Previous acceptance counts and reports remain historical, not silently rewritten. Independent review found and verified fixes for duplicate connection keys bypassing the browser's database guard, server reuse and missing actual version verification. The generated test service now uses the existing bridge network, avoiding leaked per-run networks. Final review has no further actionable findings. Docker's local stale socket issue was also resolved without resetting Docker or deleting its persistent data; see [local recovery](DOCKER_LOCAL_RECOVERY.md). The intended final architecture is **MariaDB only** for application development, integration, CI and production. Keep 12.2.2 pinned for the present qualification; rehearse the supported 12.3 LTS path separately using [the migration gates](MARIADB_12_3_PLAN.md). Retire SQLite in the documented stages after equivalent coverage and verified preservation, not by deleting existing databases. No main merge, deployment, production connection/container change or Phase 10 implementation occurred.