Move creation ownership from startup reconciliation to an additive provider-aware migration. Preserve legacy decisions during downgrade and add the previously missing MariaDB table path.
2.7 KiB
JT-019 schema ownership — first migration-backed transfer
Scope
This increment establishes a behaviour-preserving ownership boundary and moves one independent table. It does not attempt to delete the legacy reconciler wholesale.
Implemented
- Added
StartupSchemaOwnership, classifying all 49 EF model tables into disjoint migration-owned and reconciler-owned creation sets. - Added a regression that fails when a model table is unclassified, multiply classified, or when a compatibility bootstrap is incorrectly treated as migration ownership.
- Added
20260830120000_AdoptSystemEmailSettingsSchema, with provider-aware additive DDL for SQLite and MariaDB/MySQL. - Removed the MariaDB startup
CREATE TABLEblock forSystemEmailSettingsand moved the table to the migration-owned set. - Added
20260830121000_AdoptUserRuleSettingsSchemaand removed both provider startup-create paths for the independent per-user rule-settings table. - Added
20260830122000_AdoptGmailReviewDecisionsSchema, removed the SQLite startup-create path, and supplied the previously absent MariaDB table definition. - Corrected the ownership runbook: new tables now default to migrations; the reconciler is legacy compatibility code to retire one dependency group at a time.
Data compatibility
The migration uses CREATE TABLE IF NOT EXISTS. Existing MariaDB installations keep their table and
rows; SQLite installations that never received the reconciler-only table now receive it. Down is
intentionally non-destructive because it cannot determine whether the existing table predates this
migration.
Proof
- Ownership and migration-chain focused suite: 6/6 passed.
- Blank SQLite chain applies all migrations twice and creates all ten expected
SystemEmailSettingscolumns. - A database stopped immediately before the adoption migration, seeded with a representative SMTP settings row, upgrades without changing that row.
- A representative per-user rules row survives adoption, downgrade, and re-upgrade.
- A representative Gmail review decision survives adoption, downgrade, and re-upgrade.
- Generated MariaDB SQL contains the provider-correct
SystemEmailSettingsDDL. - Full backend: 724/724 passed after all three leaf-table transfers.
- Fresh application startup over a new disposable SQLite database applied
20260830120000_AdoptSystemEmailSettingsSchemaand reached the healthy listening state.
Remaining JT-019 work
Thirty-two model tables remain startup-created, including the Identity group and several tables with parent dependencies. Transfer them in small dependency-aware migrations with blank, populated, retry and MariaDB runtime proof. Column/index repairs must remain until historical upgrade fixtures prove each one redundant.