5.7 KiB
5.7 KiB
phase, slug, status, nyquist_compliant, wave_0_complete, created
| phase | slug | status | nyquist_compliant | wave_0_complete | created |
|---|---|---|---|---|---|
| 15 | modul-berechtigungen-gruppen-user-grants | draft | false | false | 2026-08-04 |
Phase 15 — Validation Strategy
Per-phase validation contract for feedback sampling during execution.
Test Infrastructure
| Property | Value |
|---|---|
| Framework | Vitest 3.2.6 |
| Config file | apps/api/vitest.config.ts / apps/web/vitest.config.ts |
| Quick run command | pnpm --filter @tessera/api test -- <datei> |
| Full suite command | pnpm --filter @tessera/api test und pnpm --filter @tessera/web test |
| Estimated runtime | ~60 seconds (API-Suite), Einzeldatei ~5 s |
Sampling Rate
- After every task commit: Run
pnpm --filter @tessera/api test -- <betroffene Datei> - After every plan wave: Run
pnpm --filter @tessera/api testundpnpm --filter @tessera/web test - Before
/gsd-verify-work: Volle Suite grün PLUS manueller Migrations-Trockenlauf gegen eine mit Bestandsdaten befüllte lokale Test-DB (PERM-06 ist durch Unit-Tests nicht sinnvoll abgedeckt) - Max feedback latency: 60 seconds
Per-Task Verification Map
Task-IDs werden vom Planner vergeben; diese Zeilen binden Requirement → Test-Typ → Kommando und werden beim Planen auf konkrete Tasks abgebildet.
| Task ID | Plan | Wave | Requirement | Threat Ref | Secure Behavior | Test Type | Automated Command | File Exists | Status |
|---|---|---|---|---|---|---|---|---|---|
| TBD | TBD | TBD | PERM-01 | IDOR bei DELETE /groups/:id |
Jede Gruppen-Query filtert zusätzlich auf tenantId |
unit (Service) + component (Lösch-Dialog) | pnpm --filter @tessera/api test -- groups.service |
❌ W0 | ⬜ pending |
| TBD | TBD | TBD | PERM-02 | — | LDAP-Sync entfernt nur source: LDAP-Mitgliedschaften |
unit (LdapService, gemockter Client) | pnpm --filter @tessera/api test -- ldap.service |
✅ (ldap.service.spec.ts, muss erweitert werden) |
⬜ pending |
| TBD | TBD | TBD | PERM-03 | Cross-Tenant-Grant-Injection | group.tenantId/user.tenantId wird vor jedem Grant-Insert gegen den JWT-Mandanten geprüft |
unit (Service) + component (Matrix) | pnpm --filter @tessera/api test -- module-grants.service |
❌ W0 | ⬜ pending |
| TBD | TBD | TBD | PERM-04 | Guard-Bypass bei fehlendem @UseModule() |
Sidebar, Modulseite und API nutzen dieselbe Auflösung; Durchsetzung serverseitig auf jeder Schicht | integration (Guard) + component (403-Seite) | pnpm --filter @tessera/api test -- module-access.service und -- module.guard |
❌ W0 | ⬜ pending |
| TBD | TBD | TBD | PERM-05 | Rollen-Branch als Bypass | ADMIN/SUPER_ADMIN-Bypass gilt ausschließlich innerhalb des eigenen Mandanten | unit (Rollen-Branch) | pnpm --filter @tessera/api test -- module-access.service |
❌ W0 | ⬜ pending |
| TBD | TBD | TBD | PERM-06 | — | Kein Bestandsbenutzer verliert Zugriff | Migrations-Verifikation per Zähl-Assertions gegen Test-DB | manueller/skriptgestützter Lauf (Muster: backfill-tender-source.ts) |
❌ W0 | ⬜ pending |
| TBD | TBD | TBD | PERM-07 | — | Widget eines gesperrten Moduls wird serverseitig herausgefiltert | unit (DashboardService.getWidgets) |
pnpm --filter @tessera/api test -- dashboard.service |
❌ W0 | ⬜ pending |
Status: ⬜ pending · ✅ green · ❌ red · ⚠️ flaky
Wave 0 Requirements
apps/api/src/module-registry/module-access.service.spec.ts— deckt PERM-04 und PERM-05apps/api/src/module-registry/module.guard.spec.ts— für den Guard existiert bisher kein Testapps/api/src/groups/groups.service.spec.ts— deckt PERM-01apps/api/src/groups/module-grants.service.spec.ts— deckt PERM-03apps/api/src/dashboard/dashboard.service.spec.ts— bisher ungetestet, deckt PERM-07- Erweiterung von
apps/api/src/ldap/ldap.service.spec.tsum AD-Gruppenbindungs-Fälle — deckt PERM-02 - Migrations-Verifikationsvorgehen für PERM-06 — Zähl-Assertions oder SQL-Checks nach dem Backfill; im Projekt existiert dafür kein automatisiertes Framework
Manual-Only Verifications
| Behavior | Requirement | Why Manual | Test Instructions |
|---|---|---|---|
| Migration erzeugt Standardgruppe, Mitgliedschaften und Grants ohne Zugriffsverlust | PERM-06 | Raw-SQL-Backfill in migration.sql, läuft beim Container-Start über prisma migrate deploy; im Projekt gibt es kein Testframework für Migrationsdaten |
Lokale Test-DB mit Bestandsdaten (mehrere Mandanten, aktive Module, Benutzer) füllen, Migration anwenden, danach je Mandant prüfen: genau eine Gruppe mit isDefault, Mitgliederzahl gleich Benutzerzahl, Grant-Zahl gleich Zahl der aktiven Module |
| AD-Gruppenbindung gegen ein echtes Active Directory | PERM-02 | Verhalten bei Range Retrieval und großen Gruppen ist nur gegen ein echtes AD belastbar; Research-Confidence hier MEDIUM | Gegen balios.ctl.local eine Gruppe binden, Sync auslösen, Mitgliederzahl in Tessera mit der AD-Gruppe vergleichen; danach einen Benutzer im AD aus der Gruppe nehmen, erneut syncen und prüfen, dass nur seine LDAP-Mitgliedschaft verschwindet |
Validation Sign-Off
- All tasks have
<automated>verify or Wave 0 dependencies - Sampling continuity: no 3 consecutive tasks without automated verify
- Wave 0 covers all MISSING references
- No watch-mode flags
- Feedback latency < 60s
nyquist_compliant: trueset in frontmatter
Approval: pending