# KAR-978 — Apply-Anleitung (documents SELECT-Isolation)

**Was:** Droppt die ungescope-te Alt-Policy `documents_select` auf `public.documents`. Danach gilt beim Lesen nur noch die scope-geprüfte `docs_select` (global ODER eigenes Projekt ODER Admin). Writes und service_role sind unberührt.

**Risiko-Einordnung:** Kein App-Bruch zu erwarten — die betroffenen Seiten (`/repository`, `/repository/projects`, Projekt-Detail) filtern nicht selbst auf Besitz, sie verlassen sich auf RLS und zeigen einfach weniger Zeilen. Für Nicht-Admins werden Zähler/Listen im Repository KLEINER — das ist die gewollte Wirkung, kein Fehler.

## 1. Apply (Supabase SQL-Editor, Projekt Kadi-v2)

Inhalt von `migration.sql` einfügen und ausführen. Idempotent — doppeltes Ausführen ist harmlos.

## 2. Verifikation (direkt danach, gleicher SQL-Editor)

```sql
SELECT policyname, cmd
FROM pg_policies
WHERE schemaname = 'public' AND tablename = 'documents'
ORDER BY policyname;
```

**Erwartung:** `docs_select` (SELECT) vorhanden, die Write-Policies aus tranche-b2 vorhanden, **`documents_select` FEHLT**.

## 3. Smoke-Test in der App (2 Minuten)

1. **Als Nicht-Admin-User:** `/repository` öffnen — nur noch eigene Projekt-Dokumente + globale Templates sichtbar (Zahlen dürfen kleiner sein als vorher).
2. **Eigenes Projekt-Detail:** Dokumente-Sektion zeigt die eigenen Dokumente weiterhin.
3. **Als Admin:** alles weiterhin sichtbar.
4. **Falls ein berechtigter Nicht-Owner** (Projekt-Mitglied / Abteilungs-Sicht, sofern ihr das nutzt) Dokumente eines für ihn sichtbaren fremden Projekts **vermisst**: `rollback.sql` ausführen + Aria Bescheid geben. Dann erweitern wir `docs_select` gezielt (Folge-Migration) statt das Leck offen zu lassen.

## 4. Nach dem Apply

Kurz „applied" an Aria melden. Dann passiert automatisch:
- Apply-Event wird kanonisch in `MIGRATIONS.md` nachgetragen (Lehre vom 18.07. — Repo muss den Ist-Stand kennen).
- Der vorbereitete Repo-PR wird gemerged: Migrations-Datei ins Repo, `MIGRATIONS.md`-Katalog, RLS-Harness-Kette, und der KAR-788-Testfall flippt von „KNOWN GAP" auf echte Isolations-Assertion (`.toBe(0)`) — ab dann beweist die RLS-Suite die Isolation dauerhaft.
