diff --git a/devlog/DEVLOG.md b/devlog/DEVLOG.md index 631a68e..70a36a8 100644 --- a/devlog/DEVLOG.md +++ b/devlog/DEVLOG.md @@ -5,14 +5,122 @@ 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 | -| M5 | claude | 420 | 7,00 | -| **Gesamt** | | **833** | **13,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 | +| M6 | claude | 733 | 12,22 | +| **Gesamt** | | **1566** | **26,10** | + +--- + +## 2026-09-12 – M6: Integrationen + +**Dauer:** 733 Minuten (20:47–09:00), Art `claude`. + +> Die Zahl täuscht. Ein großer Teil davon war Warten auf Docker-Bauten, die +> in der Nacht dreimal hängen blieben — einmal 39 Minuten ohne eine Zeile +> Ausgabe. Die eigentliche Arbeit war knapper. + +**Ziel der Sitzung:** Aufgaben dort abholen, wo sie entstehen — ohne dass die +Planung darunter leidet, die hier passiert. + +### Erledigt + +- Gemeinsame Aufnahmestelle für alle Integrationen (21 Tests) +- Zammad, lesend, mit Suchausdruck aus der Konfiguration +- Telegram: erfassen, melden, abhaken — mit Kopplung über Einmalcode +- Spiegel zwischen den Instanzen: Belegung ohne Titel, Aufgaben nur markiert +- Seite „Integrationen" mit Zustand, Fehler und Knopf für den Sofortlauf +- Gespiegelte Belegung in der Wochenansicht +- 4 neue E2E-Tests, 9 neue Integrationsprüfungen, Handbuchseite + +### Entscheidungen mit Begründung + +**Das Ursprungssystem führt Titel, Notiz, Verweis und Fälligkeit — mehr +nicht.** Bereich, Projekt, Priorität und geschätzter Aufwand gehören der +Planung. Wer ein Ticket einsortiert und schätzt, muss sich darauf verlassen +können, dass der nächste Abgleich das nicht wegräumt. Ohne diese Trennung +wäre die Wochenplanung nach jedem Lauf kaputt. + +**Zammad wird nur gelesen.** Ein Ticket schließt man im Ticketsystem, sonst +weiß die Kollegin nicht, warum es plötzlich zu ist. Umgekehrt darf Zammad +hier abhaken — dort ist die Wahrheit über den Zustand des Tickets. + +**Telegram holt ab, statt einen Webhook zu bekommen.** Ein Webhook verlangt +eine von außen erreichbare Adresse mit gültigem Zertifikat. Der Planer soll +auch hinter einem Anschluss ohne feste Adresse laufen, und der Preis dafür +sind zwei Minuten Verzögerung. + +**Unbekannte Chats bekommen keine Antwort — auch keine Fehlermeldung.** Wer +die Kennung des Bots kennt, könnte ihm sonst schreiben und daran erkennen, +dass es diesen Planer gibt. Die einzige Ausnahme ist ein gültiger +Kopplungscode. + +**Der Kopplungscode entstand aus einem Widerspruch.** Erst sollte die +Chatkennung von Hand eingetragen werden. Nur: Um sie zu erfahren, müsste der +Bot Unbekannten antworten — genau das, was er nicht darf. Der Code dreht die +Richtung um: Er kommt aus der Anwendung, in die man sich anmelden muss. + +**Der Spiegel schickt Belegung ohne Titel.** Daheim soll zu sehen sein, +_dass_ die Zeit weg ist, nicht woran gearbeitet wird. Aufgaben gehen nur +einzeln markiert mit — ein Schalter für einen ganzen Bereich würde zu leicht +Kundennamen nach Hause schicken. + +**Was der Sender nicht mehr schickt, verschwindet beim Empfänger.** Sonst +stünde daheim für immer eine Sperre, die es längst nicht mehr gibt. Für +Aufgaben gilt das nicht: Sie sind Planung, keine Sperre. + +**Jede Sendung ist fünf Minuten gültig.** Ohne Frist ließe sich ein +abgefangenes Paket beliebig oft erneut einspielen. Der Empfänger antwortet +auf jeden Fehlschlag gleich — falsches Geheimnis, verstellte Uhr und Unsinn +im Inhalt sind von außen nicht zu unterscheiden. + +**Die Demo-Instanz redet mit niemandem.** Sie ist mit erfundenen Daten +gefüllt und steht nur für Bilder. Solange `DEMO_MODUS` gilt, starten die +Jobs für Zammad, Telegram und den Spiegel gar nicht erst. + +### Probleme und Lösungen + +| Problem | Lösung | +| ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Die Kopfleiste verschluckte mit dem elften Eintrag „Einstellungen" und „Protokoll" | Sie ist jetzt breiter als die Inhaltsspalte. Eine Leiste, die Punkte stillschweigend abschneidet, ist schlimmer als eine, die nicht bündig mit dem Text steht. Gefunden im aufgenommenen Bild. | +| Der Kartentext erklärte noch den Weg von vor dem Kopplungscode | Ersetzt. Ebenfalls erst im Bild aufgefallen — im Code war beides für sich stimmig. | +| Ein Kürzungstest schlug an der Grenze fehl | Nicht der Test war falsch, sondern der Vergleich: Eine Worttrennung bei genau der halben Titellänge wurde abgelehnt. Jetzt `>=`. | +| Ein regulärer Ausdruck ging beim Schreiben über die Shell kaputt | Das Muster steht jetzt als benannte Konstante im Code, geschrieben mit dem Edit-Werkzeug statt über ein Skript. | +| Ein unsichtbares Zeichen (U+200B) landete mitten in einem Funktionsnamen | Entfernt und die Datei danach abgesucht. | +| Das Aufräumen im Integrationstest hätte fremde Telegram-Chats treffen können | Es trifft jetzt genau die Kennung, die der Lauf selbst angelegt hat. | +| Docker-Bauten blieben dreimal hängen, einmal 39 Minuten ohne Ausgabe | Kein Codeproblem: Nach Abbruch und Neustart lief derselbe Bau in Minuten durch. Die Bilder mussten deshalb viermal angestoßen werden. | + +### Offene Punkte + +- **Der Wartungsplaner ist nicht angebunden.** Die Aufnahmestelle steht + bereit und die Seite führt ihn als sichtbare Lücke; es fehlt allein das + Abholen. Dafür muss erst feststehen, was das Produkt an Schnittstelle + hergibt. +- Zammad und Telegram sind gegen die Logik geprüft, nicht gegen die echten + Dienste — dafür fehlen Zugangsdaten. Der Spiegel dagegen ist end-to-end + geprüft, weil beide Enden dieselbe Anwendung sind. +- Ein Telegram-Chat lässt sich nicht umbenennen. Fällt das im Alltag auf, + ist es ein Einzeiler. + +### Commits + +- 7f8f505 feat: Datenmodell und Umgebung für Integrationen +- e4d3547 feat: Aufnahmeregeln für Integrationen als reine Logik +- 6dad333 feat: Zammad, Telegram und den Spiegel anbinden +- bc60e5f feat: Integrationen takten und Telegram als dritten Meldeweg +- 1281c3e feat: Integrationen sichtbar und bedienbar machen +- 0d0f850 feat: Gespiegelte Belegung in der Wochenansicht zeigen +- 4da2f3d test: Spiegel-Eingang und Integrationstabellen absichern +- 3befcc1 feat: Aufgaben einzeln zum Spiegeln freigeben +- f5eadef feat: Lauf von Hand anstoßen und Spiegelschalter in der Liste +- 3c7cdbb chore: Demo-Daten, Bildaufnahme und Platz in der Kopfleiste +- 475b1d5 docs: Handbuchseite, README und Fahrplan für M6 +- 98d170b docs: Handbuchbilder für M6 neu aufnehmen --- diff --git a/devlog/zeiten.csv b/devlog/zeiten.csv index fa1b7eb..cf5cdc3 100644 --- a/devlog/zeiten.csv +++ b/devlog/zeiten.csv @@ -4,3 +4,4 @@ datum;start;ende;minuten;meilenstein;art;notiz 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 +2026-09-11;20:47;09:00;733;M6;claude;M6 Integrationen fertig