The missing 1.58 percent still leaves.
National Design Studio released Rampart, a browser-side filter that combines structural recognizers with a small token-classification model. Its repository reports 98.42 percent private-term recall on a 30,000-row held-out set across seven supported Latin-script languages.[1]
That is a benchmark result, not a promise for each message. Recall measures detected private terms in the tested set. A miss in a real prompt can still expose the one account number, name, or address that mattered.
A high recall score describes a test set. The send button needs a failure plan.
Local changes the route, not the meaning.
Rampart runs detection before a message reaches the model provider. It replaces detected values with stable placeholders and restores them on the client. The default model route loads weights from Hugging Face, while the repository also documents local model serving.[1]
That design can remove raw personal values from the provider request. It does not remove meaning from the remaining text. A rare diagnosis, employer, small town, and unusual event can identify someone together even when no single phrase matches a PII label.
The published limits belong beside the score.
The project supports English, Spanish, French, German, Italian, Portuguese, and Dutch. Its README says non-Latin-script names reach about 14 percent aggregate recall in its fairness suite. It also reports 86.4 percent on a 20-case hostile-input test and lists indirect identifiers, images, audio, and structured form fields as out of scope.[1]
Those limits are not footnotes. They define who can use the current release, which inputs need another control, and where a redaction badge would make an unsafe claim.
The artifact is real. This run stayed read-only.
The npm registry served @nationaldesignstudio/rampart version 0.1.3. We fetched its package archive without installing it. The archive contains the compiled browser entry point, TypeScript source, evaluation files, model card, whitepaper, examples, and license. Its SHA-256 was 021121057617acd32ad355639539a24f4635a685897afc1e20422a64c93ef565.[2]
We did not install the peer dependency, load the model, run the benchmark, or send text through Rampart. The bench below is an original structural-pattern demo. It shows why a useful local filter still needs a loss map.
Put four checks before send.
- Scan structured identifiers with validators, not loose digit patterns.
- Test contextual names and addresses against the languages your users write.
- Review the remaining text for combinations that identify a person indirectly.
- Keep the provider's retention, logging, access, and deletion controls in force.
Redaction is one layer. The route after redaction still needs a data policy.