feat: KI-Foto-Auto-Ablehnung + Strafpunkte als Punktedeckel (UC31/UC57) #29

Merged
ingo merged 2 commits from bugfix/penalty-points-autoapprove into master 2026-06-12 09:44:56 +02:00
Owner

KI-Foto-Bewertung (Policy auto_approve_on_max) darf jetzt auch ablehnen:

  • verdict=ja + Score erreicht -> auto_approved
  • verdict=nein -> rejected mit KI-Begründung im reviewer_comment (Team
    sichtbar), AUSSER beim letzten verfügbaren Versuch (ohne Versuchslimit
    = Limit 1) -> bleibt pending, Spielleiter prüft manuell
  • verdict=unklar -> keine Automatik

Strafpunkte reduzieren jetzt die für eine Aufgabe erreichbaren Punkte
direkt (points_ceiling = max(0, points − Fehlversuche×penalty_points))
statt separater negativer Score-Events. Greift einheitlich für
auto-evaluierte Handler, KI-Foto-Bewertung und manuelle Admin-Freigabe.
Neuer Helper app/game/attempts.py bündelt die Logik.

Frontend:

  • Punkte-Chip zeigt "X von Y Pkt." — offen: noch erreichbar
    (points_remaining), gelöst: tatsächlich vergeben (awarded_points)
  • Abgelehnte Einreichungen zeigen Begründung + Strafpunkte/erreichbare
    Punkte; async KI-Ergebnis wird nach Task-Refetch in lastResult gespiegelt
  • Neue Komponente SubmissionHistory: Entscheidungsverlauf einer Aufgabe
    (alle Versuche mit Status, Punkten, Begründung) auf der Detailseite
  • PhotoAIReviewSection: Policy-Label/Hinweis an neues Verhalten angepasst

Tests: 18 neue Backend-Tests (attempts/points_ceiling, AI-Decision),
10 neue Frontend-Tests (SubmissionHistory, SubmissionResult,
ParticipantTaskCard, TaskDetailPage). 260 Backend-/67 Frontend-Tests grün.

Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com

KI-Foto-Bewertung (Policy auto_approve_on_max) darf jetzt auch ablehnen: - verdict=ja + Score erreicht -> auto_approved - verdict=nein -> rejected mit KI-Begründung im reviewer_comment (Team sichtbar), AUSSER beim letzten verfügbaren Versuch (ohne Versuchslimit = Limit 1) -> bleibt pending, Spielleiter prüft manuell - verdict=unklar -> keine Automatik Strafpunkte reduzieren jetzt die für eine Aufgabe erreichbaren Punkte direkt (points_ceiling = max(0, points − Fehlversuche×penalty_points)) statt separater negativer Score-Events. Greift einheitlich für auto-evaluierte Handler, KI-Foto-Bewertung und manuelle Admin-Freigabe. Neuer Helper app/game/attempts.py bündelt die Logik. Frontend: - Punkte-Chip zeigt "X von Y Pkt." — offen: noch erreichbar (points_remaining), gelöst: tatsächlich vergeben (awarded_points) - Abgelehnte Einreichungen zeigen Begründung + Strafpunkte/erreichbare Punkte; async KI-Ergebnis wird nach Task-Refetch in lastResult gespiegelt - Neue Komponente SubmissionHistory: Entscheidungsverlauf einer Aufgabe (alle Versuche mit Status, Punkten, Begründung) auf der Detailseite - PhotoAIReviewSection: Policy-Label/Hinweis an neues Verhalten angepasst Tests: 18 neue Backend-Tests (attempts/points_ceiling, AI-Decision), 10 neue Frontend-Tests (SubmissionHistory, SubmissionResult, ParticipantTaskCard, TaskDetailPage). 260 Backend-/67 Frontend-Tests grün. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
KI-Foto-Bewertung (Policy auto_approve_on_max) darf jetzt auch ablehnen:
- verdict=ja + Score erreicht -> auto_approved
- verdict=nein -> rejected mit KI-Begründung im reviewer_comment (Team
  sichtbar), AUSSER beim letzten verfügbaren Versuch (ohne Versuchslimit
  = Limit 1) -> bleibt pending, Spielleiter prüft manuell
- verdict=unklar -> keine Automatik

Strafpunkte reduzieren jetzt die für eine Aufgabe erreichbaren Punkte
direkt (points_ceiling = max(0, points − Fehlversuche×penalty_points))
statt separater negativer Score-Events. Greift einheitlich für
auto-evaluierte Handler, KI-Foto-Bewertung und manuelle Admin-Freigabe.
Neuer Helper app/game/attempts.py bündelt die Logik.

Frontend:
- Punkte-Chip zeigt "X von Y Pkt." — offen: noch erreichbar
  (points_remaining), gelöst: tatsächlich vergeben (awarded_points)
- Abgelehnte Einreichungen zeigen Begründung + Strafpunkte/erreichbare
  Punkte; async KI-Ergebnis wird nach Task-Refetch in lastResult gespiegelt
- Neue Komponente SubmissionHistory: Entscheidungsverlauf einer Aufgabe
  (alle Versuche mit Status, Punkten, Begründung) auf der Detailseite
- PhotoAIReviewSection: Policy-Label/Hinweis an neues Verhalten angepasst

Tests: 18 neue Backend-Tests (attempts/points_ceiling, AI-Decision),
10 neue Frontend-Tests (SubmissionHistory, SubmissionResult,
ParticipantTaskCard, TaskDetailPage). 260 Backend-/67 Frontend-Tests grün.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Vereinheitlicht Versuchslimit-, Strafpunkt- und Eskalationslogik in
app/game/attempts.py — gemeinsam genutzt von Auto-Handlern
(create_submission), KI-Foto (ai_review) und manueller Freigabe.

Neuer rallye-/laufweiter Modus `review_final_rejections` (Migration 0037,
Default true), per PATCH /admin/rallyes/{id} jederzeit umschaltbar, aus der
Vorlage geerbt:
- Modus a (true): die letzte automatische Ablehnung unter aktivem
  Versuchslimit wird nicht hart abgelehnt, sondern als 'pending' zur
  Spielleiter-Prüfung zurückgehalten (Marker _final_review_hold), blockiert
  weitere Abgaben (409 awaiting_final_review), zählt als verbrauchter Versuch.
- Modus b (false): vollautomatisch, auch die letzte Ablehnung ist final.

Greift einheitlich für alle Aufgabentypen. Ohne Versuchslimit kann ein Team
immer erneut abgeben -> keine endgültige Ablehnung, keine Eskalation. Das
frühere foto-spezifische effective_max_attempts (no-limit=1) entfällt.

Frontend: Admin-Toggle in den Rallye-Einstellungen; Teilnehmer sehen bei
zurückgehaltener letzter Ablehnung einen Spielleiter-Hinweis statt
"abgelehnt". Typen RallyeInfo/RallyeData/SubmissionOut erweitert.

Tests: neue test_uc57_final_review_escalation.py (generische Eskalation über
solution_word), angepasste AI-Decision-Tests für den Toggle, neue
SubmissionResult-Tests. 267 Backend-/69 Frontend-Tests grün.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ingo merged commit 0f9238122d into master 2026-06-12 09:44:56 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Projekte/TeamRallye!29
No description provided.