Move interview preparation and AI workspace output persistence into an additive provider-aware migration. Preserve reviewed results, uniqueness, and application cascade semantics.
4.7 KiB
JT-019 schema ownership — incremental migration transfers
Scope
This work establishes a behaviour-preserving ownership boundary and moves small independent or cohesive table groups. 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. - Added
20260830123000_AdoptAuthenticationSupportSchemafor recovery codes, trusted devices, and revocable user sessions; both provider startup-create paths are removed while guarded MariaDB repair checks remain for historical schemas. - Added
20260830124000_AdoptEmailConnectionSchemafor Gmail, Microsoft Graph, and IMAP connection records. Encrypted credentials and sync state are retained; scoped Gmail column repair and guarded MariaDB index/identity repair remain for historical installations. - Added
20260830125000_AdoptCvExtractionSchemafor upload artifacts and extraction runs, retaining parsed output and the nullableON DELETE SET NULLartifact relationship. - Added
20260830126000_AdoptTailoredCvDraftSchemafor the job-specific tailored document, retaining generated and manually edited content plus itsON DELETE CASCADEapplication relationship. - Added
20260830127000_AdoptJobWorkspaceNotesSchemafor interview preparation and irregular AI workspace results, retaining reviewed output and both application cascade relationships. - 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.
- Representative recovery-code, trusted-device, and user-session rows survive adoption, downgrade, and re-upgrade, and their indexes are present afterwards.
- Representative encrypted credentials for all three email providers survive adoption, downgrade, and re-upgrade, and all five expected provider indexes are present afterwards.
- Representative CV artifact metadata and structured extraction output survive adoption, downgrade, and re-upgrade; deleting the artifact preserves the run and clears its nullable relationship.
- A representative tailored CV's summary, custom section, and generation context survive adoption, downgrade, and re-upgrade; deleting the parent application still deletes its draft.
- Representative interview-preparation and candidate-fit outputs survive adoption, downgrade, and re-upgrade; deleting the parent application still deletes both cached note types.
- Generated MariaDB SQL contains the provider-correct
SystemEmailSettingsDDL. - Full backend: 729/729 passed after the job-workspace note transfer.
- Fresh application startup over a new disposable SQLite database applied
20260830120000_AdoptSystemEmailSettingsSchemaand reached the healthy listening state.
Remaining JT-019 work
Twenty-one 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.