# M??? — [Titel] **Block:** [Block-Name + Modul-Nr] **Pflichtenheft-Quelle:** `_bmad-output/pflichtenheft/blocks/blockX.md` Sektion Y.Z ## Ziel [1-2 Sätze: was am Ende des Milestones funktioniert, vom User aus gesehen] ## Pflichtenheft-Bezug - [Sektion-ID] — [Kurz-Inhalt] - [Bauprinzip-ID falls relevant] ## Abhängigkeiten - **Vorbedingung:** [Welche Milestones MÜSSEN davor abgeschlossen sein] - **Wird benötigt von:** [Welche Milestones bauen auf diesem auf] ## Out of Scope - [Was explizit NICHT in diesem Milestone passiert] ## Erfolgskriterium [1 beobachtbares Ergebnis, das nach Abschluss verifizierbar ist] ## Hinweise für Slice-Planung - [Hinweis 1] - [Hinweis 2] --- ## Definition of Done — verbindlich (siehe `AGENTS.md`) Dieses Milestone gilt **nur dann als erledigt**, wenn alle Punkte wahr sind. ### Erreichbarkeit - [ ] **Sidebar-Eintrag** registriert in `packages/ui-hivegrid/src/app-shell/sidebar.config.ts` mit Permission-Gate (Gruppe siehe `docs/INTEGRATION-CONTRACTS.md` §1) — ODER explizit dokumentiert, warum nur Inline-Verlinkung aus bestehendem Modul - [ ] **Route** unter korrektem URL-Pattern (INTEGRATION-CONTRACTS §3) - [ ] **Breadcrumb** für Detail-Routes (§4) - [ ] **Mobile-Tab-Bar-Eintrag**, falls mobile-relevant (§13) — sonst explizit als „nicht mobile" dokumentiert - [ ] **Customer-Portal-Sichtbarkeit** explizit konfiguriert (§14) — Default „nicht sichtbar" ### Querschnitt-Wiring - [ ] **Audit** läuft (auto via M001 oder manuell für Non-Prisma-Aktionen) - [ ] **Activity-Stream-Eintrag** bei relevanter Aktion via `logActivity` (M045) - [ ] **Notifications** via `notify()` (M011), nicht direkt - [ ] **Search-Index** in `indexed-entities.ts` registriert, falls suchbar - [ ] **Permission-Filter** via `withTenantScope()` + `withPermission()` (M004) - [ ] **Feature-Flag-fähig** (M006) — kann ohne Deploy abgeschaltet werden ### Code-Layer-Disziplin - [ ] Loader baut View-Model; UI-Component empfängt nur VM + Actions - [ ] Keine Prisma-/Server-Imports in `packages/ui-hivegrid/**` - [ ] Subframe-Output via Adapter, nicht direkt importiert - [ ] Alle UI-Texte als i18n-Keys ### Tests - [ ] **Unit-Test** für VM-Builder (pure function + Zod-Schema-Validierung) - [ ] **Smoke-Test** `e2e/smoke/.spec.ts` (Login → Route → Hauptaktion → erwartetes UI) - [ ] **Hot-Swap-Drill** grün (Smoke-Test gegen `packages/ui-mock`) - [ ] **Visual-Regression-Snapshot** der Hauptansicht (M016) ### Klartext (User-facing) - [ ] Fehler-Texte aus M002-Catalog (kein HTTP-Code im UI) - [ ] Empty-State mit Klartext + nächster Aktion - [ ] Loading-State mit Klartext - [ ] Permission-Denied → 404, nicht 403 ### Rollback-Pfad - [ ] **Forward-Only-DB-Migration** mit Inverse-SQL als Kommentar im Migration-File - [ ] **Atomic-Slice-Commits** (TC-Default) - [ ] **Feature-Flag** vorhanden, um das Modul ohne Deploy auszuschalten --- ## Klick-Pfad zum Prüfen (für User) Schritt-für-Schritt-Anleitung, wie der User die Funktion nach Abschluss findet und testet: 1. [Schritt 1: einloggen als welcher User-Typ] 2. [Schritt 2: welche Sidebar-Gruppe + welcher Eintrag] 3. [Schritt 3: welche Aktion im UI] 4. [Schritt 4: was erwartet sichtbar sein muss]