diff --git a/dms/docs/QA-12-PRUEFPROTOKOLL.md b/dms/docs/QA-12-PRUEFPROTOKOLL.md new file mode 100644 index 00000000..ce073b84 --- /dev/null +++ b/dms/docs/QA-12-PRUEFPROTOKOLL.md @@ -0,0 +1,79 @@ +# QA-12 Prüfprotokoll: Gesamtabnahme vor der Freigabe + +Basis: `main` (ba14aaf). Prüfung durchgeführt auf Host 192.168.1.131 (Referenz für AC1, aus vorliegenden Prüfprotokollen) sowie eigenständig auf Host 192.168.1.204 (AC2, Wiederherstellungstest, eigene Wegwerf-Ressourcen `qa12_dev`/`qa12_role`, PostgreSQL 17, ausschließlich synthetische Daten). Keine Kunden-/Mandantendaten, keine archivdms-Bestände verwendet. + +## Akzeptanzkriterien + +| AK | Nachweis | Ergebnis | +|---|---|---| +| 1 Alle Prüfgates sind bestanden | Sichtung aller vorliegenden QA-/RET-/BAK-/CMP-Prüfprotokolle (siehe Tabelle unten) | **mit einer offenen Ausnahme** (QA-10, siehe unten) | +| 2 Wiederherstellung wurde real durchgeführt | Eigener Restore-Test auf Host 204, Notfallwiederherstellung auf leerem System | **bestanden** | +| 3 Abnahmeprotokoll ist unterzeichnet | — | **offen** (Unterschrift ist eine Entscheidung des Menschen, siehe Abschluss) | + +## Prüfung 1: Status aller Prüfgates (AK 1) + +Referenzkorpus: alle im Repository abgelegten `*-PRUEFPROTOKOLL.md`/Audit-Dokumente der Boards DMS, Mail und Archive, per `grep` auf Gesamtergebnis/Status geprüft (kein erneuter Testlauf, reine Nachweisprüfung wie in der Auftragsbeschreibung vorgegeben). + +| Prüfgate | Fundort | Gesamtergebnis | +|---|---|---| +| QA-02 Neuaufsetzen/Ausfallverhalten | `dms/docs/QA-02-PRUEFPROTOKOLL.md` | bestanden | +| QA-03 Lebenszyklus/Prüfsummen | `dms/docs/QA-03-PRUEFPROTOKOLL.md` | bestanden | +| QA-04 Suche & Texterkennung | `dms/docs/QA-04-PRUEFPROTOKOLL.md` | erfüllt (mit dokumentierten Grenzen, siehe dort) | +| QA-05 Metadaten | `dms/docs/QA-05-PRUEFPROTOKOLL.md` | bestanden (regelbasierter Pfad); KI-Klassifizierung (CLS-01/CLS-03) ausdrücklich außerhalb dieses Gates | +| QA-06 Sicherheit/Berechtigung | `dms/docs/QA-06-PRUEFPROTOKOLL.md` | bestanden | +| QA-07 Last-/Leistungstest Mail | `mail/docs/QA-07-PRUEFPROTOKOLL.md` | bestanden | +| QA-08 Revisionssicherheit | `dms/docs/QA-08-PRUEFPROTOKOLL.md` | bestanden | +| QA-09 Barrierefreiheit | `docs/QA-09-BARRIEREFREIHEITS-AUDIT.md` | bestanden (ein terminierter Restbefund) | +| QA-10 Last-/Leistungstest DMS | — | **nicht vorhanden zum Prüfzeitpunkt** | +| QA-11 Barrierefreiheit (Bedienung ohne Maus) | `dms/docs/QA-11-PRUEFPROTOKOLL.md` | bestanden | +| RET-03 Löschworkflow & Aufbewahrungssperre | `archive/docs/RET-03-PRUEFPROTOKOLL.md` | bestanden | +| BAK-03 Restore-Verfahren | `archive/docs/BAK-03-PRUEFPROTOKOLL.md` | bestanden (real auf Host 131 durchgeführt) | +| CMP-02 DSGVO-Berichte | `archive/docs/CMP-02-PRUEFPROTOKOLL.md` | bestanden | + +**Befund (Restrisiko):** `QA-10` (Last-/Leistungstest DMS, laut mehreren Protokollen — u. a. `dms/docs/INTEGRATION-PRUEFPROTOKOLL.md` — als Voraussetzung für QA-12 vermerkt) hat zum Zeitpunkt dieser Prüfung kein abgelegtes Prüfprotokoll. Der Auftrag läuft parallel (eigener Bearbeitungsstrang). Dies ist **kein bloßer Nachweismangel, sondern eine echte offene Prüfgate-Lücke**: solange `QA-10` nicht mit Zielwert/Messwert/Bewertung abgelegt ist, ist AK 1 nicht vollständig erfüllt. Empfehlung: Freigabe erst nach Vorliegen von `dms/docs/QA-10-PRUEFPROTOKOLL.md` (oder gleichwertig) erteilen; dieses Protokoll (QA-12) ist bis dahin nicht freigabereif. + +## Prüfung 2: Notfallwiederherstellung auf leerem System (AK 2, Prüfpunkt 1) + +Eigenständig durchgeführt (nicht aus BAK-03 übernommen), auf Host 204, mit `archive/cmd/restore-cli` (unverändertes Produktionswerkzeug aus diesem Repository) gegen eine eigene Wegwerf-Datenbank. + +| Schritt | Zielwert | Messwert | Bewertung | +|---|---|---|---| +| 1. Synthetische Ausgangsdaten anlegen | Datenbank `qa12_dev`, 3 Dokumentzeilen mit SHA-256-Prüfsummen, 2 Tenants | Zeilen 1–3 angelegt, Prüfsummen notiert (siehe unten) | erfüllt | +| 2. Vollsicherung erstellen | `pg_basebackup -Ft -z --checkpoint=fast` auf laufender Instanz (Port 5432), Generation `gen1` | `backup_manifest`, `base.tar.gz` (~25 MB), `pg_wal.tar.gz` erzeugt, Exit 0 | erfüllt | +| 3. Simulierter Totalausfall | `DROP DATABASE qa12_dev` auf der Live-Instanz — Datenbank existiert danach nicht mehr | `SELECT datname … WHERE datname='qa12_dev'` liefert 0 Zeilen | erfüllt (Ausfall real herbeigeführt, kein Simulationstrick) | +| 4. Restore auf leeres Ziel | `restore-cli database gen1 ` (Produktionswerkzeug, unverändert) | `ergebnis=ok`, `/var/tmp/qa12-restore.log` protokolliert vorherigen Fehlschlag (nicht-leeres Ziel) und den Erfolg | erfüllt | +| 5. Wiederhergestelltes PGDATA tatsächlich starten | Eigenständige PostgreSQL-Instanz aus dem Restore-Verzeichnis (Port 5555), `SELECT 1` | `database system is ready to accept connections`, `SELECT 1` → `1` | erfüllt | +| 6. Datenintegrität nach Wiederherstellung | Alle 3 Zeilen inkl. Prüfsummen byte-identisch zum Vorzustand | Vorher/Nachher-Export exakt identisch (3/3 Zeilen, Prüfsummen unverändert) | erfüllt | + +Rohdaten (vorher = nachher): +``` +1 synthetic-tenant-a Testbeleg-001 51a2cc6a1b99de311d0b92bacd569fec020cbbcf4de15cf44f020d0bbd410cf2 +2 synthetic-tenant-a Testbeleg-002 ec8cadccf697b5c496a9be9e368fc6ac2192949a704cc6007909e6088c6b9c9f +3 synthetic-tenant-b Testbeleg-003 5c5f0dfce5829f599356af817a185045b39cdad927fef6131178e863b3d5b10a +``` + +**Grenze:** Debian/Postgres hält `postgresql.conf`/`pg_hba.conf` außerhalb von PGDATA (Paketkonvention); für den eigenständigen Testlauf wurden minimale, nicht produktive Konfigurationsdateien danebengelegt, um den Start zu ermöglichen. Das ist eine Eigenheit der Testumgebung, kein Fund am Backup-/Restore-Code — `pg_basebackup`/`pg_combinebackup`/`restore-cli` liefen unverändert und ohne Anpassung. Im Produktivbetrieb liegt die Konfiguration ohnehin außerhalb des Backups (separat verwaltet). + +Aufräumen nach dem Test: Restore-Instanz gestoppt, `/var/tmp/qa12-backup-*` und `/var/tmp/qa12-restore-*` gelöscht, Wegwerf-Rolle `qa12_role` entfernt. Keine Spuren auf Host 204 verblieben, Host 131 nicht angefasst. + +## Prüfung: Löschung nur mit Freigabe und Protokoll möglich (Prüfpunkt 2) + +Nicht erneut ausgeführt — bereits mit eigenem, bestandenem Prüfgate abgedeckt: `archive/docs/RET-03-PRUEFPROTOKOLL.md`, AK 1–3 (aktive Sperre verhindert Löschung, Vernichtungsprotokoll unveränderlich per DB-Trigger, Freigabe selbst protokolliert). Kein neuer Befund. + +## Prüfung: Offene Restrisiken (Prüfpunkt 3) + +- **QA-10 fehlt** (siehe oben) — größtes offenes Risiko für die Freigabe, da laut mehreren Protokollen als Voraussetzung für QA-12 markiert. +- **QA-04:** Erkennungsrate 1,0 nur an synthetischem, sauberem Korpus gemessen; reale Erkennungsgüte an anonymisierten Scans offen (dort dokumentiert, hier nicht erneut geprüft). +- **QA-05:** KI-gestützte Klassifizierung (CLS-01/CLS-03) ausdrücklich nicht Teil des Gates — offen für das AI-Board. +- **AK 3 dieses Tickets (Unterschrift):** kann nicht automatisiert erteilt werden, siehe Abschluss. + +## Abschluss + +**Gesamtbewertung:** AK 2 (reale Wiederherstellung) ist erbracht. AK 1 ist **nicht vollständig** erfüllt, solange `QA-10` kein Prüfprotokoll hat. AK 3 (Unterschrift) ist eine Entscheidung des Menschen und wird hier bewusst **nicht** vorweggenommen oder fingiert. + +**Freigabeempfehlung:** Noch nicht freigabereif — abhängig vom Abschluss von `QA-10`. Nach dessen Vorliegen ist AK 1 neu zu bewerten (Nachtrag zu diesem Protokoll genügt, kein vollständiger Neulauf nötig); anschließend ist AK 3 durch den zuständigen Menschen zu erteilen. + +**Unterschrift/Freigabe:** ☐ noch ausstehend — durch die zuständige Person nach Vorliegen von QA-10 nachzutragen. + +Commit: `QA-12: abnahme- & compliance-prüfung` +Branch: `feature/qa-12-abnahme-compliance-prüfung`