# Rechte & Kontingente — Registry-first (Zielarchitektur)

**Stand:** 2026-06-07 · **Status:** verbindlich (korrigiert Katalog-first aus Migration 079)

---

## 1. Problem mit dem Katalog-first-Ansatz

Migration `079_capabilities.sql` hat **~70 Rechte vorab** in die DB geschrieben — aus einer Spekulation über die fertige App. Das ist für ein System im Aufbau **verkehrt herum**:

- Vollständige Liste ist **nicht möglich** und nicht wünschenswert  
- Die Matrix **suggeriert** Funktionen, die es am Endpoint noch nicht gibt  
- Module **registrieren sich nicht** — alles war manueller Seed  

**Korrektur:** Registry-first — wie bei anderen Registries im Projekt (z. B. Platzhalter-Pflicht).

---

## 2. Zielbild

```
Modul implementiert Feature
  → register_capability() / register_feature() in rights_registrations/<modul>.py
  → Startup: sync_rights_registry_to_db()
  → Admin „Rollen & Rechte“ zeigt nur Einträge mit module IS NOT NULL
  → Endpoint: probe_capability + probe/consume Kontingent
```

| Achse | Registrierung | Konfiguration Admin |
|-------|---------------|---------------------|
| **Recht** | `CapabilityRegistration` | Matrix Vereins-/Portal-Rollen |
| **Kontingent** | `FeatureRegistration` | Vereinspläne / Limits |

Kein neuer Eintrag in `079`-artigen Bulk-Migrations für fachliche Rechte.

---

## 3. Implementierung (Code)

| Pfad | Rolle |
|------|--------|
| `backend/rights_registry.py` | `register_capability`, `register_feature`, `sync_rights_registry_to_db` |
| `backend/rights_registrations/*.py` | Pro Modul nur **tatsächlich verdrahtete** Rechte/Kontingente |
| `backend/main.py` | Sync nach Migrationen |
| Migration `084_rights_registry_module.sql` | Spalte `module` auf `capabilities` + `features` |
| `admin_rights.py` | Matrix-Query: `WHERE module IS NOT NULL` |

### Neues Modul anbinden (Pflicht)

1. Datei `rights_registrations/mein_modul.py` anlegen  
2. `register_capability` / `register_feature` aufrufen  
3. In `rights_registrations/__init__.py` importieren  
4. Endpoint: `probe_capability` + ggf. `consume_club_feature_with_usage`  
5. `capability_enforcement_audit.WIRED_PROBE` ergänzen  

**Kein** Eintrag in `CAPABILITY_CATALOG` als Voraussetzung für DB — der Katalog wird zur **Dokumentation** der Namenskonvention, nicht zur Seed-Quelle.

---

## 4. Legacy-Katalog (079)

- Bleibt in der DB (`module IS NULL`) für Übergang / `check_capability`-Kompatibilität  
- Erscheint **nicht** mehr in der Admin-Matrix  
- Wird nicht erweitert — neue Rechte nur über Registry  
- Langfristig: ungenutzte Seed-Zeilen deaktivieren oder archivieren  

---

## 5. Aktuell registrierte Module (Start)

| Modul | Rechte | Kontingente |
|-------|--------|-------------|
| `exercises` | KI suggest/regenerate, create, media.upload | `ai_calls`, `exercises`, `exercise_media` |
| `planning_exercise_suggest` | planning.ai.* | (nutzt `ai_calls`) |
| `club_creation_requests` | Gründung + approve | — |
| `platform` | admin.access, quota.bypass | — |

Weitere Module folgen **mit ihrer Implementierung**, nicht vorher.

---

## 6. Referenzen

- `docs/working/RBAC_ENFORCEMENT_ROADMAP.md` — Enforcement nach Verdrahtung  
- `MEMBERSHIP_RBAC_DECISIONS_2026-06.md` — Produktentscheidungen  
- `CLUB_MEMBERSHIP_AND_FEATURES.v1.md` — Kontingent-Semantik  

**Changelog**

- 2026-06-07: Registry-first als verbindliche Korrektur; Migration 084; Pilot-Registrierungen.
