diff --git a/CHANGELOG.md b/CHANGELOG.md index 601cb13..25424dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/). ## [Unveröffentlicht] +## [0.2.0] – 2026-10-11 + ### Geändert - **Wer sich anmeldet und in keiner Rollengruppe steht, bekommt nicht mehr automatisch `LESER`.** diff --git a/docs/devlog.md b/docs/devlog.md index 69def3b..ce33ce9 100644 --- a/docs/devlog.md +++ b/docs/devlog.md @@ -1673,3 +1673,92 @@ stehen in `docs/betrieb/scim.md`. einen Host, den es hier nicht gibt. - **v0.2.0 ist damit reif für einen Tag**: Changelog-Abschnitt, Devlog-Phasenzusammenfassung, Tag, Release-Notiz. Die Bedingung aus Sitzung 23 („vorher gehört #038 entschieden“) ist erfüllt. + + +--- + +## Phase 2 abgeschlossen: was aus dem Plan wurde + +**38 h 35 min**, geschätzt waren **90 h** für die zwölf Issues dieser Version. Acht davon waren +Meilensteine (M15–M22), die übrigen entstanden **während** der Arbeit — und zwei der nützlichsten +(#036, #038) stammen gar nicht aus einem Plan, sondern aus der Durchsicht. + +### Was dazugekommen ist + +| | v0.1.0 | v0.2.0 | +|---|---|---| +| Quelltext unter `src/` | rund 30.000 Zeilen | **40.781 Zeilen** (ohne erzeugten Prisma-Client) | +| Datenmodell | 20 Tabellen, 9 Aufzählungen, 2 Migrationen | **25 Tabellen, 13 Aufzählungen, 14 Migrationen** | +| Datenbankregeln namentlich | — | **56** (CHECKs, partielle Indizes, Trigger, zusammengesetzte Fremdschlüssel) | +| Vitest | 1131 Tests | **1457 Tests** in 61 Dateien | +| Ende-zu-Ende | 101 Abläufe | **115 Abläufe** in 16 Dateien | +| Verzeichnisquellen | LDAP | **LDAP, Microsoft Graph, SCIM** | +| Dokumentation | 9 Kapitel, 14 Issue-Dateien | 9 Kapitel, 8 Betriebsseiten, **38 Issue-Dateien** | + +Der Seed ist unverändert bei 7 Vorlagen mit 155 Schritten — nachgezählt, nicht übernommen. + +### Die acht Meilensteine + +| | | Zeit | +|---|---|---| +| M15 | Quellenarten und Microsoft-Graph-Quelle (#028) | 4 h 10 | +| M16 | SCIM-Endpunkt als Alternative zum Abgleich (#029) | 4 h 05 | +| M17 | Wiederverwendbare Bausteine (#030) | 2 h 25 | +| M18 | Abteilungsspezifische Zusatzabschnitte (#031) | 1 h 35 | +| M19 | Anhänge und Fotos an Schritten (#032) | 3 h 05 | +| M20 | Live-Aktualisierung per SSE statt Polling (#033) | 1 h 40 | +| M21 | Benachrichtigungen per Mail und Webhook (#034) | 3 h 30 | +| M22 | Mitarbeiter-Selbstauskunft (#035) | 2 h 50 | + +### Was diese Phase gelehrt hat + +**Die teuersten Fehler waren dreimal derselbe: eine Zusage ohne Prüfer.** Nicht falscher Code — +Code, der *aussieht*, als prüfte er etwas. + +- Ein Kommentar sagte, ein `select` hole Notizen „gar nicht erst“, während ein anderer Codepfad den + Test rettete (#035). +- `docs/betrieb/sicherung.md` sagte „kein Upload-Verzeichnis“, nachdem die Anhänge dazugekommen + waren — eine Sicherung nach der alten Anleitung hätte still Daten verloren (#032). Dasselbe + Dokument hatte in #036 wieder einen Satz, der zu keiner Installation passte. +- „Jede Seite prüft selbst“ steht seit #007 in `CLAUDE.md` und hielt bis #038 **nur durch Nachsehen + von Hand**. Der Review hat alle 27 Seiten durchgesehen — ein Ergebnis, das für genau einen Tag + gilt. + +**Die Gegenprobe ist das Werkzeug, das sie findet.** Regel brechen, Test muss rot werden. In dieser +Phase blieben fünf Gegenproben grün, und jede davon war ein Befund: `PATCH remove` wirkte gar nicht, +Entra IDs `"True"` wäre beim *Aktivieren* kaputt gewesen, der Anhang-Handler hatte keinen Test, +`/api/scim` stand in keiner Allowlist-Prüfung, und der Link in der Abgleich-Meldung war ein 404. + +**Ein Fehler, der nur in einer Richtung sichtbar ist, ist der teuerste.** Entra ID schickt `active` +als `"True"`/`"False"`. Beim Deaktivieren kommt mit einem reinen `value === true` zufällig das +Richtige heraus — nur das Aktivieren wäre kaputt gewesen: ein wieder freigeschaltetes Konto, das für +immer inaktiv bleibt. + +**Eine Attrappe ohne die Form der Wirklichkeit prüft etwas anderes als die Wirklichkeit.** Zweimal +gelernt, von beiden Seiten: der Graph-Doppelgänger fand einen echten Fehler, **weil** er den Filter +wirklich auswertete (#028); die Sitzungs-Attrappe `{}` verdeckte einen, weil sie keine `benutzerId` +hatte (#036). + +**Ein gemeinsamer Helfer in einer Testsuite ist geteilter Zustand.** Das Anmelde-Warten für einen +neuen Fall aufzuweichen machte zwei unverwandte Abläufe unzuverlässig — sichtbar nur im vollen +Durchgang (#037). + +### Wo die Zeit hinging + +Die beiden Verzeichnis-Meilensteine (#028, #029) waren mit 8 h 15 zusammen die teuersten, und zwar +**nicht** wegen der Protokolle: beide liefen gegen Doppelgänger, und in beiden Fällen entschied die +Strenge der Attrappe, ob ein Fehler gefunden wurde. Die eigentliche Arbeit war, die Weiche an genau +einer Stelle zu halten und beide Richtungen eines CHECKs aufzuschreiben — was eine Art braucht, und +was sie **nicht haben darf**. + +### Was offen bleibt + +**#024** — der Proxmox-Einzeiler ist auf einem echten PVE-Host nie gelaufen. Das steht seit v0.1.0 +so da, und es bleibt stehen, weil es einen Host verlangt, den diese Umgebung nicht hat. Die Prüfliste +liegt bereit. + +Zwei Grenzen gehören dazu genannt, beide in den Issues festgehalten: **gegen einen echten +Entra-Mandanten** und **gegen echte SCIM-Anbieter** ist nichts gelaufen. Die Formen in den Tests +stammen aus der Dokumentation, nicht aus Mitschnitten. Stimmt eine Form nicht, stimmen Test und +Wirklichkeit nicht — die Prüflisten stehen in `docs/betrieb/entra-id.md` und +`docs/betrieb/scim.md`. diff --git a/package.json b/package.json index b6c4519..7959b5f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "laufzettel", - "version": "0.1.0", + "version": "0.2.0", "private": true, "type": "module", "description": "Checklisten fuer wiederkehrende IT-Arbeiten: versionierte Vorlagen, Laeufe, Archiv, QR-Tags",