From 6b149817667ca280ec2b21420c4678688734e36d Mon Sep 17 00:00:00 2001 From: Florian Wilde Date: Sun, 13 Sep 2026 01:34:16 +0200 Subject: [PATCH] docs: Fahrplan, Aenderungen und DEVLOG fuer M7 Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 27 ++++++++++++ ROADMAP.md | 24 +++++++++-- devlog/DEVLOG.md | 103 +++++++++++++++++++++++++++++++++++++++++++++- devlog/zeiten.csv | 1 + 4 files changed, 150 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61b5963..a12ad50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,33 @@ die Versionierung [Semantic Versioning](https://semver.org/lang/de/). ## [Unveröffentlicht] +### Hinzugefügt + +- **Schnellerfassung vom Handy** unter _Erfassen_: ein Feld, ein Knopf. Was + ohne Netz erfasst wird, bleibt im Gerät und geht hinaus, sobald wieder eine + Verbindung da ist — mit einer Kennung je Erfassung, damit eine doppelt + zugestellte Nachricht keine zweite Aufgabe ergibt. +- Der Planer lässt sich als **App auf dem Startbildschirm ablegen** + (Manifest, eigenes Symbol, eigener Startpunkt). +- **Öffentliche Schnittstelle** unter `/api/v1`: Aufgaben lesen, anlegen, + ändern und abhaken. Beschreibung in [docs/API.md](docs/API.md). +- **Tokens je Anwendung** mit Rechten je Token, wahlweise mit Ablauf, + verwaltbar unter _API_. +- Handbuchseite zur Schnellerfassung. + +### Sicherheit + +- Von einem Token liegt nur der Fingerabdruck in der Datenbank. Der Wert + erscheint genau einmal — beim Anlegen. +- Die drei Rechte schließen einander nicht ein: Ein Dienst, der nur erfasst, + kann den Bestand nicht lesen. +- Jeder Fehlschlag beim Ausweisen sieht gleich aus. Ob ein Token unbekannt, + abgelaufen oder zurückgezogen ist, verrät die Schnittstelle nicht. +- Jede schreibende Nutzung steht im Protokoll, mitsamt dem Token — auch jeder + abgewiesene Zugriff. +- Die Schnittstelle kann weder löschen noch Bereiche, Projekte, Zeitblöcke + oder Kalender anfassen. + ## [0.6.0] – 2026-09-12 ### Hinzugefügt diff --git a/ROADMAP.md b/ROADMAP.md index 4b4f711..026814a 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -11,7 +11,7 @@ grünen Prüfungen, aktueller Dokumentation und einem Eintrag im DEVLOG. | [M4](#m4--wochenplanung-und-zeitblöcke) | Wochenplanung und Zeitblöcke | erledigt | | [M5](#m5--benachrichtigungen) | Benachrichtigungen | erledigt | | [M6](#m6--integrationen) | Integrationen | erledigt | -| [M7](#m7--schnellerfassung-und-api) | Schnellerfassung und API | geplant | +| [M7](#m7--schnellerfassung-und-api) | Schnellerfassung und API | erledigt | | [M8](#m8--mcp) | MCP | geplant | --- @@ -134,9 +134,25 @@ im Ticketsystem — sonst weiß die Kollegin nicht, warum es plötzlich zu ist. ## M7 – Schnellerfassung und API -- [ ] Erfassung vom Handy, auch offline -- [ ] Öffentliche API mit Token je Anwendung -- [ ] Rechte je Token, jede Nutzung im Protokoll +**Erledigt am 12.09.2026 mit Version 0.7.0.** + +**Ziel:** Etwas festhalten können, wo man gerade steht — und andere +Anwendungen hereinlassen, ohne ihnen die Schlüssel zum ganzen Haus zu geben. + +- [x] Erfassung vom Handy, auch offline +- [x] Öffentliche API mit Token je Anwendung +- [x] Rechte je Token, jede schreibende Nutzung im Protokoll +- [x] Als App ablegbar (Manifest, eigenes Symbol) + +**Offen geblieben:** Die Bilder der Erfassungsseite im Handbuch zeigen noch +eine falsche Inbox-Zahl; der Fehler selbst ist behoben, nur der Bildlauf +kam danach nicht mehr durch. + +**Bewusst offen gelassen:** Die Schnittstelle kann keine Bereiche, Projekte +oder Zeitblöcke anfassen und nichts löschen. Was von außen kommt, landet in +der Inbox; die Einordnung bleibt bei dem, der plant. Auch eine Begrenzung der +Aufrufzahl gibt es nicht — bei einer Handvoll eigener Tokens wäre sie mehr +Zeremonie als Schutz. ## M8 – MCP diff --git a/devlog/DEVLOG.md b/devlog/DEVLOG.md index 70a36a8..eab765b 100644 --- a/devlog/DEVLOG.md +++ b/devlog/DEVLOG.md @@ -13,7 +13,108 @@ die Übersicht aus `scripts/zeit.sh summe`. | M4 | claude | 167 | 2,78 | | M5 | claude | 420 | 7,00 | | M6 | claude | 733 | 12,22 | -| **Gesamt** | | **1566** | **26,10** | +| M7 | claude | 886 | 14,77 | +| **Gesamt** | | **2452** | **40,87** | + +--- + +## 2026-09-13 – M7: Schnellerfassung und API + +**Dauer:** 886 Minuten (10:15–01:01), Art `claude`. + +> Wie schon bei M6 sagt die Zahl mehr über den Rechner als über die Arbeit: +> Fünf hängende Docker-Bauten, einer davon mit einem einzelnen Schritt über +> drei Stunden. Die Bildaufnahme musste achtmal angestoßen werden. + +**Ziel der Sitzung:** Etwas festhalten können, wo man gerade steht — und +andere Anwendungen hereinlassen, ohne ihnen die Schlüssel zum ganzen Haus zu +geben. + +### Erledigt + +- Regeln der Schnittstelle als reine Logik: Rechte, Tokenaufbau, Eingaben + (30 Tests) +- `/api/v1`: Aufgaben lesen, anlegen, ändern, abhaken +- Tokens mit Rechten und wahlweise Ablauf, verwaltbar in der Anwendung +- Schnellerfassung fürs Handy mit Warteschlange in IndexedDB +- Manifest und Symbol: der Planer lässt sich als App ablegen +- 10 neue E2E-Tests, 6 neue Integrationsprüfungen, Handbuchseite, API-Doku + +### Entscheidungen mit Begründung + +**Von einem Token liegt nur der Hash in der Datenbank.** Ein Token ist ein +Passwort; es gibt keinen Grund, es zurücklesen zu können, und jeden Grund, +es nicht zu können. SHA-256 ohne Salz ist hier richtig — der Wert hat 32 +Byte Zufall, gegen so etwas hilft kein Wörterbuch, und die Prüfung muss bei +jeder Anfrage schnell sein. + +**Kein Recht schließt ein anderes ein.** „Erfassen" darf nicht lesen. Ein +Dienst, der nur meldet „hier ist etwas Neues", braucht den Bestand nicht zu +sehen — und das ist der häufigste Fall. + +**Der sichtbare Anfang heißt `planer_`.** Wer so einen Wert versehentlich in +ein öffentliches Verzeichnis schiebt, soll ihn beim Durchsehen erkennen. + +**`/selbst` braucht kein Recht.** Sonst müsste man beim Einrichten raten, ob +der Token falsch ist oder nur zu wenig darf. + +**Die Schnittstelle kann Bereich und Projekt nicht setzen.** Was von außen +kommt, landet in der Inbox. Die Einordnung ist Sache dessen, der plant, +nicht dessen, der meldet. Löschen kann sie auch nicht: Ein Fehler im fremden +Skript soll keine Planung vernichten. + +**Erst anstellen, dann senden.** Die Schnellerfassung schreibt zuerst in die +Warteschlange des Geräts und versucht dann zu senden. Andersherum wäre der +Eintrag weg, wenn der Browser mitten im Senden geschlossen wird. + +**IndexedDB statt localStorage.** Das sind echte Daten des Benutzers. Ein +Eintrag, der beim Aufräumen des Speichers verschwindet, ist eine verlorene +Aufgabe — genau das, was der Planer verhindern soll. + +**Der Dienstarbeiter hält genau eine Seite vor.** Ein halb veralteter Planer +wäre schlimmer als gar keiner; ein leeres Eingabefeld dagegen veraltet +nicht. Und ohne die Seite nützte die Warteschlange niemandem: Man käme gar +nicht erst hin. + +**Die Navigation wurde geteilt statt weiter gedehnt.** Nach M6 hatte ich die +Leiste verbreitert; mit dem dreizehnten Eintrag verschluckte sie erneut +Punkte. Das war die falsche Antwort: Das Problem ist nicht die Breite, +sondern die Vermischung. Alltag steht in der Leiste, Einrichtung und +Verwaltung liegen hinter „Mehr". + +### Probleme und Lösungen + +| Problem | Lösung | +| -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Die Erfassungsseite zählte die Inbox anders als die Kopfleiste | Sie zählte Ideen mit. Jetzt benutzt sie dieselbe Abfrage. Derselbe Fehlertyp wie in M2 — und wieder nur im Bild aufgefallen, im Code sah jede Seite für sich richtig aus. | +| Die Leiste verschluckte mit dem dreizehnten Eintrag wieder Punkte | Aufgeteilt statt verbreitert, siehe oben. Zwei E2E-Tests greifen den neuen Weg über „Mehr" auf. | +| Ein E2E-Test brach mit `ERR_ABORTED` ab | Die Erfolgsmeldung kommt, bevor das Neuladen der Liste fertig ist; wer dann navigiert, bricht es ab. Der Test wartet jetzt darauf. | +| `exactOptionalPropertyTypes` und Prismas Update-Typen vertragen kein `undefined` | Das Datenobjekt wird Feld für Feld gebaut statt per Spread. Ein gesetztes `undefined` ist etwas anderes als ein fehlendes Feld. | +| Ein Devanagari-Zeichen war in ein Token-Präfix der Demo-Daten geraten | Entfernt. Beim Schreiben über die Shell passiert so etwas; die Datei danach durchsucht. | +| Fünf hängende Docker-Bauten, einer über drei Stunden | Kein Codeproblem: Nach Abbruch und Neustart lief derselbe Bau in Minuten durch. Zweimal scheiterte zusätzlich das Anlegen des Compose-Netzes. | + +### Offene Punkte + +- **Die Bilder der Erfassungsseite zeigen die alte Inbox-Zahl.** Der Bildlauf + ließ sich nach der Korrektur nicht mehr durchbringen. Ein Lauf, wenn Docker + wieder mitspielt, räumt das auf. +- Keine Begrenzung der Aufrufzahl je Token. Bei einer Handvoll eigener + Tokens wäre sie mehr Zeremonie als Schutz — bei einem Token, der außer + Haus geht, sähe das anders aus. +- Die Warteschlange kennt keinen Abbruch: Ein Eintrag, der dauerhaft + scheitert, wird ewig erneut versucht. Bisher gibt es keinen Fall, in dem + das passieren könnte, ohne dass gleichzeitig die Anmeldung fehlt. + +### Commits + +- d5c7974 feat: Datenmodell und Regeln für die öffentliche Schnittstelle +- 6d3ebd0 feat: API v1 für Aufgaben +- b17c42a feat: Tokens verwalten +- 9565b9a feat: Schnellerfassung vom Handy, auch ohne Netz +- 10b49cf test: Die Tür der Schnittstelle scharf prüfen +- 2e57713 docs: Handbuchseite zum Erfassen und Beschreibung der Schnittstelle +- 7919149 fix: Navigation aufteilen, statt sie weiter zu dehnen +- f9a616e docs: Handbuchbilder für M7 aufnehmen --- diff --git a/devlog/zeiten.csv b/devlog/zeiten.csv index cf5cdc3..5db23a6 100644 --- a/devlog/zeiten.csv +++ b/devlog/zeiten.csv @@ -5,3 +5,4 @@ datum;start;ende;minuten;meilenstein;art;notiz 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 2026-09-11;20:47;09:00;733;M6;claude;M6 Integrationen fertig +2026-09-12;10:15;01:01;886;M7;claude;M7 Schnellerfassung und API fertig