docs(16): create phase plan

This commit is contained in:
2026-08-06 14:42:44 +02:00
parent 3dfa671ec9
commit c4a25511f3
3 changed files with 21 additions and 11 deletions
+10
View File
@@ -565,11 +565,21 @@ Plans:
**Plans**: 5 plans **Plans**: 5 plans
Plans: Plans:
**Wave 1**
- [ ] 16-01-PLAN.md — Tracer: Schema-Erweiterung (internalName, ldapObjectGuid) + AD-Gruppen-Import end-to-end (D-01, D-02, D-04) - [ ] 16-01-PLAN.md — Tracer: Schema-Erweiterung (internalName, ldapObjectGuid) + AD-Gruppen-Import end-to-end (D-01, D-02, D-04)
**Wave 2** *(blocked on Wave 1 completion)*
- [ ] 16-02-PLAN.md — GroupsService: Standardgruppen-Handoff, Namenssperre, interner Name, Anzeige-Fallback (D-03, D-04, D-06, D-07) - [ ] 16-02-PLAN.md — GroupsService: Standardgruppen-Handoff, Namenssperre, interner Name, Anzeige-Fallback (D-03, D-04, D-06, D-07)
**Wave 3** *(blocked on Wave 2 completion)*
- [ ] 16-03-PLAN.md — Sync-Rekonziliation: Umbenennung, Loeschung, Alt-Bindungen; eingehaengt vor dem Mitgliedschafts-Abgleich (D-03, D-05, D-06) - [ ] 16-03-PLAN.md — Sync-Rekonziliation: Umbenennung, Loeschung, Alt-Bindungen; eingehaengt vor dem Mitgliedschafts-Abgleich (D-03, D-05, D-06)
- [ ] 16-04-PLAN.md — GroupFormModal ohne AD-Bindung, gesperrtes Namensfeld, interner Name, i18n-Bereinigung (D-03, D-04, D-07) - [ ] 16-04-PLAN.md — GroupFormModal ohne AD-Bindung, gesperrtes Namensfeld, interner Name, i18n-Bereinigung (D-03, D-04, D-07)
**Wave 4** *(blocked on Wave 3 completion)*
- [ ] 16-05-PLAN.md — Sync-Bericht vollstaendig verdrahtet + Anzeigename in der Freigabe-Matrix (D-04, D-05, D-06) - [ ] 16-05-PLAN.md — Sync-Bericht vollstaendig verdrahtet + Anzeigename in der Freigabe-Matrix (D-04, D-05, D-06)
**Waves**: 1 → 16-01 · 2 → 16-02 · 3 → 16-03, 16-04 (parallel) · 4 → 16-05 **Waves**: 1 → 16-01 · 2 → 16-02 · 3 → 16-03, 16-04 (parallel) · 4 → 16-05
+8 -8
View File
@@ -4,15 +4,15 @@ milestone: v1.1
milestone_name: Ausschreibungs-Radar milestone_name: Ausschreibungs-Radar
current_phase: 15 current_phase: 15
current_phase_name: modul-berechtigungen-gruppen-user-grants current_phase_name: modul-berechtigungen-gruppen-user-grants
status: verifying status: executing
stopped_at: Phase 16 context gathered stopped_at: Phase 16 UI-SPEC approved
last_updated: "2026-08-05T14:26:34.280Z" last_updated: "2026-08-06T12:42:37.667Z"
last_activity: 2026-08-04 last_activity: 2026-08-04
last_activity_desc: Phase 15 execution started last_activity_desc: Phase 15 execution started
progress: progress:
total_phases: 16 total_phases: 16
completed_phases: 13 completed_phases: 13
total_plans: 75 total_plans: 80
completed_plans: 73 completed_plans: 73
--- ---
@@ -29,7 +29,7 @@ See: .planning/PROJECT.md (updated 2026-07-17)
Phase: 15 (modul-berechtigungen-gruppen-user-grants) — EXECUTING Phase: 15 (modul-berechtigungen-gruppen-user-grants) — EXECUTING
Plan: 8 of 8 Plan: 8 of 8
Status: Phase complete — ready for verification Status: Ready to execute
Last activity: 2026-08-04 — Phase 15 execution started Last activity: 2026-08-04 — Phase 15 execution started
Progress: [██████████] 97% Progress: [██████████] 97%
@@ -299,7 +299,7 @@ Items acknowledged and carried forward from previous milestone close:
## Session Continuity ## Session Continuity
Last session: 2026-08-05T14:26:34.247Z Last session: 2026-08-06T11:52:33.849Z
Stopped at: Phase 16 context gathered Stopped at: Phase 16 UI-SPEC approved
Resume file: .planning/phases/16-ad-gruppen-synchronisation/16-CONTEXT.md Resume file: .planning/phases/16-ad-gruppen-synchronisation/16-UI-SPEC.md
Last activity: 2026-07-14 - Built LDAP per-user exclude/denylist filter (9d1323f), migration applied on live DB, verified via Playwright: sync deactivated 4 excluded service accounts (administrator/krbtgt/guest/dns-ldap), 2 real LDAP users stay active, 0 wrongly created Last activity: 2026-07-14 - Built LDAP per-user exclude/denylist filter (9d1323f), migration applied on live DB, verified via Playwright: sync deactivated 4 excluded service accounts (administrator/krbtgt/guest/dns-ldap), 2 real LDAP users stay active, 0 wrongly created
@@ -98,7 +98,7 @@ Accent reserved for: Button "Ausgewählte importieren (N)", Button "Speichern" i
| Fehler — Namenskollision beim Import (Discretion) | "Gruppe „{name}" konnte nicht importiert werden: Der Name ist bereits vergeben. Benenne die bestehende lokale Gruppe um oder vergib ihr einen internen Namen." (`admin.ldap.groupImport.nameCollisionError`) — erscheint als Fehlerzeile im Ergebnisblock, bricht den Import der übrigen ausgewählten Gruppen nicht ab (Pitfall 4) | | Fehler — Namenskollision beim Import (Discretion) | "Gruppe „{name}" konnte nicht importiert werden: Der Name ist bereits vergeben. Benenne die bestehende lokale Gruppe um oder vergib ihr einen internen Namen." (`admin.ldap.groupImport.nameCollisionError`) — erscheint als Fehlerzeile im Ergebnisblock, bricht den Import der übrigen ausgewählten Gruppen nicht ab (Pitfall 4) |
| Sync-Bericht — Benutzer (unverändert) | "Erstellt: {created}, aktualisiert: {updated}, deaktiviert: {deactivated}" (`admin.ldap.sync.result`, bestehend) | | Sync-Bericht — Benutzer (unverändert) | "Erstellt: {created}, aktualisiert: {updated}, deaktiviert: {deactivated}" (`admin.ldap.sync.result`, bestehend) |
| Sync-Bericht — Gruppenmitgliedschaften (bestehende Backend-Lücke wird geschlossen, Pitfall 3) | "Gruppenmitgliedschaften: {groupMembershipsAdded} hinzugefügt, {groupMembershipsRemoved} entfernt" (`admin.ldap.sync.resultGroupMemberships`, NEU — Felder existieren im Backend seit D-21, waren im Frontend nie verdrahtet) | | Sync-Bericht — Gruppenmitgliedschaften (bestehende Backend-Lücke wird geschlossen, Pitfall 3) | "Gruppenmitgliedschaften: {groupMembershipsAdded} hinzugefügt, {groupMembershipsRemoved} entfernt" (`admin.ldap.sync.resultGroupMemberships`, NEU — Felder existieren im Backend seit D-21, waren im Frontend nie verdrahtet) |
| Sync-Bericht — Gruppen (NEU, Phase 16) | "AD-Gruppen: {groupsImported} importiert, {groupsRenamed} umbenannt, {groupsDeleted} gelöscht" (`admin.ldap.sync.resultGroups`) | | Sync-Bericht — Gruppen (NEU, Phase 16) | "AD-Gruppen: {groupsAdopted} neu übernommen, {groupsRenamed} umbenannt, {groupsDeleted} gelöscht" (`admin.ldap.sync.resultGroups`) — *Feld am 2026-08-06 beim Planen von `groupsImported` zu `groupsAdopted` umbenannt: der Sync importiert per D-02 nie selbst, die Zahl wäre nach jedem Lauf zwingend 0. Sie zählt stattdessen Alt-Bindungen, die der Sync neu unter seine Verwaltung nimmt (GUID-Backfill).* |
| Sync-Bericht — Standardmarkierung verschoben (D-06, nur bei >0 sichtbar) | "Standardgruppen-Markierung musste neu vergeben werden ({defaultMarkerMoved}×)." (`admin.ldap.sync.defaultMarkerMoved`), Ton informativ-warnend (siehe Surface Contract 2 für Styling), nicht destruktiv | | Sync-Bericht — Standardmarkierung verschoben (D-06, nur bei >0 sichtbar) | "Standardgruppen-Markierung musste neu vergeben werden ({defaultMarkerMoved}×)." (`admin.ldap.sync.defaultMarkerMoved`), Ton informativ-warnend (siehe Surface Contract 2 für Styling), nicht destruktiv |
| Gesperrtes Namensfeld (D-03) | Hinweistext unter dem deaktivierten Namensfeld: "Von der AD-Gruppe übernommen. Wird beim nächsten Sync automatisch aktualisiert." (`admin.groups.nameLockedHint`) | | Gesperrtes Namensfeld (D-03) | Hinweistext unter dem deaktivierten Namensfeld: "Von der AD-Gruppe übernommen. Wird beim nächsten Sync automatisch aktualisiert." (`admin.groups.nameLockedHint`) |
| AD-Herkunft im Bearbeiten-Dialog (D-04, Debug-Zeile) | "AD-DN: {ldapDn}" (`admin.groups.adDnLabel`), `font-mono text-xs text-muted-foreground`, read-only | | AD-Herkunft im Bearbeiten-Dialog (D-04, Debug-Zeile) | "AD-DN: {ldapDn}" (`admin.groups.adDnLabel`), `font-mono text-xs text-muted-foreground`, read-only |
@@ -193,11 +193,11 @@ Der bestehende Ergebnis-Container (Zeilen 1069–1088, `rounded-md border border
1. Zeile 1 (bestehend, unverändert): "Erstellt: {created}, aktualisiert: {updated}, deaktiviert: {deactivated}" — 14px, `font-medium text-foreground`. 1. Zeile 1 (bestehend, unverändert): "Erstellt: {created}, aktualisiert: {updated}, deaktiviert: {deactivated}" — 14px, `font-medium text-foreground`.
2. Zeile 2 (NEU — schließt die bereits vor Phase 16 bestehende Backend/Frontend-Lücke aus D-21, Pitfall 3): "Gruppenmitgliedschaften: {groupMembershipsAdded} hinzugefügt, {groupMembershipsRemoved} entfernt" — 14px, `text-muted-foreground` (nicht `font-medium` — sekundäre Information gegenüber Zeile 1, gleiche Gewichtsabstufung wie zwischen `h2` und Body üblich in dieser Datei). 2. Zeile 2 (NEU — schließt die bereits vor Phase 16 bestehende Backend/Frontend-Lücke aus D-21, Pitfall 3): "Gruppenmitgliedschaften: {groupMembershipsAdded} hinzugefügt, {groupMembershipsRemoved} entfernt" — 14px, `text-muted-foreground` (nicht `font-medium` — sekundäre Information gegenüber Zeile 1, gleiche Gewichtsabstufung wie zwischen `h2` und Body üblich in dieser Datei).
3. Zeile 3 (NEU, Phase 16): "AD-Gruppen: {groupsImported} importiert, {groupsRenamed} umbenannt, {groupsDeleted} gelöscht" — 14px, `text-muted-foreground`, immer sichtbar (auch bei allen Werten = 0, identische Transparenz-Haltung wie Zeile 1). 3. Zeile 3 (NEU, Phase 16): "AD-Gruppen: {groupsAdopted} neu übernommen, {groupsRenamed} umbenannt, {groupsDeleted} gelöscht" — 14px, `text-muted-foreground`, immer sichtbar (auch bei allen Werten = 0, identische Transparenz-Haltung wie Zeile 1).
4. Zeile 4 (NEU, Phase 16, **bedingt** — nur wenn `defaultMarkerMoved > 0`): "Standardgruppen-Markierung musste neu vergeben werden ({defaultMarkerMoved}×)." — 14px, `font-medium`, Farbe `text-amber-700 dark:text-amber-400` (reuse der in `15-UI-SPEC.md` etablierten Amber-Familie für "Informationszustand, kein Fehler" — D-06 ist ein bewusst akzeptierter, aber bemerkenswerter Vorgang, kein Fehler und keine normale Routine-Zahl). 4. Zeile 4 (NEU, Phase 16, **bedingt** — nur wenn `defaultMarkerMoved > 0`): "Standardgruppen-Markierung musste neu vergeben werden ({defaultMarkerMoved}×)." — 14px, `font-medium`, Farbe `text-amber-700 dark:text-amber-400` (reuse der in `15-UI-SPEC.md` etablierten Amber-Familie für "Informationszustand, kein Fehler" — D-06 ist ein bewusst akzeptierter, aber bemerkenswerter Vorgang, kein Fehler und keine normale Routine-Zahl).
5. Fehlerliste (bestehend, unverändert): `syncResult.errors.map(...)` darunter, `text-xs text-destructive`. Gruppen-bezogene Fehler tragen laut RESEARCH-Muster das Präfix `Gruppe {name}: ...` — bereits durch das bestehende generische Fehlerzeilen-Rendering abgedeckt, keine visuelle Sonderbehandlung nötig. 5. Fehlerliste (bestehend, unverändert): `syncResult.errors.map(...)` darunter, `text-xs text-destructive`. Gruppen-bezogene Fehler tragen laut RESEARCH-Muster das Präfix `Gruppe {name}: ...` — bereits durch das bestehende generische Fehlerzeilen-Rendering abgedeckt, keine visuelle Sonderbehandlung nötig.
Frontend-`SyncResult`-Interface (Zeile 54–59) wächst additiv um `groupMembershipsAdded`, `groupMembershipsRemoved`, `groupsImported`, `groupsRenamed`, `groupsDeleted`, `defaultMarkerMoved` — alle `number`, analog zum bestehenden Pattern. Frontend-`SyncResult`-Interface (Zeile 54–59) wächst additiv um `groupMembershipsAdded`, `groupMembershipsRemoved`, `groupsAdopted`, `groupsRenamed`, `groupsDeleted`, `defaultMarkerMoved` — alle `number`, analog zum bestehenden Pattern.
### 3. `/admin/groups` — Namensanzeige, Create-Flow ohne AD-Bindung (D-04, D-07, D-13-Anschluss) ### 3. `/admin/groups` — Namensanzeige, Create-Flow ohne AD-Bindung (D-04, D-07, D-13-Anschluss)