Files
lernbar/DEVLOG.md
T
Florian WildeandClaude Opus 5 103a603eb4 Baustein 3: Wochenplan als Startseite, Fortschritt, Wochen verschieben
- Wochenplan ist die Startseite des Azubis: Thema, Leitfrage, fuenf Tage
  mit Theorie und Praxis, Fortschrittsbalken, was noch offen ist
- Ausbilder sieht je Azubi die laufende Woche mit Stand und offenen Punkten
- /woche/<nr> fuer jede Woche, Ausbilder waehlt ueber ?azubi= den Stand;
  Zugriff wird serverseitig bei jedem Aufruf geprueft
- Tabelle wochenplanung mit geplantem und tatsaechlichem Datum, Zustand
  und Notiz fuer den Azubi
- Verschieben per Datumsfeld, wahlweise mit allen folgenden Wochen
- Reihenfolge per Ziehen und Ablegen sowie per Tastatur (Alt + Pfeil)
- Warnung bei sich ueberlappenden Terminen
- Plan entsteht automatisch beim Anlegen eines Azubikontos
- Planungs- und Fortschrittslogik als reine Funktionen, 36 Tests dafuer
- Insgesamt 104 Tests

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-10 09:04:39 +02:00

6.1 KiB
Raw Blame History

Arbeitstagebuch

Zeiten in Europe/Berlin. Jeder Abschnitt entspricht einem Baustein aus dem Fahrplan.

Format: HH:MM–HH:MM (Dauer) · was gemacht wurde


2026-09-10 · Baustein 3 – Wochenplan

Von Bis Dauer Tätigkeit
09:05 09:20 0:15 Datenmodell der Wochenplanung, Migration, Drizzle-Schema
09:20 09:45 0:25 Planungslogik als reine Funktionen: erzeugen, verschieben, umsortieren, „welche Woche ist dran", Überschneidungen; dazu die Fortschrittsrechnung
09:45 09:55 0:10 36 Tests dafür – liefen beim ersten Anlauf durch
09:55 10:10 0:15 Repository-Schicht, Wochensicht aus Inhalt + Planung + Fortschritt
10:10 10:35 0:25 Wochenansicht, Startseiten für beide Rollen, Wocheneinzelansicht
10:35 10:55 0:20 Wochenplanseite: verlegen, umsortieren mit Ziehen und Tastatur, Zustand, Notizen
10:55 11:10 0:15 Durchstich im Browser, Screenshots, Dokumente nachgezogen

Summe Baustein 3: rund 2 h 05 min

Was aufgefallen ist

  • Beim Umsortieren war die erste Idee, die Termine mitzuziehen. Falsch: Dann entstehen Lücken und Überschneidungen. Richtig ist, die Folge der Kalenderwochen als festen Rahmen zu behandeln und nur die Zuordnung zu ändern – der Plan bleibt so immer lückenlos.
  • Der Lint-Fehler „azubiId is defined but never used" im Verlegen-Formular war kein Stilproblem, sondern ein echter Bug: Dem Formular fehlte das versteckte Feld, das die Serveraktion ausliest. Ein Lauf hätte den Fehler zwar auch gezeigt, aber erst nach dem Klick.
  • Ziehen und Ablegen allein reicht nicht. Wer mit der Tastatur arbeitet, kommt damit nicht weiter, deshalb tun es die Pfeilknöpfe und Alt + Pfeil genauso.
  • Die Erfolgsmeldung nach „Wochen einplanen" ist nicht zu sehen, weil das Formular danach verschwindet – die erscheinende Planliste ist die Rückmeldung. Kein Fehler, aber es hat mich im Testskript zunächst gekostet.

2026-09-10 · Baustein 2 – Inhalte

Von Bis Dauer Tätigkeit
07:05 07:15 0:10 Remote eingetragen, Push scheitert an fehlenden Zugangsdaten – zurückgestellt, Arbeit läuft weiter
07:15 07:25 0:10 Ausbildungsrahmenplan und Lernfelder aus den Quellen geholt statt geraten (FIAusbV Anlage, KMK-Rahmenlehrplan)
07:25 07:50 0:25 Beispielinhalte geschrieben: 12 Handouts mit Merkkarten, 4 Wochenpläne, 4 Aufgaben, 4 Checklisten, 2 Lernzielkontrollen, 24 Glossareinträge
07:50 08:20 0:30 Inhaltslader: YAML-Dokumentmodell für Zeilennummern, Zod-Schemata, Fehlersammler, Querverweisprüfung
08:20 08:35 0:15 Handout-Ansicht, Übersicht nach Blöcken, Volltextsuche, Glossar mit automatischer Verlinkung
08:35 08:50 0:15 39 neue Tests; zwei echte Fehler dabei gefunden (siehe unten)
08:50 09:00 0:10 Screenshot-Skript, Bilder aufgenommen, Fahrplan und Änderungsprotokoll nachgezogen

Summe Baustein 2: rund 1 h 55 min

Was aufgefallen ist

  • Die Zeilennummer in der Fehlermeldung war den Aufwand wert. Beim ersten Lauf gegen die echten Inhalte kam sofort content/glossar.yaml:8 – Expected string, received number: formen: [169.254] hatte YAML als Gleitkommazahl gelesen. Ohne Zeilenangabe hätte ich das in 24 Einträgen gesucht.
  • gray-matter liefert beim zweiten Einlesen desselben Textes ein Objekt ohne das Feld matter – im Betrieb fällt das nie auf, im Test sofort. Den YAML-Kopf selbst herauszulösen ist zehn Zeilen Arbeit und beseitigt gleich zwei Probleme.
  • Zod-Schemata mit .default() haben verschiedene Ein- und Ausgabetypen. Mit z.ZodType<T> erzwingt TypeScript Gleichheit und leitet den falschen Typ ab; <S extends z.ZodTypeAny> mit z.output<S> ist die richtige Form.
  • Der Auftrag nennt für den Rahmenplan C1 bis C4. Die Verordnung führt in Abschnitt F aber fünf integrativ zu vermittelnde Positionen. Ich habe alle fünf aufgenommen – sonst fehlt in der Abdeckung ausgerechnet die Position, die 2020 neu dazugekommen ist („Vernetztes Zusammenarbeiten unter Nutzung digitaler Medien"). Siehe ENTSCHEIDUNGEN.md, E10.

2026-09-10 · Baustein 1 – Fundament

Von Bis Dauer Tätigkeit
00:15 00:20 0:05 Auftrag gesichtet, fehlende Stackvorgabe geklärt (Next.js 15 + React 19 + TypeScript), Repository angelegt
00:20 00:28 0:08 Abhängigkeiten installiert; better-sqlite3 auf v12 gehoben, weil es für Node 24 sonst keine fertige Binärdatei gibt und der Bau über Visual Studio scheiterte
00:28 00:40 0:12 Datenbankschicht: Drizzle-Schema, eigener Migrationslauf mit Prüfsummen, Verbindung als Prozess-Singleton
00:40 00:52 0:12 Zeitrechnung (Europe/Berlin, ISO-Kalenderwochen), Argon2id, serverseitige Sitzungen, Rechteregeln als reine Funktionen
00:52 01:10 0:18 Gestaltung: Farbwelt Petrol/Bernstein, helle und dunkle Darstellung, Bedienelemente, Druckansicht
01:10 01:25 0:15 Anmeldung, Rahmenlayout, Startseite, Verwaltung (Konto und Ausbildung anlegen, Passwort, Sperren)
01:25 01:32 0:07 Erstes Ausbilderkonto über Skript angelegt, Typprüfung und Bau grün, Server geprüft
01:32 01:50 0:18 Dockerfile, docker-compose, Lebenszeichen, update.sh mit Rückfall, Sicherung und Wiederherstellung
01:50 02:05 0:15 Fahrplan, Änderungsprotokoll, Arbeitstagebuch, Entscheidungen, README

Summe Baustein 1: rund 1 h 50 min

Was aufgefallen ist

  • Der Auftrag verweist zweimal auf einen „Kopf des Prompts" (Stack, Anmeldung), der nicht mitgeliefert wurde. Die Anmeldung war aus den technischen Vorgaben ableitbar, der Stack nicht – dafür gab es eine Rückfrage.
  • npm blockiert seit Version 11 Installationsskripte fremder Pakete. better-sqlite3, esbuild und unrs-resolver mussten einmalig über npm approve-scripts freigegeben werden. Das gehört in die README, sonst läuft ein Fremder in genau diese Wand.
  • Windows und LF: ohne .gitattributes hätte Git die Shell-Skripte mit CRLF ausgecheckt, und der Linux-Container hätte sie nicht mehr gestartet.