feat: Sitzungsfreigabe für MCP-Bestätigungen + LessonStatus.Cancelled

Sitzungsfreigabe: McpConfirmDialog bietet zwei Checkboxen ("diese Art
von Aktion" / "alle KI-Aktionen für den Rest der Sitzung nicht mehr
nachfragen"), nur beim Bestätigen wirksam. IMcpConfirmationService.
ConfirmAsync bekommt einen per [CallerMemberName] automatisch
befüllten operationKey - kein bestehender Aufruf musste geändert
werden. Freigaben leben als In-Memory-Bookkeeping auf der
Confirmation-Service-Instanz, gelten bis App-Ende, werden aber trotzdem
geloggt, damit stillschweigende Bestätigungen nicht spurlos bleiben.
Grund: 17 identische Bestätigungen in Folge für eine neu generierte
Unterrichtseinheit sind unzumutbar.

LessonStatus.Cancelled ("Ausgefallen") als Alternative zu
delete_lesson für Stunden, die nur ausgefallen sind (Exkursion,
Feiertag), aber als Ereignis dokumentiert bleiben sollen. Als
Cancelled=4 angehängt (bestehende LiteDB-Werte 0/1 sind fix). Konsistent
wie "bereits durchgeführt" behandelt an allen Stellen, die bisher nur
auf Conducted prüften: Terminverschiebung, Fortschrittsanzeige,
Hausaufgabe-kontrollieren-Erinnerung, "nächste Stunde"-Vorschlag.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-12 02:25:45 +02:00
co-authored by Claude Sonnet 5
parent a4733c156b
commit 19aa302487
16 changed files with 231 additions and 25 deletions
+39
View File
@@ -2684,6 +2684,45 @@ folgenden Punkte gehören direkt in `LehrerApp.Desktop`:
stillschweigend zu überschreiben (die bestehende `EnsureTargetIsFree`-Prüfung in
`LessonSchedulingService` greift unverändert).
- [x] **4.5.32** Sitzungsfreigabe für den Bestätigungsdialog + `LessonStatus.Cancelled`
(2026-09-12, Nutzer-Feedback: 17x "Phase hinzufügen" einzeln bestätigen müssen ist
unzumutbar).
- **Sitzungsfreigabe:** `McpConfirmDialog` bietet jetzt zwei Checkboxen ("diese Art von
Aktion" / "alle KI-Aktionen für den Rest der Sitzung nicht mehr nachfragen"), nur beim
Bestätigen wirksam (Ablehnen + Checkbox wäre widersprüchlich, wird ignoriert — siehe
`McpConfirmDialog.axaml.cs`). `IMcpConfirmationService.ConfirmAsync` bekommt einen neuen
`operationKey`-Parameter, bewusst per `[CallerMemberName]` automatisch befüllt (Name der
aufrufenden Tool-Methode, z.B. "AddLessonPhase") — kein bestehender Aufruf in den
Tool-Klassen musste dafür geändert werden. Freigaben leben als reines In-Memory-Bookkeeping
auf der `AvaloniaMcpConfirmationService`-Singleton-Instanz, gelten bis zum Beenden der App
(neuer Prozess = neue Instanz = wieder alles ungetraut), nie persistiert. Automatisch
bestätigte Aufrufe werden trotzdem geloggt (`AppLogger.Info`), damit stillschweigende
Bestätigungen nicht spurlos bleiben.
- **`LessonStatus.Cancelled`** ("Ausgefallen") als Alternative zu `delete_lesson`, wenn eine
Stunde nur ausgefallen ist (Exkursion, Feiertag, Vertretung), aber als Ereignis
dokumentiert bleiben soll — als `Cancelled = 4` angehängt (nicht eingefügt, siehe
Kommentar auf dem Enum: bestehende LiteDB-Werte 0/1 sind fix). `delete_lesson`s
Tool-Beschreibung weist jetzt aktiv auf diese Alternative hin.
`LessonStatusDisplay.Options`/`ToName`/`FromName` erweitert — der bestehende
Status-Auswahl-`ComboBox` in `LessonDialog.axaml` (bindet bereits an `StatusOptions`)
zeigt "Ausgefallen" dadurch automatisch an, ohne XAML-Änderung.
- Konsistente Behandlung wie bereits durchgeführte Stunden an allen Stellen, die bisher
nur auf `Conducted` prüften (eine ausgefallene Stunde ist ebenfalls "resolved", nicht
mehr offen): `LessonSchedulingService.Move`/`SplitAndMoveSecondPart` (nicht mitverschoben
bzw. Fortsetzung auf Entwurf zurückgesetzt), `GroupOverviewViewModel.LoadNextLesson`
(nicht als nächste Stunde vorgeschlagen), `AdvanceLessonStatus` (Endzustand, kein
Weiterschalten). Fortschrittsanzeige (`UnitSummary`) zählt ausgefallene Stunden weder
zum Pensum noch zu den gehaltenen Stunden (Nenner sinkt statt künstlich zu wachsen).
- `LoadOpenHomeworkCheck`/`HasUnhandledHomework` (Hausaufgabe-kontrollieren-Erinnerung)
überspringen ausgefallene Stunden bei der Suche nach der "letzten Stunde" — sonst hätte
eine ausgefallene Stunde mit liegengebliebenem Hausaufgabentext fälschlich weiter genagt.
- 9 neue Tests: 2 in
[LessonSchedulingServiceTests.cs](LehrerApp.Desktop.Tests/LessonSchedulingServiceTests.cs),
neues [LessonStatusDisplayTests.cs](LehrerApp.Desktop.Tests/LessonStatusDisplayTests.cs)
(Round-Trip aller Status-Namen + Fortschrittsberechnung), 1 in
[McpToolsTests.cs](LehrerApp.Desktop.Tests/McpToolsTests.cs) (belegt den
`[CallerMemberName]`-Mechanismus ohne echtes UI).
**Wichtige Abweichung von der ursprünglichen Planung (5.2):** Vor der Umsetzung zeigte sich,
dass 5.2 wie ursprünglich beschrieben eine zweite, parallele Fehlzeiten-Erfassung neben dem
bereits bestehenden Anwesenheits-Tracking aus Kapitel 3 (`ParticipationEntry.Attendance`,