diff --git a/specs/032-backup-scheduling-mvp/spec.md b/specs/032-backup-scheduling-mvp/spec.md index 37f8e8c..0aba1ba 100644 --- a/specs/032-backup-scheduling-mvp/spec.md +++ b/specs/032-backup-scheduling-mvp/spec.md @@ -16,6 +16,11 @@ ## Goals - Retention löscht alte Backups nach Policy. - Filament UI: Schedules verwalten, Run-History ansehen, “Run now”, “Retry”. +## Clarifications + +### Session 2026-01-05 +- Q: Wie sollen wir mit `policy_types` umgehen, die nicht in `config('tenantpilot.supported_policy_types')` enthalten sind? → A: Beim Speichern hart validieren und ablehnen; zur Laufzeit defensiv re-checken (Legacy/DB), unknown types skippen und Run als `partial` markieren mit `error_code=UNKNOWN_POLICY_TYPE` und Liste betroffener Types. + ## Non-Goals (MVP) - Kein Kalender-UI als Pflicht (kann später ergänzt werden). - Kein Cross-Tenant Bulk Scheduling (MSP-Templates später). @@ -37,6 +42,9 @@ ### Functional Requirements - **FR-003**: Run nutzt bestehende Services: - Sync Policies (nur selektierte policy types) - Create BackupSet aus lokalen Policy-IDs (inkl. Foundations optional) +- **FR-003a**: `policy_types` sind ausschließlich Keys aus `config('tenantpilot.supported_policy_types')`. +- **FR-003b**: UI/Server-side Validation verhindert das Speichern unbekannter `policy_types`. +- **FR-003c**: Laufzeit-Validierung (defensiv): Unbekannte `policy_types` werden geskippt; wenn mindestens ein gültiger Type verarbeitet wurde, wird der Run als `partial` markiert und `error_code=UNKNOWN_POLICY_TYPE` gesetzt (inkl. Liste der betroffenen Types in `summary`). - **FR-004**: Run schreibt `backup_schedule_runs` mit Status + Summary + Error-Codes. - **FR-005**: “Run now” erzeugt sofort einen Run (scheduled_for=now) und dispatcht Job. - **FR-006**: “Retry” erzeugt einen neuen Run für denselben Schedule. @@ -114,4 +122,5 @@ ## Acceptance Criteria - UI zeigt Last Run + Next Run + Run-History. - Run now startet sofort. - Fehlerfälle (Token/Permission/Throttle) werden als failed/partial markiert mit error_code. +- Unbekannte `policy_types` können nicht gespeichert werden; falls Legacy-Daten vorkommen, werden sie zur Laufzeit geskippt und der Run wird als `partial` markiert mit `error_code=UNKNOWN_POLICY_TYPE`. - Retention hält nur die letzten N BackupSets pro Schedule.