Herkunft des Tier-Vokabulars bei der Mount-Registrierung
Status
Angenommen. Ersetzt den vorherigen Zustand, in dem die Registrierungsschicht eine eigene Tier-Liste führte.
Kontext
Das Tier-Vokabular ist an genau einer Stelle definiert: in der Tabelle, die aus einem Tier die ACL-Zeilen macht (Domain/MountAclWriter). Die Registrierungsschicht (Domain/RepoMountRegistry) prüfte den übergebenen Tier jedoch gegen eine zweite, eigene Liste aus drei Literalen und ersetzte jeden unbekannten Wert durch das restriktivste private. Solange es drei Tiers gab, stimmten die beiden Listen überein.
Mit dem vierten Tier team liefen sie auseinander. Der Assistent bot team an, die ACL wurde nach den Regeln von team geschrieben — und die Registrierung legte still private ab. Ergebnis: der Mount-Datensatz und conf/acl.auth.php beschrieben verschiedene Tiers, ausgerechnet auf dem Bildschirm, dessen Spalte Regeln genau diese Übereinstimmung sichtbar machen soll.
Derselbe Bruch wiederholte sich später zwei Ebenen tiefer, und zwar doppelt. Die Speicherschicht führt in Model/AdoGitMount eine eigene Tier-Liste, die Sichtbarkeitsmarke im Repository-Browser in Ui/BrowseView eine weitere. Keine der beiden wurde mitgezogen, als showcase und library hinzukamen, und beide ersetzen einen unbekannten Tier stillschweigend durch private, statt ihn zu melden. Nach dem Umstufen von 53 Namensräumen las die Speicherschicht damit jeden von ihnen als private, während conf/acl.auth.php korrekt library vergab — und wer auf dem Mount-Bildschirm irgendetwas gespeichert hätte, hätte private zurückgeschrieben und öffentlich lesbaren Quelltext geschlossen, ohne eine Stufe angefasst zu haben.
Mechanismus
Die Registrierung fragt das Vokabular jetzt bei der Tabelle ab, die die Regeln schreibt, statt eine Kopie davon zu führen:
if (!MountAclWriter::isValidTier($tier)) { $tier = 'private'; }
Das Klemmen auf private bleibt: ein Tier, den diese Installation nicht kennt, darf nie mehr gewähren als der restriktivste. Verändert hat sich allein die Quelle von „bekannt„.
Ein Regressionstest iteriert über MountAclWriter::tiers() und prüft, dass jeder darin genannte Tier unverändert bis in die Speicherung durchreicht. Ein fünfter Tier, der dort ergänzt und hier vergessen würde, lässt den Test fehlschlagen, statt still zu verschwinden.
Konsequenzen
- In der Registrierung nie wieder eine eigene Tier-Liste anlegen — auch nicht „nur zur Sicherheit“. Zwei Listen desselben Vokabulars driften auseinander, und der Bruch ist still.
- Der Regressionstest darf nicht auf feste Tier-Namen umgeschrieben werden. Sein Wert liegt darin, dass er die Tabelle fragt und nicht ihre Kopie.
- Ein Rückfall auf den restriktivsten Wert ist richtig, ein stiller Rückfall nicht. Alle drei Kopien ersetzten einen unbekannten Tier ohne Meldung. Der Rückfall schützt, das Schweigen versteckt: im Betrieb ist ein still ersetzter Wert von einem korrekt gelesenen nicht zu unterscheiden.
- Das Vokabular steht an vier Stellen, und drei davon sind Kopien. Quelle ist die Tabelle, die die Regeln schreibt. Schema-Bedingung, Speichermodell und Sichtbarkeitsmarke fragen sie oder werden gegen sie geprüft — ein Test vergleicht Schema und Modell in beide Richtungen, weil eine einseitige Prüfung die jeweils andere Lücke offen ließe.
- Vor dieser Änderung registrierte
team-Mounts sind noch falsch abgelegt. Sie stehen alsprivatein der Liste, während ihre Regeln zuteampassen. Die Korrektur ist einmalig: im Zeilenmenüteamwählen und Speichern. Bestandsdaten wandern nicht von selbst mit, weil nichts sicher unterscheiden kann, obprivatedamals gewollt oder erzwungen war. - Ein neuer Tier braucht nur einen Eintrag in
MountAclWriter::TIERS. Assistent, Zeilenmenü, Tier-Matrix und Registrierung lesen von dort.
Verwandte Themen
- Technische Referenz: Sichtbarkeits-Tier – die Tier-Tabelle selbst
- Diagnose: alter Mount steht als private – das Symptom bei Bestandsdaten
- Anleitung: Sichtbarkeits-Tier – der Tier aus Sicht des Anwenders