proveml
The reference.
What the marks mean, what you can build on them, where the data comes from and how to run it. If you are still deciding whether any of this is for you, thecase for ProveML is the shorter read, and the package runs there on the page so you can break it yourself.
From verified to trusted.
Verified means one thing so far: the claim matches your record. It says nothing about whether the record deserved to be believed. That is where verifiable credentials come in.
An SD-JWT credential is signed once by its issuer, over a list of hashes — one per field. The holder then sends only the values they choose; each one hashes back to a line the issuer already signed. One disclosed field, one checkable claim: exactly the granularity ProveML works at.
Feed those into the fact store and a verified claim stops meaning “our database says so”. It means the issuer signed for it, and the signature holds. So the rendering answers two questions instead of one: does the record agree, and was the record worth agreeing with.
- issuer
- Acme NV — HR Department
- valid until
- 1 September 2026
what the signature covers
Kl8Wm2p…name Alice De Smet9xQr4vN…employer Acme NV7bTz1cX…role Staff EngineermE5oL8k…location GhentvR3nY7d… Qa9Uf2s… Jt6Ib4w…three more, not disclosed
The issuer signed seven hashes. The holder sent four of the values behind them; the other three stay closed, and the signature holds either way. Salary and employee number were never part of this conversation.
issuer signaturesha256:4f2a…9e11
- issuer
- OldCorp BV — HR
- valid until
1 January 2025
what the signature covers
Wp2Kd8m…name Bob JanssensRx7Vn3q…employer OldCorp BV
The signature on this one still checks out perfectly. It says what it always said — only it stopped being current eighteen months ago, and a signature cannot tell you that on its own.
issuer signaturesha256:b81c…27fa
Alice De Smet is employed atAcme NV as aSenior Engineer, based inGhent.Bob Janssens was employed atOldCorp BV.
- trusted a live credential agrees
- falsified the credential contradicts it
- stale agrees, but the credential has expired
Bob's line is the interesting one, and the second card is why. His claim matches that credential perfectly and the signature verifies — it is simply no longer in force. Cryptography will happily confirm a true statement about a job someone left, which is the sort of thing a fact store cannot notice at all.
This is the format the European identity wallet uses, so these credentials are not hypothetical: they are what employers, schools and public bodies are being built to issue. Signed data is how a claim gets from consistent with a record tosomeone put their name on it — which is a different sentence entirely when a regulator asks.
sd-jwt adapter · two axes: does it match, and does the signature still hold · working example ships with the package
Entities
@[order:4821]{order 4821}— this text refers to that record. Checked against the stored reference.Facts
%[shipDate]{14 March}— this value is that field. Checked by exact comparison, units included.Judgments
?[covered: IS_IN_WARRANTY]{still covered}— replies also say “still covered” and “critically low”. Those are claims too, so they must name a rule someone defined outside the generation.The boundary
Everything outside a construct is ordinary prose and is never presented as checked. Knowing where the guarantee stops is part of the guarantee.
Send without rereading
Every value carries a status before anyone sees it, so your attention goes to the handful that failed instead of the hundred that held.
Agents that fix themselves
A failed check is a specific message —warrantyUntil is 3 June 2026, not 2027 — so the model repairs that one claim and tries again. No human needed for the boring half.
Check what you did not write
Verification is separate from generation, so a document can be checked months later, against the data as it stood, with the same answer every time.
Adjectives that mean something
“Still covered” means what your warranty rule says it means, defined outside the model. The phrase becomes a claim you can check, not a courtesy.
Evidence on request
Audit view puts the checked path beside each claim —
order:4821.shipDate— so a reviewer sees which record backs which sentence, without reading any markup.Names stay with you
The model works with
order:4821; real names and addresses are filled in at render time. The claims are checkable, the personal data never left your side.
One command, nothing to set up.
npx proveml demoIt prints a short report in your terminal, the records it was checked against, and the same marks you saw at the top of this page — verified, wrong, unproven — underlined right in the text.
Once you want it on something of your own, give it a file and your data:
npx proveml verify --input report.md --facts facts.jsonThe exit code is 1 when a claim fails, so this drops into a build the way a test does. Your data goes nowhere: the check runs on your machine, against a file you control.
npm: proveml → · apache-2.0 · source opens with the paper
Further.
The research behind it is written up in a paper, with the benchmarks and experiment artifacts published alongside. The package ships TypeScript declarations and anllms.txt for agents that pick it up on their own.
the case for proveml → · the findings, verified by ProveML itself → · source →