# Arbeitstagebuch Zeiten in Europe/Berlin. Jeder Abschnitt entspricht einem Baustein aus dem [Fahrplan](ROADMAP.md). 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` erzwingt TypeScript Gleichheit und leitet den falschen Typ ab; `` mit `z.output` 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. ---