Semântica de falha
A diferença entre negar e bloquear, e por que nenhuma falha resulta em execução.
Uma avaliação pode terminar de três jeitos, e só um deles executa a tool. Um agente em Report-only acrescenta um quarto, que também executa.
DENY quer dizer que a política foi avaliada e negou: falta uma relação ou uma condição deu falso. É um resultado normal, registrado com o motivo.
WOULD DENY é um DENY da política de um agente em Report-only: uma tool sem grant, um recurso fora dos concedidos ou uma condição falsa. A tool roda, quem chamou recebe o resultado normal sem código de referência, e o registro guarda a chamada com o mesmo motivo e o mesmo caminho de um DENY. Uma delegação ausente nunca vira Would deny.
Bloqueio quer dizer que não foi possível decidir: o OpenFGA não respondeu, um fato obrigatório não chegou, uma expressão deu erro, a configuração mudou no meio da avaliação. O agente recebe 503. Tratar essas falhas como DENY esconderia um problema de infraestrutura atrás de um "acesso negado". Tratar como ALLOW seria abrir acesso justamente quando o Xokepoint não sabe se deve. O bloqueio vale nos dois modos: o Report-only nunca transforma uma falha numa chamada executada.
Um bloqueio também é rápido. Cada chamada ao OpenFGA tem timeout de 5 segundos e não é repetida, então uma queda do OpenFGA vira um 503 na hora, em vez de uma chamada que espera atrás de retries.
Na entrada, cada situação tem uma resposta própria:
| Situação | Resposta | Executa? |
|---|---|---|
| Token, agente ou identity connection inválidos | HTTP 401 | Não |
| Metadados de protocolo inconsistentes, mapping ou argumentos inválidos | HTTP 400, erro JSON-RPC | Não |
| Tool fora do catálogo aprovado | HTTP 403 | Não |
| Política negou | HTTP 200, erro JSON-RPC de acesso negado | Não |
| Política negou, agente em Report-only | HTTP 200, resultado do MCP | Sim |
| OpenFGA, fato obrigatório ou avaliação indisponíveis | HTTP 503 | Não |
| Falha no MCP server depois do ALLOW | HTTP 502 | Resultado incerto, sem nova tentativa |
| Sucesso | HTTP 200, resultado do MCP | Sim |
O DENY volta como HTTP 200 com erro JSON-RPC porque a chamada HTTP funcionou e o protocolo MCP tem como dizer que a tool foi negada. O agente recebe uma resposta que entende, sem confundir negação com falha de rede. O erro traz o código Reference da chamada negada e nunca o motivo; o administrador encontra o motivo por esse código (Quick incident).
O 502 depois do ALLOW não é repetido automaticamente. A tool pode ter executado antes de a resposta se perder, e repetir uma tool com efeito colateral pode fazer a ação duas vezes.