Skip to content

Check it yourself

There is no account to make, no service to sign up for, and nothing running that you have to trust. Everything below is a link into the repository or a command you can run in about a minute.

One minute

See a real decision, with nothing installed but uv

The demo workspace ships a recording captured from a live DataHub instance, so a fresh clone produces the real thing — no Docker, no catalog, no waiting.

git clone https://github.com/AmirmLotfy/zence && cd zence
uv sync --all-packages

uv run zence evaluate --tool Write --file models/blend.sql \
  --content "SELECT l.email, p.phone
             FROM northstar.marketing_leads l
             JOIN bluepeak.patient_contacts p ON p.email = l.email" \
  -C examples/clients/northstar-analytics
Exit code 6 is a denial. 0 is allow, 7 is approval-required — so this is scriptable, and CI can assert a rule still fires.

What you should see

✗ DENY ZR-001 naming email, phone and postcode as classified at column level, with the DataHub URN as evidence and an in-domain alternative offered.

Where that came from

A recording, captured by zence demo record from a live DataHub instance. Every decision it produces reports provider: fixture — a recording can never pass itself off as a live read.

Ten minutes

Run it against your own DataHub

Everything above, against a catalog you control. Setting DATAHUB_GMS_URL takes precedence over the recording.

datahub docker quickstart          # ~8 GB RAM, 13 GB disk
export DATAHUB_GMS_URL=http://localhost:8080

uv run zence demo seed
uv run zence demo verify
uv run pytest -m integration       # 15 tests against the live catalog
`demo verify` re-reads every entity through the same provider a hook uses and exits non-zero on the first gap — it is how the tag-reading bug in this project was caught.

The real thing

Install the plugin and try to break the boundary

/plugin marketplace add AmirmLotfy/zence
/plugin install zence@zence
Then open Claude Code in examples/clients/northstar-analytics and ask it to join the Northstar leads with the BluePeak patient contacts.

Straight to the source

Every claim, and where it lives

Links into the repository
The decision enginePrecedence, and why tamper is checked before everything else.
The fail-safe matrixWhat happens when no rule matched — the part worth reading twice.
The twelve rulesPolicy as data. No expression language, no eval.
The DataHub providerIncluding the association-object bug that only a live catalog revealed.
Hook wire format28 tests asserting the exact shape Claude Code acts on.
Adversarial testsHostile policies, injected metadata, ReDoS, credential leakage.
Live DataHub testsThe four scenarios and idempotent write-back, against a real catalog.
Decision artifactsThe JSON rendered on the demo page. Not written by hand.
The demo catalogTwo fictional clients, shaped so each rule has a realistic asset.
Clean-room verificationClones the published repo and runs a reviewer’s setup from nothing.
Threat modelWhat Zence is not, and one accepted risk with its reasoning.
Build statusWhat is verified, and against what.

Worth knowing

Two things we would rather say than have you find

There is no hosted catalog

Zence runs entirely on your machine, so there is no Zence server to be down and no demo instance to expire. That also means the live-DataHub path needs a catalog you start yourself — the recording exists precisely so that is optional rather than required.

The clients are fictional

Northstar Commerce and BluePeak Health do not exist. The decisions about them are real output from the engine; the companies, datasets and people are invented, because a tool about not leaking client data should not ship anyone’s.