diff --git a/devlog/DEVLOG.md b/devlog/DEVLOG.md index 29e2452..631a68e 100644 --- a/devlog/DEVLOG.md +++ b/devlog/DEVLOG.md @@ -5,13 +5,107 @@ die Übersicht aus `scripts/zeit.sh summe`. ## Zeit je Meilenstein -| Meilenstein | Art | Minuten | Stunden | -| ----------- | ------ | ------- | -------- | -| M1 | claude | 161 | 2,68 | -| M2 | claude | 44 | 0,73 | -| M3 | claude | 41 | 0,68 | -| M4 | claude | 167 | 2,78 | -| **Gesamt** | | **413** | **6,88** | +| Meilenstein | Art | Minuten | Stunden | +| ----------- | ------ | ------- | --------- | +| M1 | claude | 161 | 2,68 | +| M2 | claude | 44 | 0,73 | +| M3 | claude | 41 | 0,68 | +| M4 | claude | 167 | 2,78 | +| M5 | claude | 420 | 7,00 | +| **Gesamt** | | **833** | **13,88** | + +--- + +## 2026-09-11 – M5: Benachrichtigungen + +**Dauer:** 420 Minuten (06:35–13:35), Art `claude`. + +**Ziel der Sitzung:** Sagen, was ansteht — und dabei so selten stören, dass +niemand auf die Idee kommt, alles abzuschalten. + +### Erledigt + +- Regeln als reine Logik: Anlässe, Ruhezeit, Wiederholungssperre (30 Tests) +- Web-Push über VAPID samt Service Worker, An- und Abmeldung je Browser +- Mailversand über nodemailer, als Text und als HTML +- Vier Anlässe: Tagesüberblick, Fälligkeit, Vorlauf vor einem Zeitblock, + Abgleichfehler +- Bedienung in den Einstellungen mit Probemeldung und Geräteliste +- Ein Lauf alle zehn Minuten, Nachweise räumt die Nachtrunde weg +- 2 neue E2E-Tests, 7 neue Integrationsprüfungen, Handbuchseite + +### Entscheidungen mit Begründung + +**Ab Werk meldet der Planer gar nichts.** Kein Weg ist eingeschaltet. Wer +beim ersten Start mit Meldungen überschüttet wird, schaltet alles ab — und +dann auch das Nützliche. Die Einrichtung ist ein bewusster Handgriff, und +das ist der Preis dafür, dass die Meldungen später ernst genommen werden. + +**Der Tagesüberblick ist von der Ruhezeit ausgenommen.** Sonst bekäme ihn +nie, wer ihn auf 06:00 stellt — die voreingestellte Ruhezeit läuft bis +07:00. Die Ruhezeit schützt vor Störungen, nicht vor der Nachricht, um die +ausdrücklich gebeten wurde. + +**Der Nachweis wird vor dem Senden geschrieben, nicht danach.** Bricht der +Versand mittendrin ab, gilt die Meldung als zugestellt und kommt nicht +wieder. Andersherum würde ein hängender Mailserver dieselbe Nachricht alle +zehn Minuten erneut versuchen. Lieber eine verpasste Nachricht als eine, +die im Minutentakt klopft. + +**Was in die Ruhezeit fällt, wird nicht nachgeholt.** Eine Erinnerung an +einen Zeitblock, der längst begonnen hat, ist nur der Beweis, dass die +Anwendung zu spät kommt. + +**Abgleichfehler erst ab dem dritten Versuch in Folge.** Ein Netz hustet, +ein Anbieter hat Wartung. Beim ersten Fehlschlag zu melden hieße, für +Dinge zu wecken, die sich von selbst erledigen. Nach dem dritten Mal ist es +dagegen dringend — solange steht die Wochenansicht auf altem Stand. + +**Der Tagesüberblick entfällt, wenn es nichts zu sagen gibt.** „Heute steht +nichts an" ist keine Information, sondern Lärm. + +**Tote Abos putzen sich selbst weg.** 404 und 410 heißen endgültig, das +Gerät verschwindet sofort; andere Fehler zählen hoch und führen nach fünf +Versuchen zum selben Ergebnis. Eine Liste, die von Hand gepflegt werden +muss, wird nicht gepflegt. + +**Push-Schlüssel liegen verschlüsselt, Endpunkte nie im Protokoll.** Ein +Endpunkt genügt, um jemandem Nachrichten zu schicken — er gehört damit in +dieselbe Klasse wie ein Token. + +### Probleme und Lösungen + +| Problem | Lösung | +| --------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `pushManager.subscribe` lehnte den VAPID-Schlüssel als `Uint8Array` ab | Der Puffer wird jetzt ausdrücklich als `ArrayBuffer` angelegt; ein geteilter Puffer ist dort nicht erlaubt. | +| Der Integrationstest brach mit einem Fremdschlüsselfehler ab | Die neuen Prüfungen standen hinter dem Löschen des Testbenutzers. Jetzt davor — und danach wird geprüft, dass Geräte und Nachweise mit ihm verschwinden. | +| E2E-Läufe scheiterten unter Last immer wieder beim Anmelden | Ein Klick, der vor der Hydratation ankommt, verpufft folgenlos. Der Anmeldehelfer liegt jetzt einmal in `e2e/hilfe.ts` und fasst nach, bis die Startseite da ist. | +| Die Karte meldete gleichzeitig „Browser blockiert" und „Server nicht eingerichtet" | Zwei Aussagen, von denen nur eine zählt. Der Serverzustand geht jetzt vor. Gefunden nur durch das Ansehen des aufgenommenen Bildes. | +| Das erfundene Push-Gerät in den Demo-Daten wäre beim ersten Versandlauf gelöscht worden | Seine Schlüssel lagen als Klartext-Platzhalter, und unlesbare Schlüssel führen zum Entfernen. Die Demo-Daten enthalten jetzt kein Gerät mehr — die Bilder zeigen den Zustand davor. | +| Im Bild meldet der Browser „blockiert", obwohl die Erlaubnis erteilt wurde | Chromium im Kopflosbetrieb antwortet auf `Notification.permission` immer mit `denied`; `grantPermissions` ändert daran nichts. Das Handbuch schreibt es jetzt unter das Bild. | +| Ein Docker-Bau brauchte 14 Minuten, ein E2E-Lauf 18 | Systemlast, kein Codeproblem: dieselben Läufe danach in 1,5 beziehungsweise 0,4 Minuten. Ein vergessener Testserver auf Port 3100 hat kräftig mitgeholfen. | + +### Offene Punkte + +- Der Versandweg ist gegen die Logik geprüft, nicht gegen echte Dienste: + ohne VAPID-Schlüssel und SMTP-Zugang geht lokal nichts hinaus. Das braucht + einen Lauf auf dem Server. +- Mehrere Anlässe erscheinen als mehrere Nachrichten. Ob eine Sammelmeldung + fehlt, zeigt erst der Alltag. + +### Commits + +- 24f613d feat: Datenmodell und Umgebung für Benachrichtigungen +- ddb13d7 feat: Regeln für Benachrichtigungen als reine Logik +- e0e11c8 feat: Versand per Web-Push und E-Mail +- b622c1b feat: Benachrichtigungen in den Einstellungen bedienen +- 047a4a1 feat: Meldungen alle zehn Minuten prüfen und verschicken +- 5bbbdd5 chore: Demo-Daten und Bildaufnahme für Benachrichtigungen +- f03ea73 docs: Handbuchseite und README-Abschnitt zu Benachrichtigungen +- 6e1f279 test: Benachrichtigungen end-to-end und in der Datenbank absichern +- 7bef435 fix: Serverzustand geht der Browsermeldung vor +- 35ecb2f chore: Screenshot-Instanz mit eingerichteten Meldewegen +- bb7b189 docs: Handbuchbilder für M5 neu aufnehmen --- diff --git a/devlog/zeiten.csv b/devlog/zeiten.csv index 0e74973..fa1b7eb 100644 --- a/devlog/zeiten.csv +++ b/devlog/zeiten.csv @@ -3,3 +3,4 @@ datum;start;ende;minuten;meilenstein;art;notiz 2026-09-10;15:57;16:41;44;M2;claude;M2 Aufgaben und Projekte fertig 2026-09-10;17:48;18:29;41;M3;claude;M3 Kalender lesen fertig 2026-09-10;20:42;23:29;167;M4;claude;M4 Wochenplanung fertig +2026-09-11;06:35;13:35;420;M5;claude;M5 Benachrichtigungen fertig