docs/ANLEITUNG.md: 20 Abschnitte, 27 Bildschirmfotos, getrennt fuer Ausbilder und Azubi, dazu "Wenn etwas nicht geht". Die Bilder entstehen automatisiert ueber npm run screenshots - was dort steht, ist gemessen und nicht gemalt. scripts/pruefungen/abnahme.mjs (npm run abnahme) laeuft gegen eine frische, leere Datenbank in einem Wegwerfverzeichnis: aufsetzen, Konten anlegen, arbeiten, abnehmen, sichern, beschaedigen, zurueckspielen. Eine Sicherung, die nie zurueckgespielt wurde, ist keine Sicherung. 33 von 33 Pruefungen erfuellt, Protokoll in docs/ABNAHME.md. Dabei drei echte Fehler gefunden, alle in Wegen, die nie ausgefuehrt worden waren: - Die Sicherungsskripte liefen nicht in Git Bash, obwohl das in ihrem Kopf stand: tar deutet den Doppelpunkt in "C:\..." als Rechnernamen. Beide wechseln jetzt erst ins Verzeichnis und uebergeben einen blossen Dateinamen. - Auf einer frischen Datenbank gibt es noch kein Wochenblatt; der Weg jedes neuen Azubis war nie durchlaufen worden. - Der Abnahmelauf selbst liess unter Windows seinen Server ueberleben (kill() beendet nur die cmd.exe) und prueft deshalb jetzt vorher, ob der Port frei ist - sonst haette er gegen fremde Daten geprueft. Fassung 1.0.0: package.json stand noch auf 0.1.0, waehrend das Aenderungsprotokoll bei 0.9.0 war. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
383 lines
21 KiB
Markdown
383 lines
21 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-11 · Baustein 10 – PWA, Offline, Druck, Anleitung
|
||
|
||
| Von | Bis | Dauer | Tätigkeit |
|
||
|---|---|---|---|
|
||
| 14:20 | 14:50 | 0:30 | Symbole, Manifest, Dienstarbeiter mit Speicherregel |
|
||
| 14:50 | 15:10 | 0:20 | Warteschlange, Schnittstelle, Netzleiste |
|
||
| 15:10 | 15:30 | 0:20 | Druckpalette, Seitenumbrüche, Druckknöpfe |
|
||
| 15:30 | 15:50 | 0:20 | Durchstich mit echtem Abschalten des Netzes |
|
||
| 15:50 | 16:20 | 0:30 | Anleitung mit Bildschirmfotos |
|
||
| 16:20 | 17:40 | 1:20 | Abnahmelauf – und die Suche nach einem Fehler, der meiner war |
|
||
|
||
**Summe Baustein 10: rund 3 h 20 min**
|
||
|
||
### Was aufgefallen ist
|
||
|
||
- Beim Offlinebetrieb ist die interessante Frage nicht, **wie** man
|
||
zwischenspeichert, sondern **was**. Ein Dienstarbeiter, der alles ablegt,
|
||
hebelt die Rechteprüfung aus: Was im Browsercache liegt, wird nie wieder
|
||
serverseitig geprüft. Deshalb gibt es eine ausdrückliche Liste – Handouts,
|
||
Merkkarten, Glossar, eigene Woche – und sonst nichts. Der Durchstich prüft
|
||
das nach, indem er eine Kontrollseite öffnet und danach im Speicher
|
||
nachsieht.
|
||
- Die Warteschlange gehört an die **Benutzerkennung**, nicht an das Gerät. Ein
|
||
Werkstattrechner wird geteilt; unter einem festen Schlüssel bekäme der
|
||
Zweite die offenen Bewertungen des Ersten aufs Konto.
|
||
- Der Tag einer nachgereichten Bewertung kommt vom Gerät – sonst verliert
|
||
jemand, der freitags im Keller lernt und sich montags verbindet, seinen
|
||
Freitag. Er wird aber **auf heute gedeckelt**: Sonst ließe sich das
|
||
Wiederholen wegstellen, indem man die Uhr vordatiert.
|
||
- Beim Druck lag ein echter Fehler: Wer die dunkle Fassung eingestellt hatte,
|
||
druckte schwarze Flächen. Aufgefallen ist das erst, weil der Durchstich die
|
||
Farben im Druckmodus ausliest, statt nur zu prüfen, dass die Navigation
|
||
verschwindet.
|
||
- **Die längste Suche des Tages war ein Fehler in meinem Prüfaufbau, nicht in
|
||
der Anwendung.** Der Abnahmelauf startet einen eigenen Server auf Port 3399.
|
||
Unter Windows beendet `kill()` bei einem über die Eingabeaufforderung
|
||
gestarteten Prozess nur diese, nicht Node darunter. Der alte Server überlebte,
|
||
belegte den Port, und der nächste Lauf prüfte gegen den **alten**
|
||
Datenbestand: Der Azubi stand in der Oberfläche, aber nicht in der Datenbank,
|
||
die ich las. Jetzt wird ohne Eingabeaufforderung gestartet, der ganze
|
||
Prozessbaum beendet – und der Lauf bricht mit einer klaren Meldung ab, wenn
|
||
der Port schon belegt ist.
|
||
- Die Sicherungsskripte behaupteten im Kopf, sie liefen auch in Git Bash. Das
|
||
stimmte nicht: `tar` deutet den Doppelpunkt in `C:\...` als Rechnernamen.
|
||
Aufgefallen ist das erst, als die Sicherung zum ersten Mal wirklich
|
||
zurückgespielt wurde – eine Sicherung, die man nie zurückspielt, ist keine.
|
||
|
||
---
|
||
|
||
## 2026-09-11 · Baustein 9 – Auswertung und Feedbackgespräch
|
||
|
||
| Von | Bis | Dauer | Tätigkeit |
|
||
|---|---|---|---|
|
||
| 11:10 | 11:25 | 0:15 | Abdeckungsregel als reine Funktion, 17 Tests |
|
||
| 11:25 | 11:35 | 0:10 | Datensammlung, Feedback-Vorlage als Inhaltsdatei |
|
||
| 11:35 | 11:50 | 0:15 | Datenmodell, Repository, Gesprächsinhalt mit 13 Tests |
|
||
| 11:50 | 12:10 | 0:20 | PDF, Auswertungsseite, Gesprächsbogen |
|
||
| 12:10 | 12:40 | 0:30 | Prüfen und Durchstich – stark ausgebremst durch die Maschine |
|
||
| 12:40 | 13:30 | 0:50 | Durchstichskript, Rechteprüfung mit zweitem Azubikonto |
|
||
| 13:30 | 14:15 | 0:45 | Feinschliff am abgeschlossenen Bogen, Abweichung im PDF |
|
||
|
||
**Summe Baustein 9: rund 3 h**
|
||
|
||
### Was aufgefallen ist
|
||
|
||
- Die eigentliche Entscheidung dieses Bausteins ist die Frage, **wann eine
|
||
Berufsbildposition als vermittelt gilt.** Eine naive Zählung („Inhalt
|
||
vorhanden") wäre wertlos: Dann wäre die Abdeckung von Anfang an voll. Ein
|
||
gelesenes Handout allein genügt ebenfalls nicht – sonst wäre sie nach dem
|
||
ersten Klick voll. Jetzt zählt eine abgenommene Aufgabe oder ein
|
||
abgeschlossener Checklisten-Durchlauf, oder zwei gelesene Handouts.
|
||
- Die vierte Lage – **„ohne Inhalt"** – ist die wichtigste und fiel mir erst
|
||
beim Schreiben auf. Eine Position, zu der es im ganzen Lehrgang kein Material
|
||
gibt, ist keine Lücke beim Azubi, sondern eine im Lehrgang. Ohne eigene
|
||
Kennzeichnung würde sie zwischen den unbearbeiteten Positionen verschwinden.
|
||
Im Beispielinhalt betrifft das fünf Positionen (A4, A10, C1, C2, C5).
|
||
- Beim Feedbackgespräch war die getrennte Bewertung beider Seiten die beste
|
||
Entscheidung. Der Wert des Blattes liegt nicht in den Zahlen, sondern in den
|
||
Stellen, wo sie auseinandergehen.
|
||
- Beim Blick auf den **abgeschlossenen** Bogen fiel auf, dass er wie ein
|
||
Formular aussah statt wie ein Dokument: gesperrte Eingabefelder, leere
|
||
Bemerkungszeilen mit Platzhaltern, ein zweites Datumsfeld neben dem Datum im
|
||
Kopf – und neben „bestätigt" stand ein offener Kreis. Ein Blatt für die Akte
|
||
soll nach Abschluss nur noch gelesen werden; jetzt sieht es auch so aus.
|
||
- Die Zwei-Stufen-Regel für Abweichungen stand an zwei Stellen und sollte im
|
||
PDF eine dritte bekommen. Sie ist jetzt `liegtWeitAuseinander()` in
|
||
`src/lib/feedback/inhalt.ts`, mit eigenen Tests – Ansicht, Übersicht und PDF
|
||
fragen dieselbe Funktion.
|
||
- **Die Maschine war der Engpass, nicht die Arbeit.** Docker Desktop hatte über
|
||
fünf Stunden CPU-Zeit verbraucht und der Defender-Echtzeitschutz läuft über
|
||
`node_modules`; ein einzelner Testlauf brauchte 4605 Sekunden bei 283 ms
|
||
reiner Rechenzeit. Ich habe das Vorgehen umgestellt: erst alles schreiben,
|
||
dann **einmal** prüfen, statt nach jedem Schritt.
|
||
|
||
---
|
||
|
||
## 2026-09-11 · Baustein 8 – Lernzielkontrollen
|
||
|
||
| Von | Bis | Dauer | Tätigkeit |
|
||
|---|---|---|---|
|
||
| 06:25 | 06:35 | 0:10 | Notenschlüssel und Auswertung als reine Rechnung, 15 Tests |
|
||
| 06:35 | 06:45 | 0:10 | Sichtbarkeitsschicht für die Musterlösung, 21 Tests |
|
||
| 06:45 | 06:55 | 0:10 | Datenmodell, Migration, Repository, Serveraktionen |
|
||
| 06:55 | 07:15 | 0:20 | Fragebogen mit Zwischenspeichern, Korrekturansicht, Übersichten |
|
||
| 07:15 | 08:50 | 1:35 | Bau und Durchstich – davon über eine Stunde Wartezeit (siehe unten) |
|
||
|
||
**Summe Baustein 8: rund 2 h 25 min, davon knapp 1 h reine Wartezeit**
|
||
|
||
### Was aufgefallen ist
|
||
|
||
- Der Kern dieses Bausteins ist eine einzige Funktion: `sichtbareKontrolle()`
|
||
entfernt die Musterlösung, bevor die Daten in die Ausgabe gelangen. Sie nimmt
|
||
bewusst den ganzen Betrachter und den Bearbeitungsstand entgegen statt eines
|
||
vorberechneten Wahrheitswerts – so kann kein Aufrufer versehentlich `true`
|
||
übergeben.
|
||
- Beim Lecktest zunächst ein Fehlalarm: Die Prüfung meldete
|
||
„Discover, Offer, Request, Acknowledge" im Quelltext. Das war meine **eigene
|
||
Testantwort**, die ich zuvor eingetippt hatte. Danach ein sauberer Aufbau,
|
||
der die Musterlösungen direkt aus der Inhaltsdatei liest und gegen Text
|
||
prüft, den ich nicht selbst eingebe. Ergebnis: vor der Abgabe null Treffer,
|
||
nach der Abgabe alle fünf – damit ist auch belegt, dass die Suche überhaupt
|
||
finden kann.
|
||
- **Eine Stunde an der Umgebung verloren.** Erst hing `next build` endlos, weil
|
||
der laufende Server `.next` festhielt und ich ihn mitten im Schreiben
|
||
abgeschossen hatte. Nach `Remove-Item .next -Recurse` lief der Bau in acht
|
||
Sekunden. Danach brauchte `next start` **2822 Sekunden** bis „Ready" – das
|
||
Dateisystem war zu dem Zeitpunkt extrem langsam, vermutlich ein Virenscanner
|
||
über dem frisch gebauten Verzeichnis. Lehre: Vor einem Bau immer erst den
|
||
Server stoppen, und ein hängender Start ist nicht zwingend ein Codefehler.
|
||
- Die laufende Summe beim Korrigieren war nachträglich die beste Idee an der
|
||
Oberfläche: Man sieht beim Verteilen der Punkte, auf welcher Note man landet,
|
||
statt es hinterher zu erfahren.
|
||
|
||
---
|
||
|
||
## 2026-09-10 · Baustein 7 – Berichtsheft
|
||
|
||
| Von | Bis | Dauer | Tätigkeit |
|
||
|---|---|---|---|
|
||
| 21:50 | 22:05 | 0:15 | Prüflogik: Stunden, Floskeln, schützenswerte Angaben – mit 31 Tests |
|
||
| 22:05 | 22:15 | 0:10 | Vorschläge aus dem System, Formulierungshilfe, 15 Tests |
|
||
| 22:15 | 22:25 | 0:10 | Datenmodell, Migration, Repository |
|
||
| 22:25 | 22:40 | 0:15 | PDF im IHK-Layout mit Kästen, Stundenspalten und Unterschriften |
|
||
| 22:40 | 23:00 | 0:20 | Seiten, Formulare, Abzeichnen, Tagesnotizen |
|
||
| 23:00 | 23:15 | 0:15 | Durchstich über den ganzen Weg, zwei Fehler behoben |
|
||
|
||
**Summe Baustein 7: rund 1 h 25 min**
|
||
|
||
### Was aufgefallen ist
|
||
|
||
- Die Floskelprüfung war der kniffligste Teil. „Diverse Arbeiten" ist eine
|
||
Floskel, „Diverse Patchkabel konfektioniert und beschriftet" nicht. Gelöst
|
||
über zwei Bedingungen: Die Prüfung schlägt an, wenn die Floskel den Eintrag
|
||
im Wesentlichen ausmacht **oder** wenn im ganzen Eintrag kein einziges
|
||
Tätigkeitsverb vorkommt.
|
||
- Bei den Kundennamen hat ein Test einen echten Fehler gefunden: „Beispiel
|
||
e. V." wurde nicht erkannt. Ursache war ein `\b` am Ende des Musters – nach
|
||
einem Punkt gibt es vor einem Leerzeichen keine Wortgrenze. Ersetzt durch
|
||
einen negativen Vorausblick.
|
||
- ESLint hat wieder einen echten Bug gefunden: Das Abzeichnen-Formular hatte
|
||
gar keine `action`, der Knopf hätte nichts bewirkt. Sichtbar wurde das nur
|
||
über die Meldung „Serveraktion zugewiesen, aber nie benutzt".
|
||
- Im PDF-Kopffeld liefen die beiden Spalten auseinander, weil ich `dokument.y`
|
||
als Bezugspunkt in der Schleife benutzt habe – der Wert wandert aber bei
|
||
jedem Schreibvorgang weiter. Wieder etwas, das erst beim Ansehen auffiel.
|
||
- Beim Prüfen des PDF-Zugriffs ohne Anmeldung kam zunächst 200. Erst der
|
||
zweite Blick mit `maxRedirects: 0` zeigte: 307 auf /anmelden, 0 Byte, kein
|
||
PDF. Playwright war der Weiterleitung gefolgt. Merke: Bei
|
||
Berechtigungsprüfungen nie den Weiterleitungen folgen lassen.
|
||
- Die laufende Nummer eines Wochenblatts richtet sich nach dem Zeitraum, nicht
|
||
nach der Reihenfolge des Anlegens. Wer eine Woche nachträgt, soll Nr. 3
|
||
bekommen und nicht Nr. 12 – die dahinterliegenden Blätter rücken auf.
|
||
|
||
---
|
||
|
||
## 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. -->
|