FAQ
Short, direct answers to the questions people actually ask about Data Prism. Each answer's first sentence is a complete answer on its own; the rest is the detail and the source.
Is the output anonymous?
No — pseudonymised data is still personal data under GDPR Article 4(5), so Data Prism's output is not anonymous. It replaces identifying values with a deterministic pseudonym scoped to the use case; sending that output to a third-party model is still processing personal data, and still needs a lawful basis, a DPIA, and a transfer mechanism where the provider is outside the EU. Data Prism reduces exposure — it does not remove that obligation. See "What it is not" in the README.
How are pseudonyms made?
Each pseudonym is derived deterministically from (scope, subject, namespace,
algorithm version, key) using an HMAC-based generator — never random, never
stored in plaintext, and reproducible without a cache, so the same person
reads as the same synthetic identity in every source, and two different
investigations get two different identities for the same person. As of
version 0.3.0 the generator's discriminator is 40 bits (eight Crockford
base32 characters), widened from the 20 bits used in 0.2.0, and every
namespace — including ADDRESS, which previously carried none — now renders
one. See "What Data Prism does" in the
README and the 0.3.0 entry in CHANGELOG.md.
Does it detect PII in free text?
Only for a fixed set of identifier shapes, not general PII detection: a
fail-closed validator scans every response — including free-text fields such
as a note — for values that look like an IBAN, a payment card number, an
Irish PPSN, a US Social Security Number, an email address, an international
phone number, a JWT, or a known API-key prefix, at any depth up to a size
budget, and refuses the response if it finds one that is not already one of
the scope's own emitted pseudonyms. This is shape-based matching for a fixed
list of formats, not open-ended named-entity recognition, so it will not
catch, for example, a bare name typed into a note; the repository does not
document a reason for that scope beyond it being what shipped. The check
allows the scope's own pseudonyms through a per-scope allowlist, because
without one a synthesised value that happens to match a detector's shape —
a synthesised email, for instance — would make the validator refuse Data
Prism's own valid output. See the validation module and the
2026-09-08 decision to allowlist a scope's own pseudonyms in
architecture.md and
architecture.md, and the
detector list in
SensitiveDataScanner.java.
Free-text values are checked separately for instruction-like phrasing, not
PII — see "Does it stop prompt injection?" below and the worked example in
tools.md.
Do I need Java?
No, not to protect a flat or one-level-nested JSON REST API: the
configuration-driven JSON REST mode lets you do that with only a YAML
catalogue — no Java class, pom.xml, or META-INF registration step — see
protect-your-own-api.md. Data Prism itself
still runs on a JVM (the standalone server or the Spring Boot starter), and
the published server image still refuses to start until you supply that
catalogue or a reviewed adapter and a full deployment configuration — see
"If you found this on the MCP registry"
in the README. For a response nested two levels or more, custom fetch logic,
or a non-JSON source, you do need to write a reviewed Java
DataSourceAdapter — see extending.md.
What does the audit trail prove?
For every record the offline verifier can see, in each writer's own hash
chain, it proves that replaying that chain found no edit or deletion of any
of the nineteen hashed fields — nothing more. It does not prove several
things, deliberately: truncation of a writer's most recent records is
undetectable, because an append-only file with its tail removed verifies
perfectly end to end, with nothing left in the file to disagree with, and
the same blind spot covers deleting an entire boot's records outright — the
surviving writers still verify intact, and the report never mentions the
boot whose records are gone. The chain is also intra-writer edit-and-delete
detection only, not a guarantee against a capable adversary:
AuditEventHash is unkeyed SHA-256 over the record body, so anyone able to
write to the file directly can edit or delete a record and simply recompute
every hash that follows it, and the chain still verifies. Durable
append-only-ness is an operator responsibility this class does not enforce,
and metric labels and trace attributes are not scanned by any test in this
release. No sentence here, or in the source, should be read as a claim that
the durable audit log resists a determined attacker, cannot be changed, or
is a complete account by itself — it is not. See the full account in
"What this does and does not prove"
in audit.md.
Does it stop prompt injection?
No — InstructionContentHeuristic flags source content that reads like an
instruction to a model; it is deliberately not a prompt-injection defence.
It matches a fixed set of signals (phrases like "ignore previous
instructions", a fake system-prompt marker, and similar) against a source
value, attaches a finding saying what it looks like, and passes the value
through unchanged, because rewriting it would hide the record's true content
from the one person who could recognise the attack. Anyone determined can
phrase around a fixed list of signals, so treat a finding as putting a human
on notice, not as protection. See
InstructionContentHeuristic.java
and design-review.md
(an internal doc kept off the docs site, linked here at its GitHub source).
Is it production-ready?
No — SECURITY.md states plainly that
the project is pre-1.0, and that only the latest released version receives
security fixes. Version 0.3.0 is that latest release, and across its
history the privacy engine, deterministic pseudonymisation, correlation and
consistency findings, the JSON REST and reviewed-adapter connectors, the
OAuth2 resource server, and an opt-in durable hash-chained audit sink with
an offline verifier have all been built and are covered by tests — see the
full release history in CHANGELOG.md. Two of the four
originally designed MCP tools, search_entity_data and
describe_entity_model, are not implemented — see
"Not yet built" in tools.md — and the
re-identification operator surface and an Elasticsearch connector are
deferred by design, not missing by accident.