- Durchlauf aus einer Vorlage, mit Datum, Ticket und Kunde - Schritt fuer Schritt abhaken, Bemerkung je Schritt - Fortschritt gesamt und je Gruppe (Vorbereiten/Durchfuehren/Pruefen/Abschliessen) - Abschliessen erst, wenn alles abgehakt ist; Meldung nennt die offenen Schritte - Abgeschlossene Durchlaeufe sind gesperrt und bleiben als Nachweis - Titel und Schritttexte werden beim Start kopiert, nicht verwiesen - PDF-Export mit gezeichneten Ankreuzkaestchen und Unterschriftenzeilen - Gemeinsame PDF-Grundlage fuer alle kuenftigen Ausgaben - Ausbilder liest mit und darf das PDF abrufen, hakt aber nicht ab - Abgeschlossene Durchlaeufe zaehlen im Wochenfortschritt mit Behoben beim Durchstich: Die Fusszeile wurde unterhalb des Satzspiegels gesetzt, wodurch PDFKit je Fusszeile eine leere Seite anhaengte - aus zwei Seiten wurden sechs. Ein Test zaehlt jetzt die Seitenobjekte im PDF. 29 neue Tests, insgesamt 186. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
208 lines
12 KiB
Markdown
208 lines
12 KiB
Markdown
# 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 6 – Checklisten und PDF
|
||
|
||
| Von | Bis | Dauer | Tätigkeit |
|
||
|---|---|---|---|
|
||
| 20:35 | 20:42 | 0:07 | Datenmodell, Migration, Schema |
|
||
| 20:42 | 20:48 | 0:06 | Gruppenfortschritt als reine Rechnung, 16 Tests |
|
||
| 20:48 | 20:52 | 0:04 | PDF-Grundlage und Checklisten-PDF |
|
||
| 20:52 | 21:00 | 0:08 | Repository, Aktionen, Seiten, PDF-Route |
|
||
| 21:00 | 21:10 | 0:10 | Durchstich; PDF gerendert und den Fußzeilenfehler gefunden |
|
||
| 21:10 | 21:20 | 0:10 | Fehler behoben, Regressionstest, Dokumente |
|
||
|
||
**Summe Baustein 6: rund 45 min**
|
||
|
||
### Was aufgefallen ist
|
||
|
||
- **Das PDF hatte sechs Seiten, vier davon leer.** Aufgefallen ist das erst
|
||
beim Ansehen – die Prüfung „Status 200, Content-Type application/pdf" war
|
||
grün. Ursache: Die Fußzeile wird unterhalb des Satzspiegels gesetzt, und
|
||
PDFKit hält das für überlaufenden Text und legt eine neue Seite an. Bei zwei
|
||
Seiten mal zwei Textaufrufen macht das vier leere Seiten. Behoben, indem der
|
||
untere Rand für die Dauer der Fußzeile auf 0 gesetzt wird. Ein Test zählt
|
||
jetzt die Seitenobjekte im PDF und hätte den Fehler gefunden.
|
||
- Headless-Chromium rendert keine PDFs. Für den Blick aufs Ergebnis musste
|
||
der Browser mit Fenster starten (`headless: false`) – auf diesem Rechner
|
||
geht das, auf einem Server nicht. Für die spätere Prüfstrecke heißt das:
|
||
Seitenzahl und Inhalt maschinell prüfen, das Aussehen von Hand.
|
||
- Titel und Schritttexte werden beim Start des Durchlaufs kopiert statt
|
||
verwiesen. Ein Nachweis, der sich rückwirkend ändert, wenn jemand die
|
||
Vorlage anfasst, wäre keiner.
|
||
- Der Ausbilder darf das PDF abrufen und mitlesen, aber nicht abhaken. Erst
|
||
beim Schreiben der Aktion ist mir aufgefallen, dass „darf sehen" und „darf
|
||
bearbeiten" hier auseinanderfallen – daher zwei getrennte Prüffunktionen.
|
||
|
||
---
|
||
|
||
## 2026-09-10 · Baustein 5 – Praxisaufgaben
|
||
|
||
| Von | Bis | Dauer | Tätigkeit |
|
||
|---|---|---|---|
|
||
| 11:55 | 12:05 | 0:10 | Datenmodell für Aufgabenstand und Anhänge, Migration, Schema |
|
||
| 12:05 | 12:20 | 0:15 | Dateiregeln (Typen, Größe, Namenssäuberung, Speicherpfad) und 24 Tests dazu |
|
||
| 12:20 | 12:35 | 0:15 | Repositories, Serveraktionen, Ausliefer-Route mit Rechteprüfung |
|
||
| 12:35 | 13:00 | 0:25 | Aufgabenliste, Aufgabenseite, Bewertungsformular, Abnahme |
|
||
| 13:00 | 13:20 | 0:20 | Durchstich – dabei den 1-MB-Deckel gefunden und behoben |
|
||
| 13:20 | 13:35 | 0:15 | Fremdzugriff geprüft, Seiten auf 404 umgestellt, Screenshots, Dokumente |
|
||
|
||
**Summe Baustein 5: rund 1 h 40 min**
|
||
|
||
### Was aufgefallen ist
|
||
|
||
- **Der wichtigste Fund des Tages:** Next.js begrenzt Serveraktionen ab Werk auf
|
||
1 MB Rumpfgröße. Meine eigene Grenze von 25 MB war damit nie erreichbar –
|
||
jedes Handyfoto (2 bis 5 MB) wäre stillschweigend gescheitert, mit einem
|
||
Fehler nur im Serverprotokoll. Genau das Abnahmekriterium „eine Praxisaufgabe
|
||
mit Foto abgeben" hätte nicht funktioniert. Gefunden hat den Fehler nur der
|
||
Durchstich mit einer echten Datei, nicht die Testdatei mit 200 Byte.
|
||
Gegenprobe danach: 3,8-MB-Foto hochgeladen, kommt mit 3 987 781 Byte zurück.
|
||
- Die eigene Fehlerseite für „kein Zugriff" hat nicht funktioniert, weil
|
||
Next.js Fehlermeldungen im Produktionsbetrieb schwärzt – der Text kommt nie
|
||
im Browser an. Statt daran herumzubasteln liefern die Seiten jetzt 404. Das
|
||
ist ohnehin die bessere Antwort: Ob es die Daten gibt, geht einen Unbefugten
|
||
nichts an. Die Anhang-Route machte das von Anfang an so.
|
||
- Anhänge hängen an Aufgabe **und** Azubi. Beim ersten Entwurf hätte ein
|
||
zweiter Azubi die Fotos des ersten an derselben Aufgabe gesehen.
|
||
- Geprüft mit einem eigens angelegten zweiten Ausbilderkonto: fremder Anhang
|
||
404, eigener 200, der zuständige Ausbilder 200. Danach wieder gelöscht.
|
||
|
||
---
|
||
|
||
## 2026-09-10 · Baustein 4 – Merkkarten
|
||
|
||
| Von | Bis | Dauer | Tätigkeit |
|
||
|---|---|---|---|
|
||
| 11:00 | 11:20 | 0:20 | Wiederholungsverfahren: SM-2 auf drei Bewertungsstufen eingedampft, Fächer, Stapelauswahl |
|
||
| 11:20 | 11:35 | 0:15 | 29 Tests dazu – einer schlug an, der Test war falsch, nicht der Code (siehe unten) |
|
||
| 11:35 | 11:50 | 0:15 | Migration, Schema, Repository, Serveraktion für die Bewertung |
|
||
| 11:50 | 12:15 | 0:25 | Lernmodus: Karte, Umdrehen, Wischen, Tastatur; Kartenübersicht mit Fächern |
|
||
| 12:15 | 12:30 | 0:15 | Durchstich am Rechner und am Handy, zwei Mängel am Handy behoben |
|
||
| 12:30 | 12:40 | 0:10 | Karten in den Wochenfortschritt gehängt, Dokumente nachgezogen |
|
||
|
||
**Summe Baustein 4: rund 1 h 40 min**
|
||
|
||
### Was aufgefallen ist
|
||
|
||
- Ein Test schlug fehl: „gibt einen leeren Stapel zurück, wenn nichts fällig
|
||
ist". Der Code lieferte eine nie gelernte Karte zurück – und hatte recht.
|
||
Eine Karte ohne Fälligkeitsdatum muss immer fällig sein, sonst käme sie nie
|
||
dran. Ich habe die Erwartung korrigiert und den Fall in zwei Tests getrennt.
|
||
- „nochmal" muss die Karte **in derselben Sitzung** wiederbringen. Sie nur auf
|
||
morgen zu legen, wäre folgenlos gewesen – man drückt „nochmal" ja gerade,
|
||
weil man sie jetzt noch einmal sehen will.
|
||
- Am Handy legte der Browser beim Antippen eine blaue Fläche über die ganze
|
||
Lernkarte. `-webkit-tap-highlight-color: transparent` behebt das; ohne einen
|
||
Blick auf ein echtes Gerätemaß wäre es nie aufgefallen.
|
||
- Die Kopfzeile brauchte am Handy drei Zeilen und schob die Karte nach unten.
|
||
Jetzt: Marke und Bedienung in einer Zeile, Navigation darunter zum Schieben.
|
||
- Der Stapel wird bei 20 Karten gedeckelt. Ohne Deckel sitzt jemand nach drei
|
||
Wochen Pause vor 52 Karten und macht es gar nicht.
|
||
|
||
---
|
||
|
||
## 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.
|
||
|
||
---
|
||
|
||
<!-- Neue Bausteine werden oben angefügt, damit der aktuelle Stand zuerst steht. -->
|