Rules decide each AI agent tool call; Deedglass checks what really changed and seals a record.
An agent was asked to mark order 42 as shipped. It ran one UPDATE and its tool reported 1 row. A
legacy trigger shipped 300 more orders in the same transaction. This is the real output of the
Quickstart's last step on 2026-10-14 (shortened where you see …):
$ npx -y deedglass init --trigger
…
✕ UPDATE order 42 Proven · Doesn't match · Postgres changed 301 rows in public.orders. The agent reported 1.
expected UPDATE 1 row in public.orders where id = 42 · sets status
observed UPDATE 301 rows in public.orders · 300 outside id = 42
…
✓ Trigger off orders_ship_open_batch dropped
✓ Undo preview Undo available · 301 rows in public.orders · 301 updates
policy undo-needs-approval · a person countersigns first
The agent's log says 1 row. Deedglass read Postgres's own change log for that transaction, found 301, sealed the difference as a record, and planned an undo from those rows that runs only after a person countersigns.
| Command | What it needs | What leaves your machine | |
|---|---|---|---|
| In your browser | deedglass.com/play | A browser tab. Postgres runs in the page; it opens on the "said 1, changed 301" scene. | Nothing |
| In your terminal | npx deedglass play | Node. No Docker. The rules decide each call live and the records are sealed and checked on your machine; Postgres's lines are replayed from a recorded real run, and labelled as such. | Nothing |
| Scan your setup | npx deedglass scan | Node. Reads your MCP configs and, if you name one, a database catalog, read-only. Grades what your agents could change, A to F. | Nothing |
| Observe mode | deedglass observe run --connector pg-demo -- ./agent.sh | A Postgres connector with observe on. Nothing to rewire: it reads Postgres's change log beside whatever gate you already use. | Nothing |
When a scan finds a trigger or a cascade on a table your agent can write, it says so and points to the 301 scene. Observe mode is below.
Docker running, Node 22.12 or newer, then (from the tested Quickstart):
mkdir acme-agents && cd acme-agents
npx -y deedglass init --yes
npx -y deedglass doctor
npx -y deedglass init --trigger
deedglass init starts two Postgres 18.6 containers in Docker (Deedglass's own database and a demo
database), runs deedglass serve on 127.0.0.1:8080, creates an org, an agent and the
postgres-safe policy, and ends with a blocked DROP TABLE and an UPDATE checked at Proven.
deedglass doctor runs sixteen read-only checks, each with its fix. deedglass init --trigger turns
on the demo database's legacy trigger, sends the same one-row UPDATE, and ends on the 301-row
mismatch and the undo preview shown above.
deedglass observe run --connector pg-demo -- ./agent.sh # open a watched session, run the agent, close it
deedglass observe show obs_01k… --undo-sql # the undo as SQL you review and run (free)
Turn it on with witness.observe.enabled: true in the connector's config. Observe mode reads only
Postgres's change log, through the role and replication slot that deedglass connector postgres init
creates, so it works beside any gate you already use, or none.
It shows every row committed on the watched tables while the session was open and seals the session
as a record. It can't tell which program wrote a row, so a session gets no Matches or Doesn't match
verdict; row images are kept 30 days; a TRUNCATE can't be undone from the record. Undo SQL is free;
a one-step undo through Deedglass is Pro. Details: docs/OBSERVE.md.
flowchart LR
A["AI agents<br/>Claude · OpenAI · Cursor · any MCP client"] -->|tool call + agent key| G
subgraph D["Deedglass · one binary + Postgres"]
I[Identity] --> P[Policies] --> G[Rules]
G --> W[Check] --> S[Records] --> L[Ledger] --> N[Insights]
end
G -->|credentials from the vault| T["Tools<br/>Postgres · GitHub · Slack · Stripe · MCP servers"]
T -->|what actually happened| W
H[People] -->|approve · stop| G
Every tool call passes through Deedglass with the agent's key. Your rules (policies) decide allow,
deny or require_approval; Deedglass runs the call with credentials the agent never holds; the
check compares what happened with what was asked; and the outcome is sealed as a record in the org's
chain.
| Level | What it checks | What it can't see |
|---|---|---|
| Claimed | The tool's own answer, against a schema and your postconditions | Whether the answer is true |
| Checked | A read-back from the target (GitHub, Slack, Stripe, Notion, REST, Postgres rows) | Side effects the read-back doesn't cover |
| Proven | Postgres's change log (logical decoding): every row the transaction committed | DDL, sequences, unlogged tables and anything outside that database's WAL |
Each record claims one level and one result: Matches, Doesn't match or Can't check. When
Deedglass can't tell whether a tool ran, the result is Can't check, never Matches. The API keeps
the short names (L0/L1/L2, VERIFIED/MISMATCH/UNVERIFIABLE); the
glossary maps them.
wal_level=logical and REPLICA IDENTITY FULL on watched tables.The whole list, with workarounds: docs/LIMITATIONS.md and KNOWN_ISSUES.md.
You may not need Deedglass, or you may want it next to one of these. Each has a longer page, with sources and the date each was checked, at deedglass.com/compare.
| If you need | Use this | Where Deedglass fits |
|---|---|---|
| An agent that only reads | A Postgres role with SELECT and nothing else. It can't change data whatever the agent sends, and there's nothing to install. | You don't need it. It's for agents that must write. (compare) |
| A place for an agent to try changes | A database branch: a Neon branch is a copy-on-write clone of your data; Supabase branches start without production data by default. | For the writes that must reach production: rules first, then the check and the record. (compare) |
| Routing, isolation and credentials for many MCP servers | An MCP gateway, such as Docker's, which runs each server in an isolated container and injects credentials. | Behind the gateway, for the servers that write to Postgres. (compare) |
| Traces of each step, and evaluations | Langfuse or LangSmith. | Next to them: a trace is the agent's side of the story; the check reads what Postgres committed. (compare) |
| Rules at the wire for Postgres, Kubernetes and HTTP | Claw Patrol, which gates each action against rules over the parsed traffic. | It also decides first; it adds the check of what Postgres committed, records anyone can check offline, and undo. (compare) |
| Scanning what an agent sends out and what its tools return | Pipelock, an agent firewall that scans MCP traffic in both directions. | It adds the check of what Postgres committed after each call, and undo for the rows. (compare) |
| How | Command |
|---|---|
| npx (no install) | npx -y deedglass help |
| Install script (macOS, Linux) | curl -fsSL https://raw.githubusercontent.com/deedglass/deedglass/main/scripts/install.sh | sh |
| Binaries | archives for macOS, Linux and Windows on the latest release, with checksums.txt |
| Go | go install github.com/deedglass/deedglass/cmd/deedglass@latest (the CLI, without the Console) |
| Docker | build the image from a checkout: make web-build docker (tags deedglass:dev; Node 24 builds the Console) |
The install script downloads the release archive for your platform, checks its sha256 against the
release's checksums.txt, and copies deedglass into ~/.local/bin; read it first:
scripts/install.sh. A public container image is coming; until it's
published, build the image locally as above. Checksums, signatures and SBOMs:
docs/INSTALL.md.
Install in VS Code · LM Studio · Goose · Claude Desktop · Every client
claude mcp add deedglass -- npx -y deedglass mcp serve
No link holds a key. Run npx deedglass init first; each client asks Deedglass for the key it wrote.
Claude Code plugin (the MCP server, a /deedglass:scan command, and skills for reading a
scan and for giving an agent Postgres access safely), from this repo's own marketplace:
/plugin marketplace add deedglass/deedglass
/plugin install deedglass@deedglass
Every format, with its source: docs/INSTALL_CLIENTS.md.
@deedglass/sdk, with adapters for the AI SDK, the OpenAI Agents SDK, LangChain and the Claude Agent SDK.pip install deedglass, with LangChain and Claude Agent SDK adapters.github.com/deedglass/deedglass/pkg/deedglass.deedglass mcp wrap governs any stdio MCP server; deedglass mcp serve governs remote ones
for Claude Desktop, Claude Code, Cursor, VS Code and Windsurf.Postgres (Proven), REST, GitHub, Slack, Stripe (test mode only), Gmail drafts, Notion and remote MCP
servers. Credentials live in an encrypted vault; every outbound call goes through one egress door.
See docs/CONNECTORS.md.
| What | Measured | Target |
|---|---|---|
| Gate · allow, no witness | p50 5.81 ms · p99 19.4 ms | p50 < 5 ms · p99 < 25 ms (p50 missed) |
| Policy · 50 rules | p99 148 µs | p99 < 1 ms |
| Witness · L2 at 100 writes/s | p50 118 ms · p99 317 ms | p50 < 1 s |
| Verify · 100,000 deeds | 1.53 s · 80.9 MiB | < 5 s · < 256 MiB |
| Stop · across 2 instances | max 23.5 ms over 20 trials | < 2 s |
How they were measured, and the misses: docs/BENCHMARKS.md.
The attack suite runs 70 cases against a real server and real Postgres on every release candidate:
70 matched, 0 differ (attack/results/latest.json, docs/ATTACK_SUITE.md).
Report a vulnerability privately: SECURITY.md.
Free features send nothing to deedglass.com. Only a machine with a Pro licence checks it, through
Dodo Payments and deedglass.com: deedglass serve when it starts and then daily, and Pro commands
when you run them; a request goes out only when the last successful check is a day old.
deedglass version --check and the --latest option of deedglass policy install and
policy packs contact GitHub only when you use them.
DEEDGLASS_NO_NETWORK=1 stops the licence check; Pro then runs on its cached token for up to 14 days.
Read CONTRIBUTING.md: make dev, make ci, the tests a change needs, and DCO
sign-off (git commit -s). Questions go to Discussions (SUPPORT.md); how decisions
are made is in GOVERNANCE.md.
If Deedglass showed you something your logs didn't, a GitHub star helps other people find it.
The core, the SDKs and the CLI are Apache-2.0. The Pro features in ee/ are FSL-1.1-ALv2, and each
release of them becomes Apache-2.0 two years after it ships. The release binary, the
@deedglass/cli-* npm packages and the container image include ee/, so their licence is
Apache-2.0 AND FSL-1.1-ALv2.
FSL-1.1-ALv2 lets you read, run and change ee/ for anything except offering a competing product
(ee/LICENSE); everything Deedglass does for safety is free and outside ee/
(docs/LICENSING.md). The rest is LICENSE; third-party notices
are in NOTICE.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y deedglassMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-deedglass-deedglass": {
"command": "npx",
"args": [
"-y",
"deedglass"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referencedeedglassnpmDeedglass works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.