Skip to content

Plan Datenbasis

MadGapun edited this page Jul 3, 2026 · 6 revisions

Plan A — Datenbasis & Persistenz

Issue-Level-Detail zu Cluster A aus dem Master-Plan. Stand: 2026-07-02 (v1.7.3 Stable) · Schema v48.

Status-Zusammenfassung

Die historischen Positionen aus dem Master-Plan-Cluster A sind ✅. Schema-Migration ist ALTER-only-Disziplin (siehe R5). Offen: nur noch A18 (Timestamp-Umbau, DB-Teil). A19 (#738) seit v1.7.3 ✅, A20 (#742) seit v1.7.5 ✅.

A19 — Fresh-Install-Schema-Parity-Test (#738) — ✅ (v1.7.3)

Sicherheitsnetz gegen die #737-Fehlerklasse (Spalte per Migration angelegt, aber nicht im CREATE TABLE gespiegelt → Fresh-Installs crashen). Zwei komplementaere Tests in tests/test_schema_parity_738.py:

Sub Test Ansatz
A19.1 test_fresh_schema_enthaelt_alle_migrations_spalten Doppel-Migrations-Trick: frische DB → PRAGMA table_info-Snapshot → _migrate(1, SCHEMA_VERSION) idempotent drueberlaufen lassen → Diff muss leer sein. Deckt die komplette Kette v1→aktuell ohne Fixture ab
A19.2 test_migrierte_v31_db_ist_spaltenidentisch_zu_fresh_install v31-Fixture aus der Migrations-Generalprobe (#705) hochziehen vs. Fresh-Install, Spaltensets pro Tabelle zweiseitig vergleichen — faengt auch die Gegenrichtung (Spalte nur in SCHEMA_SQL, kein Migrationspfad)
A19.3 Selbsttest: kuenstlich aus SCHEMA_SQL entfernte Spalte (Sentinel dismiss_reasons.is_active) wird nachweislich als Drift erkannt

Fund beim Einbau (2026-07-02): Der Parity-Test deckte sofort die #737-RESTLUECKE auf — das echte v1.6.10-SCHEMA_SQL (via Git-Historie verifiziert) enthielt applications.is_imported NICHT. v1.6.x-Fresh-Install-Upgrader starteten mit schema_version 31, die v22-Migration lief nie mehr, der Statistik-Tab crashte trotz v1.7.1-Hotfix weiter. Fix: idempotentes is_imported-Safety-Net in initialize() (Muster is_pinned). Die #705-Fixture wurde dabei originalgetreu zum echten v1.6.10-Schema korrigiert (blacklist.reason, dismiss_reasons.id/usage_count, application_meetings-Spalten, scoring_config.id; profile_settings entfernt). Tests: tests/test_schema_parity_738.py (4 Tests).

A20 — Umlaut-Restaurierung Altbestand (#742) — ✅ (v1.7.5)

Profil-/Projekttexte aus der Fruehzeit enthalten ASCII-Umschreibungen (Mehrjaehrige, Oekosystem, fuer). Kuratierte Wortlisten-Korrektur mit Dry-Run-Vorschau (profil_umlaute_reparieren(anwenden=False) nach skills_bereinigen-Muster), Schreiben ausschliesslich ueber die bestehenden db.update_*-Whitelists (Anti-DB-Bypass #514). ssß nie automatisch, technologies-Felder ausgenommen, Pflicht-Backup via export_profile_json vor dem Anwenden. Umgesetzt in v1.7.5 als profil_umlaute_reparieren (~150 kuratierte Woerter, ungemappte ae/oe/ue-Woerter werden als Kuratierungs-Kandidaten gelistet). Tests: tests/test_v175_umlaut_reparatur_742.py (17 Tests).

Schluessel-Module

Modul Pfad Verantwortung
Schema src/bewerbungs_assistent/database.py (~5800 LOC) SQLite-Schema, _migrate, SCHEMA_SQL, DB-Helper
Hash-System database.py:resolve_job_hash, _public_job_hash, _scope_job_hash Profil-Prefix-Handling fuer multi-tenancy
Update-Whitelist database.py:update_job mit _ALLOWED_UPDATE_FIELDS Defense gegen ungewollte Feld-Updates
Hard-Guard database.py:save_jobs mit leere_url_warnungen #645 — keine leeren URLs aus Scraper-Quellen
Mojibake-Repair database.py, dashboard.py (47 Stellen, v1.6.4-Fix) Latin-1 doppelt-encodete Strings reparieren

Schluessel-Issues

Issue Thema Status
#505 Typisierte IDs (APP-/JOB-/DOC-Prefix)
#514 Anti-DB-Bypass-Pattern
#574 dismiss_reason als Plain-String oder JSON-Array
#590 Profile-Cluster im Schema
#641 Inhalts-Duplikat-Erkennung
#645 Hard-Guard save_jobs

Tests

  • tests/test_database.py (49 Tests)
  • tests/test_v17_url_regression_645.py (11 Tests fuer Hard-Guard)
  • Plus indirekt in fast jedem anderen Test-Modul

Naechste Iteration

Issue-Level-Tabelle pro Schema-Migrations-Schritt (v1→v45) ist Roadmap. Aktuell ist der Cluster vollstaendig ✅ und braucht keine Plan-Erweiterung. Neueste Migrationen: v44 documents.lifecycle (#657), v45 tasks-Tabelle + dismiss_reasons.is_active (#666/#663) + search_criteria.keywords_minus (#667), v46 research_notes (#673/#674), v47 scraper_health.error_class (#720), v48 Scoring-Regler hochschulabschluss (#698). Fresh-Install-Parity von applications.is_imported in v1.7.1 nachgezogen (#737).


Wiki-Anchor: Architektur.

Clone this wiki locally