Każdy odczyt przez /osl/query jest ograniczony
modelem zdolności + uprawnień (capability + permission): kto pyta (łańcuch
delegacji podmiotów), co każda polityka mu nadaje nad grafem semantycznym i
jak te nadania się składają. Jest fail-closed z konstrukcji — domyślnie
deny, a wszystko nierozwiązane jest odrzucane, nigdy zgadywane.
Dostęp jest ewaluowany nad łańcuchem podmiotów, root → leaf. Działający
podmiot to ostatnie ogniwo. Kompozycja ma dwa poziomy:
W obrębie jednego podmiotu
Wszystkie polityki wiążące ten podmiot łączą się: nadania przez union,
wygrywa najsilniejszy obowiązek (deny > mask > redact), jawny denynadpisuje, a warunki (zakres IP, okno czasowe) bramkują tylko ALLOW —
deny jest bezwarunkowe.
Wzdłuż łańcucha
Ogniwa łączą się przez MEET (przecięcie): encja lub kolumna jest nadana
tylko wtedy, gdy nadaje ją każde ogniwo. Limit tieru to minimum
(najbardziej restrykcyjne), a wymagana redakcja to union tego, czego wymaga
każde ogniwo. Puste lub nieautorowane ogniwo zwija meet do deny.
Nadania są pozytywne: kolumna, która nie jest nadana, jest redagowana, nigdy
zwracana jako NULL ani po cichu usuwana ze schematu. deny usuwa kolumnę z
projekcji całkowicie; globalny dla polityki deny nadpisuje nadanie każdego
innego powiązania.
Fasety treści są nadzorowane przez nazwane wersje redakcji — oddzielenie
nazwy widocznej dla człowieka od fizycznej, bajtowo-stabilnej tożsamości:
RedactionVersion ma nazwę (uchwyt w konsoli, np. "PII básica") oraz
zbiór tagów (klasy treści, które redaguje, np. {email, phone}).
Tagi są tożsamością fizyczną (bajtowo niezmienione, używane jako klucz
tabeli); nazwa służy tylko do autorowania.
Domniemana wersja original (bez tagów) to tabela bazowa.
facetGrant wiąże wymaganą nazwę wersji per faseta. Wybór jest
dokładny-albo-deny: silnik serwuje zapisaną wersję, której tagi dokładnie
pasują, albo odmawia fasety — nigdy nie schodzi do wersji bardziej lub mniej
zredagowanej.
Wzdłuż łańcucha wymagane wersje składają się przez union zbiorów tagów
(więcej redakcji jest zawsze bezpieczne).
Egzekwowanie jest po stronie serwera, w komórce. Wyniki:
Sytuacja
Zwracana wartość
W wyniku?
Nadane cleartext
oryginał
tak
Obowiązek mask
***
tak
Obowiązek redact
⟦redacted⟧
tak (przeżywa dla ORDER BY/GROUP BY)
deny / bez nadania
—
usunięte z projekcji
Sentinel⟦redacted⟧ oznacza, że kolumna przeżywa z nadzorowaną wartością
(więc kształt w dół strumienia jest stabilny), zamiast stać się NULL lub
zniknąć — i to właśnie czyni joiny cross-modalne fail-closed, a model składalnym.
Łańcuch nie jest zaufanym nagłówkiem — to podpisany token. Komórka emituje i
weryfikuje JWT HS256, którego payload zawiera sam łańcuch, więc wywołujący nie
może go skrócić ani sfałszować bez złamania podpisu (nieobecny/nieprawidłowy
łańcuch → deny). Zobacz Uwierzytelnianie.
Dwie operacje dry-run obliczają rzeczywistą kompozycję bez serwowania danych
(konsola Enterprise je eksponuje; API są w komórce):
:simulate — podgląd jednej polityki względem zapytania jako pojedynczy
podmiot.
:simulate-chain — skompiluj pełny autorowany zbiór polityk tenanta nad
łańcuchem root → leaf (MEET), zwracając złożony zakres plus rozbicie
wkładu per ogniwo. Nieautorowane ogniwo jest oznaczane; meet pustoszeje do
fail-closed empty_meet.