81 lines
3.2 KiB
Markdown
81 lines
3.2 KiB
Markdown
# 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/<modul>.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]
|