diff --git a/backend/lernen.py b/backend/lernen.py index 0f690d2..b751b14 100644 --- a/backend/lernen.py +++ b/backend/lernen.py @@ -29,7 +29,8 @@ KRITIK_MAX_RUNDEN = 2 # Generator → Kritiker → ggf. Neu, höchstens so oft def score_berechnen( - score_vor_frage: int, gut: bool, streak: int, tier2: bool, tier3: bool, absolviert: bool, gemeistert: bool, + score_vor_frage: int, gut: bool, streak: int, tier2: bool, tier3: bool, + absolviert: bool, verstanden: bool, gemeistert: bool, ) -> int: """Neuer Score nach einer Antwort · driftfrei (immer aus dem Basis-Score gerechnet). @@ -44,6 +45,12 @@ def score_berechnen( """ if gemeistert: return MEISTERN + # Stufe richtet sich nach dem Baustein-Fortschritt, nicht nur nach den + # Guide-Flags: ein frischer Baustein durchläuft erst Tier 1 (0→3), auch + # wenn der Guide schon tier2/tier3 freigibt. Tier 2 erst ab absolviert, + # Tier 3 erst ab verstanden. + tier2 = tier2 and absolviert + tier3 = tier3 and verstanden if not tier2: floor, cap, strafe = (NOETIG if absolviert else 0), NOETIG, 0 elif not tier3: diff --git a/backend/routes.py b/backend/routes.py index 9f1d716..7de8683 100644 --- a/backend/routes.py +++ b/backend/routes.py @@ -252,7 +252,7 @@ async def baustein_pruefung_route(req: BausteinPruefungRequest): ) if data is None: raise HTTPException(502, "Bewertung fehlgeschlagen — bitte erneut versuchen") - score = score_berechnen(req.score_vor_frage, data["bewertung"] == "gut", req.streak, req.tier2, req.tier3, absolviert, gemeistert) + score = score_berechnen(req.score_vor_frage, data["bewertung"] == "gut", req.streak, req.tier2, req.tier3, absolviert, verstanden, gemeistert) return {"feedback": data["feedback"], "bewertung": data["bewertung"], "gute_antworten": score, "absolviert": absolviert, "verstanden": verstanden, "gemeistert": gemeistert} @@ -265,7 +265,7 @@ async def baustein_pruefung_route(req: BausteinPruefungRequest): # Score driftfrei aus dem Basis-Score rechnen (Re-Bewertung ersetzt das vorige Ergebnis). score = score_berechnen( - req.score_vor_frage, data["bewertung"] == "gut", req.streak, req.tier2, req.tier3, absolviert, gemeistert, + req.score_vor_frage, data["bewertung"] == "gut", req.streak, req.tier2, req.tier3, absolviert, verstanden, gemeistert, ) gute = await set_baustein_score(req.topic, req.baustein, score) if score >= NOETIG and not absolviert: