On the current rules, Papinian Guard masked all 542 protected values in the 30 English documents, on macOS and on Windows alike. One of its 550 symbols hid a word that needed no protection.
1. The test
Test number. PT-261101-EN1, this test’s own code: the onboarding and the downloads name it.
What it measures. Whether any protected value in the English documents would leave the computer with a letter or a figure still visible, and how many words that needed no protection were masked.
What it shows. The rules were improved on these documents, round by round: each set after the first was written after a round of fixes and run once, and the next round was made from what it found. A set the fixes were made from shows their effect, not their reach. The reach is what the first runs measure: the sealed set’s and the 1 November set’s.
The rules. Round 6 of the fixes, the newest code (1 November 2026).
System
Protected values
Masked
Missed
Needless masks
Documents refused
macOS
542
542 (100%)
0
1 of 550 (0.2%)
0 of 30
Windows
542
542 (100%)
0
1 of 550 (0.2%)
0 of 30
A needless mask is counted among all the symbols that would leave; a document is refused when the outbound check finds something protected still in it.
2. Technical details
Code. Papinian Guard at commit 47f4dd4747ce0ebedd85d86de55ed3c114591f16 of the open repository legal-machines/singularity (1e13e8289 in Legal Machines’ development tree).
The measuring tool.papinian_masking_measure, from code/tests/papinian_masking_measure.cpp. For each Word file it reads the text with Singularity’s own extractor, cuts it into the passages a request carries, protects the whole document as one operation with Papinian Guard’s local model and its rules, and runs the outbound check that stops a request if anything protected would still leave. It writes each passage as read and as it would leave, and nothing else.
The scorer.other/benchmarks/papinian-masking/measure.py writes the Word files with python-docx, runs the tool and scores what would leave. It finds each symbol by aligning a passage as read with the same passage as it would leave, so the mapping from symbols back to values is never written down.
The model. Papinian NER 1.0.0, the package Singularity downloads (papinian-ner-1.0.0.zip, SHA-256 0f70a2a3eb1abac455e6a1cdba6e686e27d138a55eec05f0a13edcbded8ef91d); each of its nine files matched the hash Singularity pins for it. It is the open GLiNER2 privacy model fastino/gliner2-privacy-filter-PII-multi, exported to ONNX without further training, and runs on the processor through ONNX Runtime 1.23.2. A detection is used at a confidence of 0.5 or more.
The setting. Standard protection.
What is scored. Each document’s labels list, before its first run, the writings that must be masked: the names of people and organisations, identifiers, amounts and dates, as Papinian’s documented rule defines them. A protected value is each place such a writing stands. It is masked when every letter and figure of it is under symbols, and missed when any is left visible. A symbol over no labelled writing is a needless mask. Writings the rule leaves open, such as a public court or the law a contract chooses, are listed apart and not scored.
The runs. The figures are from the run recorded on 1 November 2026 at 07:15 MSK on macOS and 07:16–07:29 MSK on Windows. The tables come from the same code run again the same day, at 10:46–10:47 MSK on macOS and 10:41–10:49 MSK on Windows, by measure.py at ab9527ac4, which also lists each masked value with the symbol that took its place. Both runs gave the same counts, misses and needless masks on each system.
To run it again. With the open repository at the commit above, the tool built and the model package unpacked, run python3 other/benchmarks/papinian-masking/measure.py --tool TOOL --model MODEL --set SET --out SET.json for each set SET of main, holdout, holdout2, holdout3, holdout4, holdout5, TOOL being the built tool and MODEL the model’s folder. The download’s method/measure.py is the scorer at ab9527ac4.
3. Machines
Both systems ran every document of the test, one set after another, with no other heavy work on the computer. A wall time is the whole measure.py run: writing the Word files, starting the tool and loading the model included.
macOS
Windows
Computer
MacBook Pro (Mac17,9)
Desktop PC
Processor
Apple M5 Pro, 15 cores (5 Super and 10 Performance)
Six sets, each written before it was run.main holds the working day’s four NDAs and six documents written beside them; round 1 of the fixes was made from it. holdout, holdout2 and holdout3 were each written after a round of fixes, in October 2026, and run once before the next round was made from them. holdout4 was written and labelled on 1 November 2026 before any run on it, and round 5 was made from it. holdout5 was written and sealed on 1 November 2026 before round 5 began (holdout5.py, 10,187 bytes, SHA-256 922ac2c284ff87cef3089fba4a49554f5cd6a86212e0d0435ed7c61f05552afd), run once on round 5, and round 6 was made from it.
Parties and law. US companies under US law, and one English company under English law, in the Saltmarsh Analytics NDA.
Fictional. Every company, person, address and number is invented, and mail domains end in .example. Telephone numbers are in 555-01xx, the range the United States reserves for fiction. No document names a real person or company.
Counted. A protected value is each place a labelled writing stands; open writings are the labels’ list of what the rule leaves open.
Document
Set
Kind
Protected values
Open writings
Ottermere Analytics NDA
main
Mutual nondisclosure agreement
14
0
Sablewood Distribution NDA
main
Confidentiality agreement
28
0
Fernhollow Engineering NDA
main
Mutual nondisclosure agreement
19
0
Kettleby Logistics NDA
main
Mutual confidentiality agreement
13
0
Brightwater Bioinstruments NDA
main
Mutual confidentiality agreement with notices
26
1
Corvane Capital NDA
main
Investor’s confidentiality and standstill agreement
22
0
Ottermere NDA First Amendment
main
Amendment to a nondisclosure agreement
17
0
Westbrook Hale cover letter
main
Counterparty’s cover letter
20
2
Marsh consulting confidentiality
main
An individual consultant’s confidentiality agreement
26
1
Ashgrove University research NDA
main
University research confidentiality agreement
12
0
Riverbend Hospital NDA
holdout
Hospital’s mutual nondisclosure agreement
20
1
Quarrystone Ventures NDA
holdout
Confidentiality agreement
26
0
Tallow Finch engagement letter
holdout
Law firm’s engagement letter
20
1
Employee confidentiality agreement
holdout
Employee confidentiality and invention assignment agreement
12
1
Brannock Precision supplier NDA
holdout2
Supplier confidentiality agreement
21
1
Okonkwo Lisle settlement letter
holdout2
Settlement letter
14
0
Lumenfield processing schedule
holdout2
Data processing schedule
13
0
Saltmarsh Analytics NDA
holdout3
Mutual non-disclosure agreement under English law
20
0
Halvane board minutes
holdout3
Board minutes
13
0
Kettleby open points memo
holdout3
Open points memo
9
0
Wrenfield offer letter
holdout4
Offer letter
15
2
Corvane demand letter
holdout4
Demand letter
26
1
Larchmere term sheet email
holdout4
Term sheet sent by email
14
6
Larkspur Commons office lease
holdout4
Office lease
19
5
Pellworth settlement agreement
holdout4
Settlement agreement and mutual release
22
1
Meridale master services agreement
holdout5
Master services agreement
23
3
Ostrander separation agreement
holdout5
Separation agreement and general release
13
0
Ferncastle stock purchase agreement
holdout5
Stock purchase agreement
19
1
Thornbury litigation hold notice
holdout5
Litigation hold notice
13
3
Ashgrove promissory note
holdout5
Promissory note
13
2
Download this test, 1.1 MB, SHA-256 69344ca7d098120d662690958e0e698df9f0e755cedb8674d293f8ac2994addd: the Word files as the test protected them, their labels, both systems’ recorded runs and table runs of this test, each machine’s description and the scripts that wrote and scored the documents. Every test at once is on the index.
5. Masked
542 of the 542 protected values were masked, on macOS and on Windows alike. Each document’s table gives every value masked in it: Places counts where the value stands, and Masked as gives the symbol that would leave the computer in its place, with the words it replaced where they reach beyond the value. A row marked left open is one of the 8 places where a symbol hid a writing the rule leaves open: masking it or not is right, and it is not scored.
[[Place1]], replacing 1200 Harbor Drive, Suite 410, San Diego, California 92101
HALVANE ROBOTICS
1
[[Org1]], replacing HALVANE ROBOTICS, INC.
Bartholomew Achterberg-Nnamdi
1
[[Person1]]
One Million Two Hundred Fifty Thousand Dollars
1
[[Amount2]]
6. Missed
None: no protected value would have left the computer with a letter or a figure visible.
7. Masked needlessly
1 of the 550 symbols (0.2%) hid words that needed no protection. Each passage quotes the words around them as the scorer did.
Thornbury litigation hold notice
Masked words
Masked as
In the passage
Kent
[[Place2]]
…chat, log and file about Thornbury, the <<Kent>> installation or our internal matter number…
The labels leave the place open as “Kent, Washington” but do not list “Kent” alone, and Papinian Guard masks a party’s places by its rule, so this mask stays as scored.