Phase 11: Freigabereife (#16)
This commit was merged in pull request #16.
This commit is contained in:
@@ -6,6 +6,100 @@ Alle nennenswerten Änderungen an FLORIAN. Format nach
|
||||
|
||||
Die Regeln dazu stehen in [docs/VERSIONIERUNG.md](docs/VERSIONIERUNG.md).
|
||||
|
||||
## [0.12.0] — 2026-09-05
|
||||
|
||||
Phase 11: Freigabereife. Die drei Software-Voraussetzungen für 1.0.0 —
|
||||
Personenauskunft nach Art. 15 DSGVO, ein geprüftes Sicherungskonzept und eine
|
||||
Pipeline, die die Tests von allein ausführt.
|
||||
|
||||
**Das Auskunftsrecht war ein Versprechen ohne Umsetzung.** `person.export`
|
||||
stand seit Phase 0 im Berechtigungskatalog und war dem Kommandanten
|
||||
zugewiesen; implementiert war nichts. Die Löschseite gab es (Anonymisierung im
|
||||
Aufbewahrungslauf), die Auskunftsseite nicht — und ohne Art. 15 ist ein
|
||||
Löschkonzept nicht abnehmbar.
|
||||
|
||||
**Eine Sicherung, die nie zurückgespielt wurde, ist eine Vermutung.** Genau
|
||||
das hat sich hier bestätigt: der erste Rückspielversuch lief scheinbar
|
||||
sauber durch und hatte dabei sämtliche Unveränderlichkeitsgarantien der
|
||||
Datenbank entfernt.
|
||||
|
||||
### Hinzugefügt
|
||||
|
||||
**Auskunft nach Art. 15 DSGVO**
|
||||
|
||||
- `lib/dsgvo/auskunft.ts` sammelt alles, was über eine Person vorliegt:
|
||||
Stammdaten, Zugang, Rollen, Qualifikationen, arbeitsmedizinische Vorsorge,
|
||||
Belastungsübungen, Einsatz- und Übungsbeteiligung, Anwesenheiten, Fahrten,
|
||||
Beiträge, Benachrichtigungswege, Ausweise. Dreizehn Abschnitte.
|
||||
- **Über jedem Abschnitt steht, wozu die Daten vorliegen.** Art. 15 Abs. 1
|
||||
verlangt nicht nur die Daten, sondern auch Zwecke, Empfänger und den Hinweis
|
||||
auf die weiteren Rechte. Eine Liste ohne das sieht aus wie eine Auskunft und
|
||||
ist keine.
|
||||
- **Gesundheitsdaten sind als besondere Kategorie nach Art. 9 gekennzeichnet** —
|
||||
G26 und Belastungsübungen.
|
||||
- **Leere Abschnitte bleiben stehen.** „Dazu liegt nichts vor" ist eine
|
||||
Auskunft; ein weggelassener Abschnitt wirft die Frage auf, ob da doch etwas
|
||||
ist.
|
||||
- **Was die Person getan hat, wird gezählt, nicht mitgeliefert.** Prüfprotokolle
|
||||
und Mängelmeldungen gehören zum Nachweisbestand der Wehr. Vollständig
|
||||
ausgeliefert käme jeder über eine Selbstauskunft an die Geräteakten — die
|
||||
Auskunftspflicht wäre eine Hintertür.
|
||||
- Ein Durchgang liefert alles: die Anzeige, ein PDF für die Akte und JSON nach
|
||||
Art. 20. Bewusst nicht drei Knöpfe, von denen zwei vergessen werden können.
|
||||
- Der Vorgang wird protokolliert. Dass eine Auskunft erteilt wurde, gehört
|
||||
festgehalten — sie legt alles offen, was über einen Menschen gespeichert ist.
|
||||
|
||||
**Sicherung und Wiederherstellung**
|
||||
|
||||
- `npm run sicherung` — Datenbank über `pg_dump` im Container, dazu alle
|
||||
Dateien aus MinIO, dazu ein Manifest. Beides aus demselben Moment: eine
|
||||
Datenbank von heute mit Dateien von gestern ergibt Verweise ins Leere.
|
||||
- `npm run wiederherstellen` — mit Probelauf als Vorgabe. Ohne `--wirklich`
|
||||
wird nur angezeigt, was geschähe.
|
||||
- Nach dem Zurückspielen setzt das Skript die Sperren der Anwendungsrolle neu
|
||||
und **prüft danach nach**, ob es gewirkt hat.
|
||||
- `scripts/sicherung-sperren.ts` ist die eine Liste, aus der Wiederherstellen
|
||||
und Prüfen entstehen. Ein Test gleicht sie gegen die migrierte Datenbank ab —
|
||||
läuft sie auseinander, wäre der Schaden lautlos.
|
||||
|
||||
**Pipeline**
|
||||
|
||||
- `.gitea/workflows/pruefung.yml` mit zwei Aufträgen: `pruefung` (typecheck,
|
||||
lint, Migrationen, Seed, 599 Unit-Tests) bei jedem Push, `oberflaeche`
|
||||
(E2E) auf `main` und in Pull Requests.
|
||||
- Die Datenbank wird aus `docker/postgres` gebaut statt aus einem fertigen
|
||||
Image: FLORIAN braucht PostGIS **und** pgvector. Ein Dienst-Container mit
|
||||
`postgres:17` ließe die Migrationen durch und scheiterte erst bei der ersten
|
||||
Umkreissuche.
|
||||
- Der Seed läuft mit, weil er selbst ein Test ist.
|
||||
|
||||
### Behoben
|
||||
|
||||
- **Eine Wiederherstellung entfernte alle Unveränderlichkeitsgarantien.** Der
|
||||
Dump lief mit `--no-acl`, die Rechte kamen also nicht zurück; und selbst
|
||||
ohne dieses Flag greift beim Zurückspielen die Vorgabeprivilegierung aus
|
||||
`docker/postgres/10-init-app-role.sh` — jede von `pg_restore` neu angelegte
|
||||
Tabelle bekommt automatisch alle Rechte, und `GRANT` kann nur hinzufügen,
|
||||
nie wegnehmen. Nach einer Wiederherstellung durfte die Anwendungsrolle das
|
||||
Audit-Log ändern, Wiki-Fassungen löschen und Kiosk-Vorgänge umschreiben.
|
||||
Nichts hätte darauf hingewiesen.
|
||||
|
||||
Gefunden haben es vier Datenbanktests unmittelbar nach der ersten
|
||||
Rückspielprobe — also genau die Probe, wegen der 1.0.0 sie verlangt.
|
||||
- **Ein E2E-Test klickte, bevor die Seite lebendig war.** Unter Last dauert das
|
||||
Hydrieren länger; das Formular verschickte sich dann selbst, und die
|
||||
Fehlerfläche, auf die der Test wartete, entstand nie — obwohl der Server
|
||||
richtig ablehnte. Er wartet jetzt auf einen client-seitig erzeugten Knopf.
|
||||
|
||||
### Nachweise
|
||||
|
||||
- Sicherung und Wiederherstellung einmal vollständig durchgeführt: ein nach
|
||||
der Sicherung angelegter Datensatz war danach weg, alle Zahlen stimmten
|
||||
wieder, und **599 Tests liefen nach dem Zurückspielen grün** — einschließlich
|
||||
derer, die die Sperren prüfen.
|
||||
|
||||
---
|
||||
|
||||
## [0.11.0] — 2026-09-05
|
||||
|
||||
Phase 10: Mandantenfähigkeit. Ein Konto, mehrere Wehren, eine Kreisebene, die
|
||||
|
||||
Reference in New Issue
Block a user