aYOUne

Changelog

What changed — grouped by release, filterable by component and repository.

No milestone 2
Fix courses

Wiederholungs-Versuche deckeln und benennen

Am laufenden Dienst gefunden, nicht am Reissbrett: nach dem Abschluss
eines Durchgangs fiel der Stand bei der naechsten Antwort kommentarlos
von 2/2 auf 1/2 zurueck. Ursache ist ein NEUER Ergebnis-Datensatz —
richtig im Ergebnis (Exams.retries sieht Wiederholungen vor), aber
unangekuendigt und ohne Deckel.

Drei Maengel behoben:

1. `retries` wird geprueft. Die Lesart ist ausdruecklich festgeschrieben:
retries sind die WIEDERHOLUNGEN, der erste Durchgang zaehlt nicht dazu
(retries:2 = drei Durchgaenge). Der Vertrag sagt es nicht, und beide
Lesarten sind vertretbar - wer sie anders liest, deckelt um eins
daneben. Aufgebraucht -> 409 versuche-aufgebraucht.

2. Der NEUESTE Versuch bestimmt den Stand. Liste und Detail sortierten
nicht; bei mehreren Ergebnis-Datensaetzen war unbestimmt, welcher den
Stand liefert - die Uebersicht zeigte je nach Fund-Reihenfolge der
Datenbank mal den alten, mal den neuen.

3. Die Antwort meldet `neuerVersuch`, damit die Oberflaeche den
Ruecksprung erklaeren kann statt ihn geschehen zu lassen.

Dabei von der Testreihe eine Null-Falle gefangen: Number(null) ist 0,
nicht NaN - ein nicht gesetztes `retries` haette den Deckel still auf
EINEN Durchgang gesenkt statt auf den Vorgabewert zu fallen.

69 Tests, Flip-Probe auf den Deckel gefahren.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
New courses

eigene Einarbeitung am Arbeitsplatz (kiosk-w5, Punkt 17)

Zugewiesene Kurse, Lektionen, Fragen und Pflichtaufgaben mit Frist —
ausschliesslich die EIGENEN. Der Besitzer kommt aus dem Anmeldezeichen,
nie aus dem Aufruf: der Arbeitsplatz ist ein geteiltes Werkstatt-Geraet.

GET /courses/own
GET /courses/own/:id
POST /courses/:id/actions/answer-own
GET /mandatorytasks/own
POST /mandatorytasks/:id/actions/acknowledge-own

Kein eigener Fortschritts-Traeger: geschrieben wird `ExamResults` (Modul
hub, sichtbar unter hub.examresults). Wer am Kiosk eine Lektion
abschliesst, hat sie abgeschlossen — nicht „am Kiosk abgeschlossen".

Die Bewertung macht der Server. `answers[].correct` wird entfernt, bevor
eine Frage das Geraet erreicht; die Oberflaeche kennt die Loesung nicht.

Zwei Zuweisungs-Wege (Team + Pflichtaufgabe), weil der Bestand zwei
fuehrt — ohne beide waere eine leere Liste mehrdeutig. Ohne offenen Weg
entsteht KEIN Filter (sonst lieferte er alle Kurse des Mandanten).

Vier eigene Rechte ueber additionalRights, kaskadenfrei — bewusst nicht
`hr.courses`/`hr.mandatorytasks`: das sind die Rechte der
Personalabteilung auf ALLE Datensaetze.

Teams/Exams/ExamResults zu modelsToLoad (fallen durch den hr-Filter);
alle drei am installierten Paket geprueft, Umkehrprobe negativ.

60 Tests, drei Flip-Proben gefahren (Null-Weg-Riegel, Loesungs-Leck,
Mengen-Gleichheit) — alle beissen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>