SpiceDB sem mitologia: schema, caveats e por que importa
Authz como serviço com modelo Zanzibar — quando vale, como modelar, onde a complexidade aparece.
Authz é o problema mais subestimado de arquitetura. Times jogam roles num enum, escrevem if user.role == 'admin' espalhado pelo código, e em dois anos descobrem que ninguém entende mais a matriz de permissões. SpiceDB é o oposto disso — modelo Zanzibar (mesmo papel original do Google) com schema dedicado, queries declarativas, e separação completa entre policy e código. Custou um quarto de uma sprint pra aprender; valeu cada hora.
Modelo conceitual: tudo é tupla 'subject relation object'. user:alice é viewer of document:report. Você não escreve regra 'alice pode ler report' — você escreve fato 'alice é viewer de report' e a definição de 'viewer' no schema diz o que isso permite. Schema em Camverly: organization tem owner, admin, member. Site tem owner, editor, viewer. Post tem author. As relações entre entidades formam o grafo: site#parent é organization, então quem é admin da org herda editor do site.
Caveats são o que tornou SpiceDB realmente útil pra nós. São condições dinâmicas avaliadas na hora da query — tipo policy expressions. 'user pode editar post SE post.status == draft OR user.role IN admin set'. Antes de caveats (versão 1.16+), você precisava materializar todos os estados possíveis como tuplas, o que explode em tamanho. Com caveats, você modela uma relação só com condição. Pra paywall enforcement (acesso por tier de assinatura), isso virou enabler decisivo.
Operacionalmente: SpiceDB roda como serviço HTTP/gRPC com Postgres como datastore. Replica bem horizontalmente (consistência eventual configurável). Pra Camverly, uma única instância de SpiceDB com Postgres dedicado serve toda a fleet, respondendo CheckPermission em latência média de 4ms. Volume é 800-1200 checks/segundo no horário de pico — longe de saturar.
Onde dói: ferramentas de visualização. SpiceDB tem CLI que lista tuplas, mas não tem UI de browse 'mostra quem pode fazer o que'. Pra audit ou debug, você precisa escrever queries específicas. A comunidade tem alguns projetos (zed-cli é o melhor) mas nada à altura do conforto de uma role-based explorer. Aceitamos isso porque o ganho de modelagem correta supera de longe o custo de tooling. Em uma plataforma multi-tenant com hierarquia real, SpiceDB economiza dezenas de bugs por trimestre.