5228f28cbe
Der Kernfund dieser Etappe war ein Defekt im Fundament: forTenant() setzte den Mandantenkontext auf der Transaktionsverbindung, dispatchte die Abfrage aber ueber den aeusseren Client. Empirisch reproduziert statt hergeleitet — set_config auf Backend-PID 254999, Abfrage auf 255000, Kontext dort NULL. Damit hat die Mandantentrennung nie funktioniert, auch nicht dort, wo sie scheinbar benutzt wurde. Nach einem Scharfschalten haette sich das umgekehrt: die betroffenen Abfragen liefern dann null Zeilen, und der LDAP-Loeschzweig haette das als "Gruppe im Verzeichnis verschwunden" gedeutet und sie samt Mitgliedschaften und Modulfreigaben geloescht. Aufgefallen, weil vor dem Umbau geprueft wurde, ob das Fundament traegt. Der Anmeldeweg bekam eine bewusst schmale Ausnahme: drei SECURITY-DEFINER- Funktionen mit fester Spaltenliste, Gleichheitsbedingung und LIMIT 1. Eine Policy waere hier untauglich — sie ist ein Zeilenpraedikat und haette zwangslaeufig die ganze Tabelle freigegeben. Die Klassifikation macht die restliche Arbeit planbar: 227 Zugriffe in 59 Einheiten, davon 31 umzustellen, 9 teilweise, 16 ohne Mandantenbezug und 3 bewusst uebergreifend. Ein Test haelt die Einteilung gegen Abdriften fest. Browser-Gegenprobe lokal bestanden. 701 Tests gruen. Der Schalter bleibt aus; #18, #19 und #20 bleiben offen. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYZcd3SSmo14QTqWx2KKzU