Skip to main content
Direct access is the default path through the Sidecar. A request arrives, the Sidecar decodes it, evaluates it against the rules you wrote, and forwards it. The response comes back through the same gate and sensitive values are rewritten before they reach the client. Nothing about this path is probabilistic. The same statement produces the same decision every time, there is no third-party API in the chain, and the only latency added is a parse and a scan.

Configuration

A listener is one upstream. Add policy to control what reaches the resource, and mask to control what comes back. Both are optional and independent.
config.yaml
Validate before deploying — nothing needs to be running:
policy.enforce defaults to false. Without it a listener inspects and audits but denies nothing, so a misconfigured rule cannot take production down on first deploy. That is the right way to roll out, and the wrong way to leave it.

What the user sees when a rule denies

The refusal is written in the protocol’s own frame, always to the client, carrying the message you wrote:
That is a real pgwire ErrorResponse, so the developer reads the reason in psql rather than watching a connection drop. On an HTTP listener the equivalent is a 403 with an X-Hoop-Denied header.

Direct or Agentic?

Both paths run in the same Sidecar and a listener picks per rule, so this is not an either/or for the deployment — only for a given class of statement. The usual shape is direct rules for everything nameable, and an ai_analysis rule as the backstop for the rest.

Next

Guardrails

Every rule type, and how a rule set resolves to a verdict.

Data Masking

Detection, masking strategies, and entity rules versus column rules.

Agentic Access

Let a model classify the statement and pick the tool.

Config File Reference

Every listener field, inheritance between listeners, and what startup refuses.