Contents
Capability backlog: what else pg_policy should grow
Last updated: 2026-08-10
Prioritized from industry gaps (MCP, Dogwood, AuthZEN, EU AI Act, multi-agent frameworks).
Legend: P0 = next minor · P1 = 0.2/0.3 · P2 = 1.0+ · Out = non-goal
Language & evaluation
| Item | Priority | Why |
|---|---|---|
unless clauses |
P0 | Cedar parity; invert conditions without extra policies |
not in / inequality on context |
P0 | Real SQL-agent filters (cost_usd < 0.05) |
Resource glob prefixes (table:public.*) |
P0 | Schema allowlists |
Temporal formerly / since / sum |
P1 | Dogwood-class workflows (approve-then-transfer) |
| CEL or Cedar condition backend | P1 | Analyzable expressions; pgrx |
Obligations: require_approval, step_up_auth, redact_columns |
P1 | AuthZEN-style PEP instructions |
Policy tests in SQL (SELECT pg_policy.assert_deny(...)) |
P0 | CI for packs |
| Compile-to-RLS helpers | P1 | Generate CREATE POLICY from data-plane APL |
| Partial eval / list-allowed-tools | P1 | AuthZEN search APIs; “what can this agent do?” |
Identity & multi-agent
| Item | Priority | Why |
|---|---|---|
acting_for / on-behalf-of required field |
P0 | HIPAA/SOX attribution; confused-deputy |
| Agent registry table | P1 | EU AI Act Art. 9 risk register |
| Delegation tuples (lite ReBAC) | P1 | Supervisor agent may spawn worker with subset |
| Break-glass role with mandatory reason | P1 | Ops reality |
| Policy version pinned on each decision | P0 | Reproducible audits |
Audit & compliance
| Item | Priority | Why |
|---|---|---|
| Append-only decision_log (revoke UPDATE/DELETE) | P0 | Art. 12 tamper resistance (best-effort in PG) |
| HMAC / hash chain optional column | P1 | Detect silent UPDATEs by superuser |
Retention helper (purge_decisions_older_than) |
P0 | GDPR minimization vs legal hold |
| PII hashing guidance for context | P0 | Don’t log raw customer ids |
| Export to JSONL for SIEM | P1 | Splunk/Datadog pipelines |
Runtime / Postgres internals
| Item | Priority | Why |
|---|---|---|
ProcessUtility_hook DDL firewall for agent roles |
P1 | Defense if someone skips evaluate() |
Statement timeout / default_transaction_read_only recipes |
P0 | Pack, not code |
Connection GUC pg_policy.agent_id |
P1 | Implicit principal from session |
| pgrx evaluator | P1 | Latency at MCP QPS |
| Parallel-safe STABLE evaluate where possible | P1 | Use inside views carefully |
Ecosystem “works for all”
| Item | Priority | Why |
|---|---|---|
Pack loader (\i examples/packs/*.sql) documented |
done (0.1) | |
| Python PEP middleware | done (0.1) | |
| MCP reference wrapper | P0 | Drop-in for execute_sql |
| LangGraph ToolNode example | P0 | Production graph pattern |
| AuthZEN HTTP sidecar | P1 | Non-SQL PEPs |
| Terraform / Ansible install | P2 | Enterprise |
| pg_tle packaging experiment | P1 | RDS path |
| Editor TextMate/tree-sitter for APL | P2 | DX |
Out of scope
- Replacing RLS or GRANT
- Running untrusted Python/JS as policy
- Core Postgres grammar patches
- Hosted SaaS requirement for the extension to be useful
Suggested 0.2 cut
- Pack test assertions
acting_forin evaluate API (additive JSON)- Append-only grants recipe
- Prefix globs
require_approvalobligation type
Everything else can wait for pgrx without blocking adoption.