<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://research.klusai.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://research.klusai.com/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-10-11T21:45:16+00:00</updated><id>https://research.klusai.com/feed.xml</id><title type="html">KlusAI Research</title><subtitle>Open privacy-focused models for European languages — benchmarks, datasets, models and papers from the KlusAI privacy program.</subtitle><author><name>KlusAI</name><email>research@klusai.com</email></author><entry><title type="html">October update</title><link href="https://research.klusai.com/results/models/2026/10/11/october-update.html" rel="alternate" type="text/html" title="October update" /><published>2026-10-11T00:00:00+00:00</published><updated>2026-10-11T00:00:00+00:00</updated><id>https://research.klusai.com/results/models/2026/10/11/october-update</id><content type="html" xml:base="https://research.klusai.com/results/models/2026/10/11/october-update.html"><![CDATA[<p>The programme restarted on October 11. The next horizon is a deployment-grade privacy
layer for EU AI gateway traffic. We have useful evidence to build on, and gaps that need
to stay visible. A good legal-text result is a starting point; it does not establish
protection on gateway conversations.</p>

<h2 id="the-legal-specialist-joins-the-uniform-board">The legal specialist joins the uniform board</h2>

<p><code class="language-plaintext highlighter-rouge">klusai/kp-deid-xlmr-560m-legal</code> now appears on the same board as the other detectors,
following <a href="https://github.com/klusai/europriv-bench/pull/47">europriv-bench #47</a>.
Its strongest result is still on TAB, the external English court-text benchmark:</p>

<table>
  <thead>
    <tr>
      <th>Model</th>
      <th style="text-align: right">TAB DIRECT-identifier leak rate</th>
      <th style="text-align: right">95% Wilson CI</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>kp-deid-xlmr-560m-legal</td>
      <td style="text-align: right"><strong>9.47%</strong></td>
      <td style="text-align: right"><strong>6.50–13.61%</strong></td>
    </tr>
    <tr>
      <td>Stock Presidio</td>
      <td style="text-align: right">50.0%</td>
      <td style="text-align: right">44.01–55.99%</td>
    </tr>
  </tbody>
</table>

<p>That is the best TAB direct-identifier leak rate on the board. The comparison covers
<strong>127 documents and 264 DIRECT subjects</strong>, using the legal seed0 checkpoint and one
Presidio run. The CIs are disjoint on this held-out config. The
<a href="https://github.com/klusai/klusai-models/blob/1f5296c843e32910c3bada14b8c58e3d5383ddf4/docs/north-star-gap.md#2-acceptance-ledger-evidence-gap-closure">source ledger</a>
also records three legal training seeds, but the interval above belongs to seed0;
it is not an interval over training seeds.</p>

<p>The same model leaks <strong>100% of CNPs on <code class="language-plaintext highlighter-rouge">ro-synthetic-v1</code></strong>, with a <strong>95% Wilson CI of
[99.62–100.00]%</strong>: all <strong>1,017 subjects</strong> across <strong>1,500 documents</strong>, one checkpoint.
The source marks that config <code class="language-plaintext highlighter-rouge">dev</code> and <code class="language-plaintext highlighter-rouge">in_distribution</code>; it is not a held-out win.
We report the failure alongside the legal result. This is a <strong>specialist, not a general
privacy model</strong>. The <a href="/leaderboard/">leaderboard</a> exposes both results and their config status.</p>

<p>There is a metric boundary too. TAB’s historical DIRECT score treats an occurrence as
covered when any predicted token is redacted, then requires coverage of every occurrence
of the entity. Part of a name can survive. This is a direct-identifier leakage proxy,
not measured attacker re-identification probability or proof of complete residual removal.</p>

<h2 id="a-first-cpu-measurement-with-its-limits">A first CPU measurement, with its limits</h2>

<p>The <a href="https://github.com/klusai/klusai-models/pull/27">CPU study merged in klusai-models #27</a>
measured the adapters on the same <strong>200 chat-length inputs</strong> on an Apple M3 Ultra:</p>

<table>
  <thead>
    <tr>
      <th>Checkpoint</th>
      <th style="text-align: right">CPU p95</th>
      <th style="text-align: right">Unrounded p95 [95% bootstrap CI]</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>280m</td>
      <td style="text-align: right"><strong>148 ms</strong></td>
      <td style="text-align: right">147.97 [142.55–157.88] ms</td>
    </tr>
    <tr>
      <td>560m legal</td>
      <td style="text-align: right"><strong>284 ms</strong></td>
      <td style="text-align: right">284.41 [206.66–347.89] ms</td>
    </tr>
  </tbody>
</table>

<p>One seed0 checkpoint per model, one timed pass, CPU fp32, batch size one. The intervals
come from <strong>5,000 input-bootstrap resamples</strong> (RNG seed 120), conditional on this corpus
and pass. Other work was running on the shared host. Tokenization, model inference and
span alignment are included; model loading, transport, queues and redaction operators
are not. These timings do not establish idle-host capacity or end-to-end gateway latency.</p>

<h2 id="what-happens-next">What happens next</h2>

<p>The <strong>MoE fine-tune GPU wave</strong>, <strong>gateway-traffic benchmark</strong> and <strong>panel validation</strong> are
in progress. Human-gated programme steps are being replaced by pre-registered LLM-panel
validation. Passing work will be labelled <strong><code class="language-plaintext highlighter-rouge">panel-validated</code></strong>; that describes panel
review and must never be presented as native-speaker validation. Existing development
configs remain development configs until their protocol passes.</p>

<p>The acceptance lines are lower leakage than the pinned Presidio-based deployment
baseline with disjoint CIs, preserved utility, and measured CPU latency under the agreed
load. Stock Presidio on TAB is not that deployment baseline. We have <strong>not yet verified</strong>
those gateway acceptance lines, a general-model claim, or completed panel validation.
The <a href="/roadmap/">roadmap</a> now separates merged evidence from work in progress and what
still has to pass.</p>]]></content><author><name>KlusAI</name><email>research@klusai.com</email></author><category term="results" /><category term="models" /><summary type="html"><![CDATA[The programme restarted on October 11. The next horizon is a deployment-grade privacy layer for EU AI gateway traffic. We have useful evidence to build on, and gaps that need to stay visible. A good legal-text result is a starting point; it does not establish protection on gateway conversations.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://research.klusai.com/assets/og-research.png" /><media:content medium="image" url="https://research.klusai.com/assets/og-research.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Privacy on gateway traffic: first results</title><link href="https://research.klusai.com/results/models/2026/10/11/privacy-on-gateway-traffic-first-results.html" rel="alternate" type="text/html" title="Privacy on gateway traffic: first results" /><published>2026-10-11T00:00:00+00:00</published><updated>2026-10-11T00:00:00+00:00</updated><id>https://research.klusai.com/results/models/2026/10/11/privacy-on-gateway-traffic-first-results</id><content type="html" xml:base="https://research.klusai.com/results/models/2026/10/11/privacy-on-gateway-traffic-first-results.html"><![CDATA[<p>Our first gateway-trained models leave fewer protected identifiers exposed than the two
Presidio baselines on an eight-language chat-style test set. The 280m encoder repeats
that result across three training seeds and removes less harmless text. The mixture of
experts (MoE) also reduces leakage, but still fails the wider evaluation
contract because of over-redaction. <strong>These are development results: independent review
of the synthetic test set is pending, and no gateway-wide contract win is established.</strong>
The gateway-trained models remain private and are <strong>not yet released</strong>.</p>

<h3 id="what-we-measured">What we measured</h3>

<p><code class="language-plaintext highlighter-rouge">gateway-traffic-v1</code> contains synthetic conversations in Romanian, English, German,
French, Spanish, Italian, Dutch and Polish. Each language’s test split has <strong>1,000
conversations and 4,506 identifier subjects</strong>: 4,266 DIRECT and 240 QUASI. An identifier
subject can have repeated mentions across turns; it is not a unique person. The
UNSPECIFIED sensitivity slice has no support and is unavailable, not a measured zero. The eight
language configurations remain <strong><code class="language-plaintext highlighter-rouge">dev</code></strong>. Independent annotation review and semantic
subject/source/scenario-family/translation disjointness checks are unfinished.
Translations can share families across languages, so we report every language separately.
<a href="https://github.com/klusai/europriv-bench/blob/cc7be79c0c033ceed38c44527a2aed0103f440a3/docs/gateway-evaluation.md">Evaluation protocol</a></p>

<p><strong>Residual leak</strong> measures the fraction of identifier subjects for which at least one
non-whitespace character survives in any protected mention. Covering only part of a name
does not protect it. <strong>Over-redaction</strong> measures the fraction of gold non-PII,
non-whitespace characters removed. Both should be low. Neither measures an attacker’s
actual re-identification success, and character retention does not establish downstream
task usefulness. These results use exact character coverage from the recorded operators.
<a href="https://github.com/klusai/europriv-bench/blob/68eea8bd4ac64cbe4cf83532db48c365c06ff102/docs/gateway-contract.md">Metric contract</a></p>

<p>We compare two separate baselines: <strong>a Presidio-based deployment baseline</strong>, with its
pinned recognizers, threshold and native replacement policy, and <strong>stock Presidio</strong>, using
the benchmark’s English engine and exact local deletion operator. The deployment baseline
has English and Dutch pipelines and falls back to Dutch for the other six languages.
Stock Presidio uses its English engine throughout. These are specific frozen pipelines;
the comparison does not represent every possible Presidio configuration or certify parity
with a live deployment. <a href="https://github.com/klusai/europriv-bench/blob/14cfc44d5218e2f96081fc7ea8db5b07eb2880b3/docs/shield-baseline.md">Deployment-baseline specification</a>, <a href="https://github.com/klusai/europriv-bench/blob/cc7be79c0c033ceed38c44527a2aed0103f440a3/docs/gateway-evaluation.md">gateway operators</a></p>

<h3 id="residual-leakage-on-every-language">Residual leakage on every language</h3>

<p>All cells below are <strong>percentages [95% Wilson CI]</strong>, with the same <strong>4,506 identifier
subjects in 1,000 conversations per cell</strong>. The gateway-trained mDeBERTa-280m has three
independent training seeds (0, 1, 2); the gateway-trained MoE has <strong>one scored seed (0)</strong>
in the merged evidence used here. Each baseline has one inference run per configuration.
Seeds and languages are never pooled into a larger sample. These intervals describe
each run, not uncertainty across training seeds.</p>

<div class="table-card" role="region" aria-label="Gateway residual leakage by language and model" tabindex="0">

  <table>
    <thead>
      <tr>
        <th>Language</th>
        <th style="text-align: right">280m seed 0</th>
        <th style="text-align: right">280m seed 1</th>
        <th style="text-align: right">280m seed 2</th>
        <th style="text-align: right">MoE seed 0</th>
        <th style="text-align: right">Deployment baseline</th>
        <th style="text-align: right">Stock Presidio</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>RO</td>
        <td style="text-align: right">15.80 [14.77, 16.90]</td>
        <td style="text-align: right">19.37 [18.25, 20.55]</td>
        <td style="text-align: right">18.82 [17.70, 19.99]</td>
        <td style="text-align: right">14.96 [13.95, 16.03]</td>
        <td style="text-align: right">45.61 [44.16, 47.06]</td>
        <td style="text-align: right">61.16 [59.73, 62.58]</td>
      </tr>
      <tr>
        <td>EN</td>
        <td style="text-align: right">16.36 [15.30, 17.46]</td>
        <td style="text-align: right">22.59 [21.39, 23.84]</td>
        <td style="text-align: right">20.82 [19.66, 22.03]</td>
        <td style="text-align: right">13.34 [12.38, 14.36]</td>
        <td style="text-align: right">54.19 [52.74, 55.64]</td>
        <td style="text-align: right">54.24 [52.78, 55.69]</td>
      </tr>
      <tr>
        <td>DE</td>
        <td style="text-align: right">14.51 [13.52, 15.57]</td>
        <td style="text-align: right">18.15 [17.06, 19.31]</td>
        <td style="text-align: right">18.97 [17.86, 20.15]</td>
        <td style="text-align: right">14.09 [13.11, 15.14]</td>
        <td style="text-align: right">44.81 [43.36, 46.26]</td>
        <td style="text-align: right">53.33 [51.87, 54.78]</td>
      </tr>
      <tr>
        <td>FR</td>
        <td style="text-align: right">15.49 [14.46, 16.58]</td>
        <td style="text-align: right">20.02 [18.88, 21.21]</td>
        <td style="text-align: right">18.80 [17.68, 19.96]</td>
        <td style="text-align: right">11.45 [10.55, 12.41]</td>
        <td style="text-align: right">44.01 [42.56, 45.46]</td>
        <td style="text-align: right">59.65 [58.21, 61.08]</td>
      </tr>
      <tr>
        <td>ES</td>
        <td style="text-align: right">13.52 [12.55, 14.54]</td>
        <td style="text-align: right">19.02 [17.90, 20.19]</td>
        <td style="text-align: right">18.86 [17.75, 20.03]</td>
        <td style="text-align: right">13.89 [12.91, 14.93]</td>
        <td style="text-align: right">44.83 [43.38, 46.28]</td>
        <td style="text-align: right">53.53 [52.07, 54.98]</td>
      </tr>
      <tr>
        <td>IT</td>
        <td style="text-align: right">15.89 [14.85, 16.99]</td>
        <td style="text-align: right">16.93 [15.87, 18.06]</td>
        <td style="text-align: right">19.06 [17.94, 20.24]</td>
        <td style="text-align: right">11.70 [10.79, 12.67]</td>
        <td style="text-align: right">44.14 [42.70, 45.60]</td>
        <td style="text-align: right">53.11 [51.65, 54.56]</td>
      </tr>
      <tr>
        <td>NL</td>
        <td style="text-align: right">14.80 [13.80, 15.87]</td>
        <td style="text-align: right">18.35 [17.25, 19.51]</td>
        <td style="text-align: right">18.75 [17.64, 19.92]</td>
        <td style="text-align: right">13.20 [12.25, 14.22]</td>
        <td style="text-align: right">44.81 [43.36, 46.26]</td>
        <td style="text-align: right">56.28 [54.83, 57.72]</td>
      </tr>
      <tr>
        <td>PL</td>
        <td style="text-align: right">15.36 [14.33, 16.44]</td>
        <td style="text-align: right">17.09 [16.02, 18.22]</td>
        <td style="text-align: right">18.60 [17.49, 19.76]</td>
        <td style="text-align: right">9.76 [8.93, 10.67]</td>
        <td style="text-align: right">44.50 [43.05, 45.95]</td>
        <td style="text-align: right">53.84 [52.38, 55.29]</td>
      </tr>
    </tbody>
  </table>

</div>

<p>The 280m passes the disjoint-Wilson and paired privacy checks in all <strong>24 seed-language
comparisons against each baseline</strong>. Its paired over-redaction deltas also pass the
earlier, stricter no-increase rule in all those comparisons. This is numerical evidence
on the frozen test split; missing independent review prevents a scoped contract win.
English is its worst language for leakage in every seed, as the table shows.
<a href="https://github.com/klusai/klusai-models/blob/cfc8da67adcfcc95b13e7b568d47b3c340a3c864/docs/res127-encoder-scorecard.md">Three-seed encoder scorecard</a></p>

<p>The MoE’s worst leakage is Romanian, <strong>14.96% [13.95, 16.03]</strong>, and its lowest is Polish,
<strong>9.76% [8.93, 10.67]</strong>. Those are descriptive slices of the full matrix, not substitutes
for the other languages or a replicated architecture comparison. Its single seed passes
the numerical privacy checks against both Presidio baselines, but cannot establish
three-seed robustness. <a href="https://github.com/klusai/europriv-bench/blob/4f5203f87bd5930ee41ce91ad3a6d065b1ece8d0/docs/gateway-moe-results.md">MoE scorecard</a>, <a href="https://github.com/klusai/europriv-bench/blob/4f5203f87bd5930ee41ce91ad3a6d065b1ece8d0/analysis/gateway-moe-comparison.json">paired comparisons</a></p>

<h3 id="how-much-harmless-text-was-removed">How much harmless text was removed</h3>

<p>All cells are <strong>percentages [95% conversation-bootstrap CI]</strong>, resampling the same
<strong>1,000 conversations per language</strong>, including negative examples. The non-PII character
denominators are RO 550,519; EN 576,082; DE 591,633; FR 558,749; ES 567,808; IT 572,586;
NL 558,344; PL 548,750. These are character counts, not independent statistical samples.</p>

<div class="table-card" role="region" aria-label="Gateway over-redaction by language and model" tabindex="0">

  <table>
    <thead>
      <tr>
        <th>Language</th>
        <th style="text-align: right">280m seed 0</th>
        <th style="text-align: right">280m seed 1</th>
        <th style="text-align: right">280m seed 2</th>
        <th style="text-align: right">MoE seed 0</th>
        <th style="text-align: right">Deployment baseline</th>
        <th style="text-align: right">Stock Presidio</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>RO</td>
        <td style="text-align: right">6.04 [5.37, 6.69]</td>
        <td style="text-align: right">6.29 [5.56, 6.99]</td>
        <td style="text-align: right">3.03 [2.76, 3.31]</td>
        <td style="text-align: right">4.26 [3.77, 4.78]</td>
        <td style="text-align: right">27.03 [26.31, 27.77]</td>
        <td style="text-align: right">17.32 [16.78, 17.95]</td>
      </tr>
      <tr>
        <td>EN</td>
        <td style="text-align: right">5.60 [4.99, 6.23]</td>
        <td style="text-align: right">4.25 [3.75, 4.72]</td>
        <td style="text-align: right">3.08 [2.79, 3.37]</td>
        <td style="text-align: right">1.33 [1.16, 1.52]</td>
        <td style="text-align: right">7.19 [6.31, 8.07]</td>
        <td style="text-align: right">8.25 [7.56, 8.95]</td>
      </tr>
      <tr>
        <td>DE</td>
        <td style="text-align: right">5.74 [5.08, 6.42]</td>
        <td style="text-align: right">6.04 [5.35, 6.72]</td>
        <td style="text-align: right">3.41 [3.08, 3.75]</td>
        <td style="text-align: right">5.13 [4.55, 5.74]</td>
        <td style="text-align: right">24.76 [23.76, 25.73]</td>
        <td style="text-align: right">28.87 [27.81, 29.91]</td>
      </tr>
      <tr>
        <td>FR</td>
        <td style="text-align: right">5.37 [4.80, 5.95]</td>
        <td style="text-align: right">6.58 [5.80, 7.33]</td>
        <td style="text-align: right">2.70 [2.45, 2.94]</td>
        <td style="text-align: right">1.49 [1.30, 1.70]</td>
        <td style="text-align: right">17.50 [16.56, 18.42]</td>
        <td style="text-align: right">14.35 [13.69, 15.03]</td>
      </tr>
      <tr>
        <td>ES</td>
        <td style="text-align: right">8.36 [7.40, 9.30]</td>
        <td style="text-align: right">7.31 [6.48, 8.11]</td>
        <td style="text-align: right">3.13 [2.84, 3.42]</td>
        <td style="text-align: right">2.44 [2.15, 2.74]</td>
        <td style="text-align: right">25.54 [24.51, 26.47]</td>
        <td style="text-align: right">22.20 [20.94, 23.31]</td>
      </tr>
      <tr>
        <td>IT</td>
        <td style="text-align: right">4.85 [4.34, 5.35]</td>
        <td style="text-align: right">5.49 [4.87, 6.08]</td>
        <td style="text-align: right">3.06 [2.79, 3.34]</td>
        <td style="text-align: right">3.28 [2.93, 3.66]</td>
        <td style="text-align: right">26.29 [25.27, 27.29]</td>
        <td style="text-align: right">20.95 [20.14, 21.69]</td>
      </tr>
      <tr>
        <td>NL</td>
        <td style="text-align: right">4.98 [4.44, 5.51]</td>
        <td style="text-align: right">5.78 [5.13, 6.42]</td>
        <td style="text-align: right">3.38 [3.06, 3.70]</td>
        <td style="text-align: right">3.71 [3.30, 4.15]</td>
        <td style="text-align: right">14.98 [13.48, 16.43]</td>
        <td style="text-align: right">16.79 [16.07, 17.53]</td>
      </tr>
      <tr>
        <td>PL</td>
        <td style="text-align: right">6.51 [5.76, 7.27]</td>
        <td style="text-align: right">6.38 [5.66, 7.07]</td>
        <td style="text-align: right">3.35 [3.04, 3.66]</td>
        <td style="text-align: right">11.58 [10.38, 12.82]</td>
        <td style="text-align: right">35.56 [34.31, 36.72]</td>
        <td style="text-align: right">25.37 [24.41, 26.33]</td>
      </tr>
    </tbody>
  </table>

</div>

<p>The tables use the merged encoder artifact for its three seeds and baseline intervals,
and the merged MoE artifact for seed 0. All bootstrap intervals use <strong>2,000 whole-conversation
resamples</strong>: RNG seed 125 for the encoder report and 100 for the MoE report. Baseline point
estimates agree with the original merged gateway evaluation; bootstrap endpoints can
differ between reports. Comparisons use each report’s own paired draws. Wilson intervals
describe subject counts; the paired cluster intervals account for subjects sharing a
conversation. <a href="https://github.com/klusai/klusai-models/blob/cfc8da67adcfcc95b13e7b568d47b3c340a3c864/docs/res127-encoder-scorecard.json">Encoder estimates and deltas</a>, <a href="https://github.com/klusai/europriv-bench/blob/4f5203f87bd5930ee41ce91ad3a6d065b1ece8d0/analysis/gateway-moe-comparison.json">MoE estimates and deltas</a>,
<a href="https://github.com/klusai/europriv-bench/blob/cc7be79c0c033ceed38c44527a2aed0103f440a3/docs/gateway-evaluation-results.md">original gateway baselines</a></p>

<p>The encoder and MoE use their recorded full-conversation windowing and local masking
operators. Comparator receipts retain their original runtimes and operators; comparisons
in the wider MoE report also retain different window sizes. This post does not claim a
controlled head-to-head architecture experiment. Full-split gateway entity F1 is unavailable
because some gold spans collide on the whitespace-token grid. <strong>All conversations remain
in the residual-leak and over-redaction scores</strong> above. <a href="https://github.com/klusai/klusai-models/blob/cfc8da67adcfcc95b13e7b568d47b3c340a3c864/docs/res127-encoder-scorecard.md">Encoder protocol and limits</a>,
<a href="https://github.com/klusai/europriv-bench/blob/4f5203f87bd5930ee41ce91ad3a6d065b1ece8d0/docs/gateway-moe-scoring.md">MoE scoring protocol</a></p>

<h3 id="the-losses-belong-beside-the-improvements">The losses belong beside the improvements</h3>

<p><strong>The MoE over-redacts Polish and German.</strong> On Polish gateway conversations it removes
<strong>11.58% [10.38, 12.82]</strong> of harmless characters; on German, <strong>5.13% [4.55, 5.74]</strong>.
Both are below the two Presidio baselines in the table, so the contract loss must be
attributed precisely: other registered comparators do better on utility. Against the
earlier fine-tuned MoE, seed 0’s paired utility delta is <strong>+6.65 percentage points
[5.83, 7.50]</strong> on Polish and <strong>+2.40 [1.98, 2.81]</strong> on German (1,000 conversation clusters
per language, one checkpoint on each side). Both intervals lie wholly above the v3
allowance. The merged report records <strong>loss under both the earlier policy and v3</strong>.
<a href="https://github.com/klusai/europriv-bench/blob/4f5203f87bd5930ee41ce91ad3a6d065b1ece8d0/analysis/gateway-moe-comparison.json">Paired MoE comparisons</a></p>

<p><strong>Strict-utility calibration failed.</strong> A separate, earlier MoE experiment selected
confidence thresholds on development data, then froze them before test scoring. Requiring
no worse point utility against every comparator during selection reduced recall. On the
Romanian gateway test, residual leakage was <strong>56.28% [54.83, 57.72]</strong>, <strong>65.40%
[64.00, 66.78]</strong> and <strong>46.78% [45.33, 48.24]</strong> for seeds 0, 1 and 2 respectively
(4,506 subjects, 1,000 conversations per seed; 95% Wilson CIs). It also broke the legacy
Romanian and Polish national-ID zero-leak anchors. This was a recorded loss, not a
successful calibration of the gateway-trained candidate. <a href="https://github.com/klusai/europriv-bench/blob/2ce13cf0c698a7a1ff0b344052e008e671dc13f5/docs/res100-calibration.md">Frozen calibration protocol</a>,
<a href="https://github.com/klusai/europriv-bench/blob/2ce13cf0c698a7a1ff0b344052e008e671dc13f5/docs/res100-calibrated-results.md">three-seed calibration results</a></p>

<p><strong>The 280m regresses outside gateway traffic.</strong> On TAB’s English legal documents, its
all-identifier residual leak is <strong>66.91% [65.43, 68.36]</strong>, <strong>83.18% [81.98, 84.31]</strong>
and <strong>85.88% [84.76, 86.93]</strong> for seeds 0, 1 and 2, versus stock Presidio’s <strong>30.92%
[29.50, 32.38]</strong> (127 documents, 3,965 identifier subjects per model; 95% Wilson CIs).
This is the all-identifier endpoint, distinct from historical TAB DIRECT-only scores.
The scorecard also records seed-1 privacy regressions against the earlier encoder on
the six general-text configurations, a Polish all-PII regression for seed 2, and an English
utility regression against stock Presidio for seed 2. General-text contamination and
the capped inference used on these non-gateway sets limit interpretation, but the
regressions remain in the report. <a href="https://github.com/klusai/klusai-models/blob/cfc8da67adcfcc95b13e7b568d47b3c340a3c864/docs/res127-encoder-scorecard.md">Encoder results and limitations</a></p>

<h3 id="why-contract-v3-changed-prospectively">Why contract v3 changed prospectively</h3>

<p>The earlier utility gate required the upper bound of the paired 95% CI for
candidate-minus-comparator over-redaction to be at most zero. That can favor a detector
that removes almost nothing, including too little private information. The failed
development-only calibration made that tradeoff concrete.</p>

<p><strong>Contract v3 allows at most +1.0 percentage point of additional harmless-character
removal at the upper bound of that paired interval</strong>, separately for every configuration,
comparator and candidate seed. This is an absolute margin of 0.01, not a relative 1%
increase. It is a declared engineering tolerance, not evidence that users’ tasks tolerate
that loss. Disjoint privacy CIs, negative paired leakage deltas, the Romanian/Polish
zero-leak anchors, at least three training seeds, reviewed and disjoint gold, and load
requirements remain unchanged. <a href="https://github.com/klusai/europriv-bench/blob/68eea8bd4ac64cbe4cf83532db48c365c06ff102/docs/gateway-contract.md">Prospective registration and rationale</a></p>

<p>The registration records the decision on October 11 <strong>before the gateway-trained MoE
and encoder evaluations</strong>. It applies only to new candidate evaluations after the
introducing commit; historical predictions and verdicts cannot be retrospectively
promoted. The MoE scoring protocol pins that registration. The merged encoder scorecard
still cites the older contract and passes its stricter zero-margin numerical utility
check; we retain that provenance rather than relabelling its run as v3. The earlier
calibration remains a loss, and the gateway-trained MoE still fails v3.
<a href="https://github.com/klusai/europriv-bench/blob/68eea8bd4ac64cbe4cf83532db48c365c06ff102/docs/gateway-contract.md">Contract registration</a>, <a href="https://github.com/klusai/europriv-bench/blob/4f5203f87bd5930ee41ce91ad3a6d065b1ece8d0/docs/gateway-moe-scoring.md">MoE protocol</a>, <a href="https://github.com/klusai/klusai-models/blob/cfc8da67adcfcc95b13e7b568d47b3c340a3c864/docs/res127-encoder-scorecard.md">encoder scorecard</a></p>

<p>Independent gold review, semantic disjointness, downstream task utility, deployed operator
equivalence and end-to-end CPU latency/load acceptance remain unverified. The next work
is to resolve those gaps, reduce the MoE’s over-redaction, and preserve the encoder’s
quality outside gateway traffic. The <a href="/roadmap/">roadmap</a> tracks that work. The models
remain private while these results and their limits are available for scrutiny.</p>]]></content><author><name>KlusAI</name><email>research@klusai.com</email></author><category term="results" /><category term="models" /><summary type="html"><![CDATA[Our first gateway-trained models leave fewer protected identifiers exposed than the two Presidio baselines on an eight-language chat-style test set. The 280m encoder repeats that result across three training seeds and removes less harmless text. The mixture of experts (MoE) also reduces leakage, but still fails the wider evaluation contract because of over-redaction. These are development results: independent review of the synthetic test set is pending, and no gateway-wide contract win is established. The gateway-trained models remain private and are not yet released.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://research.klusai.com/assets/og-research.png" /><media:content medium="image" url="https://research.klusai.com/assets/og-research.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Every detector leaked half the IDs on real court text — except one</title><link href="https://research.klusai.com/results/models/2026/06/13/every-detector-leaked-half-the-ids-except-one.html" rel="alternate" type="text/html" title="Every detector leaked half the IDs on real court text — except one" /><published>2026-06-13T00:00:00+00:00</published><updated>2026-06-13T00:00:00+00:00</updated><id>https://research.klusai.com/results/models/2026/06/13/every-detector-leaked-half-the-ids-except-one</id><content type="html" xml:base="https://research.klusai.com/results/models/2026/06/13/every-detector-leaked-half-the-ids-except-one.html"><![CDATA[<p>A few weeks ago we argued that <a href="/results/models/2026/06/02/high-f1-can-still-leak-every-id.html">a high-F1 detector can still leak every ID it
finds</a> — but the evidence was on
our own <em>synthetic</em> national-ID tracks. The obvious objection: <em>show it on real data.</em> So we did.
On <strong>real ECHR court judgments</strong> — the peer-reviewed <a href="/leaderboard/">Text Anonymization Benchmark</a>
(TAB; Pilán et al. 2022), manually annotated, that no model on our board trained on — the
dissociation holds, and it is starker than on synthetic text.</p>

<h2 id="the-protector-test-on-real-legal-gold">The protector test, on real legal gold</h2>

<p>TAB marks every identifier as <strong>DIRECT</strong> (directly re-identifying — a name, a case number) or
<strong>QUASI</strong> (needs combination). We score what a de-identifier is <em>for</em>: the <strong>DIRECT-identifier
leak rate</strong> — the fraction of distinct direct identifiers left un-redacted in the residual. Lower is
better. Here are the six models on our board, ranked by that leak rate, with their detection-F1
beside it:</p>

<table>
  <thead>
    <tr>
      <th>Model</th>
      <th>DIRECT-leak (↓ better)</th>
      <th>Detection-F1</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>spaCy <code class="language-plaintext highlighter-rouge">en_core_web_lg</code></td>
      <td>49.6%</td>
      <td>0.480</td>
    </tr>
    <tr>
      <td>Presidio</td>
      <td>50.0%</td>
      <td><strong>0.589</strong></td>
    </tr>
    <tr>
      <td>GLiNER (<code class="language-plaintext highlighter-rouge">gliner_multi_pii-v1</code>)</td>
      <td>59.9%</td>
      <td>0.357</td>
    </tr>
    <tr>
      <td>tabularisai/eu-pii-safeguard</td>
      <td>62.5%</td>
      <td>0.073</td>
    </tr>
    <tr>
      <td>GLiNER2 (<code class="language-plaintext highlighter-rouge">gliner2-base-v1</code>)</td>
      <td>65.1%</td>
      <td>0.545</td>
    </tr>
    <tr>
      <td>kp-deid-mdeberta-280m (ours)</td>
      <td>67.4%</td>
      <td>0.199</td>
    </tr>
  </tbody>
</table>

<p>Read the F1 column against the leak column. <strong>Presidio tops detection-F1 (0.589) and still leaks
half of all direct identifiers.</strong> GLiNER2 is second on F1 (0.545) and second-<em>worst</em> on leakage
(65.1%). The ranking you’d quote from a model card has almost nothing to do with who protects the
person. And note our own shipped 280M is <em>last</em> here: it was trained to nail structured national-IDs
on synthetic text — a different job than catching names and case numbers in real legal prose. On
real judgments, <strong>every one of these models leaves roughly half to two-thirds of the direct
identifiers in place.</strong></p>

<h2 id="except-one">Except one</h2>

<p>Train a model on <strong>real legal document structure</strong> instead — real CJEU judgment layouts (a
different court from ECHR, so this is genuine zero-shot, with zero document overlap) with
synthetic, checksum-valid identifiers spliced in — and the picture inverts:</p>

<table>
  <thead>
    <tr>
      <th>Model</th>
      <th>DIRECT-leak (↓ better)</th>
      <th>Detection-F1</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>kp-deid (CJEU-structure, ours)</strong></td>
      <td><strong>9.5%</strong></td>
      <td>0.340</td>
    </tr>
    <tr>
      <td>spaCy (next best)</td>
      <td>49.6%</td>
      <td>0.480</td>
    </tr>
    <tr>
      <td>Presidio</td>
      <td>50.0%</td>
      <td>0.589</td>
    </tr>
  </tbody>
</table>

<p><strong>9.5% versus the field’s best of 49.6% — it leaves ~5× fewer direct identifiers behind.</strong> And it
does this while sitting <em>mid-table</em> on detection-F1 (0.340). The mechanism is the whole point: it
reliably <em>touches</em> the identifier tokens — redacting them — even when it disagrees with the gold on
the exact span boundary or the entity type. Strict detection-F1 punishes that disagreement; a person’s
privacy does not care about it.</p>

<p>We checked the obvious cheat — is it just redacting everything? No: it marks <strong>9.1%</strong> of tokens as
PII while the gold marks <strong>11.3%</strong> (it under-redacts overall), with only <strong>4.3%</strong> false-positive
redaction. It is not blunt; it is aimed.</p>

<h2 id="what-is-and-isnt-a-claim-here">What is, and isn’t, a claim here</h2>

<p>This one we’re willing to lean on, within its scope:</p>

<ul>
  <li><strong>It’s robust.</strong> Three independent training seeds give DIRECT-leak {9.5%, 9.9%, 9.9%} — a 0.4-point
spread, nowhere near the gap to the field.</li>
  <li><strong>It’s significant.</strong> A paired bootstrap over the 264 shared direct-identifier subjects puts the
gap to the runner-up at <strong>Δ = −40 points, 95% CI [−47.7, −32.2]</strong> — comfortably below zero.</li>
  <li><strong>It’s on real, external, peer-reviewed gold</strong> (TAB ECHR), contamination-free.</li>
</ul>

<p>And the honest boundaries:</p>

<ul>
  <li><strong>We do not top detection-F1.</strong> On TAB, synthetic training caps our detection-F1 around 0.34, well
short of Presidio’s 0.589. We’re not claiming the detection crown; we’re claiming the protection one.</li>
  <li><strong>One board, one domain, one language</strong> (English legal) so far. Extending the re-id win across
languages and domains is the next step, not a done deal.</li>
  <li><strong>Re-identification leak-rate is the metric we lead with</strong> — competitors report detection-F1. But it
isn’t a metric we invented to flatter ourselves: it’s computed directly from TAB’s own
externally-annotated DIRECT/QUASI labels.</li>
  <li>The winning checkpoint isn’t published yet; the numbers above are reproducible from the benchmark
and our scorecard, and the model will follow.</li>
</ul>

<p>The takeaway is the same as last time, now on real court text and with the protector identified:
<strong>if you choose a de-identification model by its detection-F1, you can choose one that leaks half the
identifiers you were trying to protect.</strong> Train for structure, score for leakage, and lead with the
number that measures the harm.</p>

<p>→ See the figures and provenance on the <a href="/leaderboard/">leaderboard</a> · read the
<a href="/papers/europriv-bench/">EuroPriv-Bench paper</a>.</p>]]></content><author><name>KlusAI</name><email>research@klusai.com</email></author><category term="results" /><category term="models" /><summary type="html"><![CDATA[A few weeks ago we argued that a high-F1 detector can still leak every ID it finds — but the evidence was on our own synthetic national-ID tracks. The obvious objection: show it on real data. So we did. On real ECHR court judgments — the peer-reviewed Text Anonymization Benchmark (TAB; Pilán et al. 2022), manually annotated, that no model on our board trained on — the dissociation holds, and it is starker than on synthetic text.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://research.klusai.com/assets/og-research.png" /><media:content medium="image" url="https://research.klusai.com/assets/og-research.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">A second look at what survives redaction: a quasi-identifier diagnostic</title><link href="https://research.klusai.com/benchmark/methodology/2026/06/07/a-second-look-at-what-survives-redaction.html" rel="alternate" type="text/html" title="A second look at what survives redaction: a quasi-identifier diagnostic" /><published>2026-06-07T00:00:00+00:00</published><updated>2026-06-07T00:00:00+00:00</updated><id>https://research.klusai.com/benchmark/methodology/2026/06/07/a-second-look-at-what-survives-redaction</id><content type="html" xml:base="https://research.klusai.com/benchmark/methodology/2026/06/07/a-second-look-at-what-survives-redaction.html"><![CDATA[<p>So far we’ve measured leakage one way: did a specific, structured identifier — a national ID
that decodes to a birthday, a sex, and a county — slip through? That’s the
re-identification-risk channel, and it’s deliberately narrow: we only call something
<em>re-identification</em> when an identifier’s structure earns the word.</p>

<p>This week we added a <strong>second, independent diagnostic</strong> that looks at a different kind of
residue: the <strong>quasi-identifiers</strong> left behind <em>after</em> redaction — combinations of attributes
like a date, a place, and a role that, taken together, can make a record stand out even when
every named entity is gone.</p>

<h2 id="a-k-anonymity-violation-diagnostic-within-the-corpus">A k-anonymity-violation diagnostic, within the corpus</h2>

<p>The new diagnostic is a <strong>within-corpus k-anonymity-violation</strong> measure over the residual
quasi-identifiers in redacted text. It flags records whose surviving attribute combination is
rare enough that the record is <strong>distinctive within the sample</strong> — a signal that redaction
removed the obvious identifiers but not the quieter, combinable ones.</p>

<p>It’s worth being precise about what this is, because the words matter here:</p>

<ul>
  <li>It measures <strong>sample distinctiveness</strong> — how unusual a record is <em>within this corpus</em>.</li>
  <li>It is <strong>not</strong> population re-identification, and we don’t report it as such. Saying a record
is rare in a dataset of a few hundred documents says nothing, on its own, about whether a
real person could be picked out of a national population.</li>
  <li>We reserve the term <strong>re-identification</strong> for the deterministic national-ID channel. For
this diagnostic, the honest word is <strong>residual distinctiveness</strong>.</li>
</ul>

<h2 id="why-add-a-second-channel-at-all">Why add a second channel at all</h2>

<p>The national-ID metric catches the sharpest case: a structured string that, alone, discloses
who someone is. But good redaction can clear every national ID and still leave a record that’s
distinctive on its quasi-identifiers. A second, independent channel lets us see that residue
instead of assuming the structured-ID metric covers it. Two channels that measure different
failure modes are harder to fool than one.</p>

<p>This is groundwork. The diagnostic is <strong><code class="language-plaintext highlighter-rouge">dev</code></strong>, intended as an internal sensitivity signal —
<strong>not</strong> a validated, citable, or population-level re-identification claim. A separate strand
of work (a population-uniqueness estimator with a reference-population module) is what would
eventually let us reason about real-world uniqueness, and that is pending a census-calibrated
generator — explicitly not something we’re claiming today.</p>

<p>→ See where this fits on the <a href="/roadmap/">roadmap</a>.</p>]]></content><author><name>KlusAI</name><email>research@klusai.com</email></author><category term="benchmark" /><category term="methodology" /><summary type="html"><![CDATA[So far we’ve measured leakage one way: did a specific, structured identifier — a national ID that decodes to a birthday, a sex, and a county — slip through? That’s the re-identification-risk channel, and it’s deliberately narrow: we only call something re-identification when an identifier’s structure earns the word.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://research.klusai.com/assets/og-research.png" /><media:content medium="image" url="https://research.klusai.com/assets/og-research.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Making the benchmark honest: a harder external eval, and our first real data</title><link href="https://research.klusai.com/benchmark/datasets/2026/06/07/making-the-benchmark-honest.html" rel="alternate" type="text/html" title="Making the benchmark honest: a harder external eval, and our first real data" /><published>2026-06-07T00:00:00+00:00</published><updated>2026-06-07T00:00:00+00:00</updated><id>https://research.klusai.com/benchmark/datasets/2026/06/07/making-the-benchmark-honest</id><content type="html" xml:base="https://research.klusai.com/benchmark/datasets/2026/06/07/making-the-benchmark-honest.html"><![CDATA[<p>Two changes landed this week that make EuroPriv-Bench harder to game — including by us.
We added an <strong>external, third-party detection eval</strong> that pulls our own synthetic scores
apart, and we wired in the <strong>first real-data gold config</strong> in the suite. Both make our
numbers look worse, on purpose. A benchmark you can’t fail isn’t measuring anything.</p>

<h2 id="a-synthetic-eval-that-everyone-aces-isnt-an-eval">A synthetic eval that everyone aces isn’t an eval</h2>

<p>Our own synthetic detection sets were doing their job for span discipline — checksum-valid
IDs, offset-correct gold — but they had a quieter problem: on the cleanest configs, the
detection scores had <strong>saturated</strong>. A control run sat at <strong>entity-F1 1.000</strong>. When the
strongest baselines all crowd the ceiling, the metric has stopped discriminating between
them, and any ranking you read off it is noise.</p>

<p>So we adopted the <strong>Ai4Privacy</strong> open-core (<code class="language-plaintext highlighter-rouge">openpii-1m</code>, CC-BY-4.0) as an <strong>external,
independent</strong> detection eval — text we didn’t author, scored through the same harness and
the same GDPR-aligned taxonomy crosswalk. It
de-saturates immediately: across the same models, entity-F1 now spreads over a <strong>0.41–0.67
band</strong> instead of pinning at 1.000. That spread is the point — the eval now separates models
that the synthetic control could not.</p>

<p>One licensing note, because it’s the kind of thing that’s easy to get wrong: Ai4Privacy
ships a larger <strong>500k tier that is Llama-licensed</strong>, which fails our cleanly-licensed-only
gate. We caught it and <strong>excluded that tier</strong>; only the CC-BY-4.0 open-core feeds the eval.
A benchmark that quietly ingests non-redistributable data can’t claim to be open.</p>

<h2 id="real-legal-data-is-harder-than-our-synthetic--and-wed-rather-show-it">Real legal data is harder than our synthetic — and we’d rather show it</h2>

<p>The bigger step: we integrated <strong>TAB</strong> (the Text Anonymization Benchmark, English legal text
derived from European Court of Human Rights judgments, MIT-licensed) as the <strong>first real-data
gold config</strong> in the suite. Everything in EuroPriv-Bench until now was synthetic — clean by
construction. TAB is human-written, human-annotated court text: <strong>127 documents</strong>, projected
into our taxonomy with <strong>zero misaligned spans</strong> after alignment. It carries a new status,
<code class="language-plaintext highlighter-rouge">config_status = real-external-gold</code>, to mark it as exactly that: real, externally-sourced,
not one of our own synthetic skeletons.</p>

<p>The honest finding is that real legal English is <strong>hard</strong>, and it humbles our own model:</p>

<table>
  <thead>
    <tr>
      <th>Model</th>
      <th>TAB entity-F1 (real legal EN)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Microsoft Presidio</td>
      <td><strong>0.589</strong></td>
    </tr>
    <tr>
      <td>klusai/kp-deid-mdeberta-280m</td>
      <td>0.199</td>
    </tr>
  </tbody>
</table>

<p>Read that the right way. The strongest system on this real-legal config is <strong>Presidio, at
0.589</strong> — far below the near-ceiling numbers everyone posts on synthetic data. And <strong>our own
<code class="language-plaintext highlighter-rouge">kp-deid</code> sits at 0.199</strong>: it was trained on Romanian, and on real English legal text it is
<strong>out of distribution</strong> and struggles. We are not the leader here, and the table says so.
That’s the value of a real-data config — it shows where the synthetic-trained model doesn’t
transfer, instead of flattering it.</p>

<h2 id="status-said-plainly">Status, said plainly</h2>

<p>Both additions are <strong><code class="language-plaintext highlighter-rouge">config_status = dev</code></strong> for the Ai4Privacy detection eval and
<strong><code class="language-plaintext highlighter-rouge">real-external-gold</code></strong> for TAB — measured, contamination-controlled signals, <strong>not</strong>
validated, citable, or SOTA claims. The TAB-derived gold config is <strong>private</strong> for now
(licensing/redistribution review pending), so there’s no public config to load yet — the
numbers above are reproducible internally against the committed harness, and we’ll say so
on every row.</p>

<p>None of this changes the metric we lead with. Detection-F1 is a detection number; the
re-identification-risk metric still leads on the national-ID tracks, where a missed ID
decodes to a birthday, a sex, and a county. What this week did was make the <em>detection</em> side
honest: an external eval that separates models, and a real-data config that refuses to let
our own model off easy.</p>

<p>→ See the public configs and their provenance on the <a href="/leaderboard/">leaderboard</a>, or read
the <a href="/roadmap/">roadmap</a> for where the real-data and external-eval work sits.</p>]]></content><author><name>KlusAI</name><email>research@klusai.com</email></author><category term="benchmark" /><category term="datasets" /><summary type="html"><![CDATA[Two changes landed this week that make EuroPriv-Bench harder to game — including by us. We added an external, third-party detection eval that pulls our own synthetic scores apart, and we wired in the first real-data gold config in the suite. Both make our numbers look worse, on purpose. A benchmark you can’t fail isn’t measuring anything.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://research.klusai.com/assets/og-research.png" /><media:content medium="image" url="https://research.klusai.com/assets/og-research.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The leaderboard is open — and it now carries three external detectors</title><link href="https://research.klusai.com/benchmark/results/2026/06/03/the-leaderboard-is-open.html" rel="alternate" type="text/html" title="The leaderboard is open — and it now carries three external detectors" /><published>2026-06-03T00:00:00+00:00</published><updated>2026-06-03T00:00:00+00:00</updated><id>https://research.klusai.com/benchmark/results/2026/06/03/the-leaderboard-is-open</id><content type="html" xml:base="https://research.klusai.com/benchmark/results/2026/06/03/the-leaderboard-is-open.html"><![CDATA[<p>EuroPriv-Bench’s submission path is open: a <strong>no-secrets CI</strong> that runs the harness
against your model and adds the row, with provenance baked in. To open it honestly we
ran it ourselves on three independent, third-party detectors that were never tuned to
compete on re-identification risk — <strong>Microsoft Presidio</strong>, <strong>GLiNER2</strong> (Fastino), and
<strong>spaCy</strong> (Explosion). They now sit on the public <a href="/leaderboard/">leaderboard</a> next to
our own model.</p>

<p>We lead with <strong>re-identification risk</strong>, not detection-F1. A missed national ID isn’t one
missed token: a Romanian CNP decodes to a birthday, a sex, and a county at once. So the
question the board asks first is not <em>how many entities did you label correctly</em> — it’s
<em>what fraction of subjects had their national ID slip through</em>.</p>

<h2 id="what-the-three-external-systems-are--and-arent">What the three external systems are — and aren’t</h2>

<p>None of these tools was built to model national-ID <strong>structure</strong>. They do ordinary named-entity
recognition, and they do it as designed; they were never tuned for the re-identification metric
the board leads with. That’s exactly why they’re a useful, honest baseline.</p>

<ul>
  <li><strong>spaCy <code class="language-plaintext highlighter-rouge">en_core_web_lg</code></strong> (Explosion) — a general-purpose English NER pipeline.</li>
  <li><strong>GLiNER2 <code class="language-plaintext highlighter-rouge">gliner2-base-v1</code></strong> (Fastino) — a zero-shot span tagger you point at PII labels.</li>
  <li><strong>Presidio</strong> (<code class="language-plaintext highlighter-rouge">presidio-analyzer</code> + <code class="language-plaintext highlighter-rouge">en_core_web_lg</code>, Microsoft) — a PII framework that
pairs NER with <strong>deterministic recognizers</strong> (regexes, checksums) for structured IDs.</li>
</ul>

<h2 id="the-numbers-on-contamination-free-romanian">The numbers, on contamination-free Romanian</h2>

<p>The <code class="language-plaintext highlighter-rouge">ro-realskeleton-v1</code> track scores each model on <strong>1,123 distinct CNP subjects</strong> in
held-out, source-separated legal text. We report <strong>CNP leak-rate</strong>: the fraction of subjects
whose national ID slips through.</p>

<table>
  <thead>
    <tr>
      <th>Model</th>
      <th>Detection-F1</th>
      <th>CNP leak-rate (Wilson 95% CI)</th>
      <th>Quasi-IDs leaked</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>spaCy <code class="language-plaintext highlighter-rouge">en_core_web_lg</code></td>
      <td>0.143</td>
      <td><strong>89.0%</strong> (87.1–90.7%)</td>
      <td>3,000</td>
    </tr>
    <tr>
      <td>GLiNER2 <code class="language-plaintext highlighter-rouge">gliner2-base-v1</code></td>
      <td>0.642</td>
      <td><strong>28.6%</strong> (26.0–31.3%)</td>
      <td>963</td>
    </tr>
    <tr>
      <td>Microsoft Presidio</td>
      <td>0.472</td>
      <td><strong>0.0%</strong> (0.0–0.34%)</td>
      <td>0</td>
    </tr>
    <tr>
      <td><em>(contrast)</em> kp-deid-mdeberta-280m</td>
      <td>0.741</td>
      <td>0.0% (0.0–0.34%)</td>
      <td>0</td>
    </tr>
  </tbody>
</table>

<p>Read the spread. <strong>spaCy leaks roughly 89% of CNPs</strong> — its general NER never modelled the
13-digit structure, so the IDs walk straight through (3,000 quasi-identifiers exposed). <strong>GLiNER2
leaks ~29%</strong>, better but still roughly one CNP in three. <strong>Presidio leaks 0%</strong> — not because it
out-detects the others on F1 (it sits mid-table at 0.472), but because its deterministic
recognizers catch the national-ID <em>string</em> whatever the surrounding NER does. Structure-aware
coverage, not detection-F1, is what protects the person — and that’s the case the board is built
to make.</p>

<p>For contrast, our own <a href="https://huggingface.co/klusai/kp-deid-mdeberta-280m">kp-deid-mdeberta-280m</a>
also leaks 0%, at a higher F1 (0.741) — but the point of this post is the three external rows, not
the in-house one.</p>

<h2 id="an-honest-caveat-about-status">An honest caveat about status</h2>

<p>These real-skeleton tracks are in development (<code class="language-plaintext highlighter-rouge">config_status = dev</code>): built from authored
template families and <strong>not yet native-speaker- or inter-annotator-agreement-validated</strong>. Treat
the figures above as <strong>measured, contamination-controlled signals</strong> — not validated, citable, or
SOTA claims. The leaderboard marks every such row <code class="language-plaintext highlighter-rouge">dev</code> for exactly this reason, and validation
comes before we lean on any of it.</p>

<p>We’re also not the only people pointing at re-identification risk: concurrent, independent work
such as <strong>RAT-Bench</strong> builds a re-identification-risk leaderboard over synthetic U.S. demographics.
EuroPriv-Bench’s angle is the underserved part — European legal text, a GDPR-aligned taxonomy, and
national-ID structure decoded directly. We think it’s the <strong>first <em>unified</em> pan-European</strong> benchmark
to put detection and re-identification risk on the same gold; we don’t claim to be first to care.</p>

<h2 id="bring-your-model">Bring your model</h2>

<p>The submission CI is open and runs without secrets — same harness, same provenance, same <code class="language-plaintext highlighter-rouge">dev</code>/
<code class="language-plaintext highlighter-rouge">citable</code> discipline for everyone. If you maintain a de-identification model, add your row.</p>

<p>→ See every figure with its provenance on the <a href="/leaderboard/">leaderboard</a> · open a submission via
<a href="/leaderboard/#how-to-submit">How to submit</a> · read the <a href="/papers/europriv-bench/">EuroPriv-Bench paper</a>.</p>]]></content><author><name>KlusAI</name><email>research@klusai.com</email></author><category term="benchmark" /><category term="results" /><summary type="html"><![CDATA[EuroPriv-Bench’s submission path is open: a no-secrets CI that runs the harness against your model and adds the row, with provenance baked in. To open it honestly we ran it ourselves on three independent, third-party detectors that were never tuned to compete on re-identification risk — Microsoft Presidio, GLiNER2 (Fastino), and spaCy (Explosion). They now sit on the public leaderboard next to our own model.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://research.klusai.com/assets/og-research.png" /><media:content medium="image" url="https://research.klusai.com/assets/og-research.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">A high-F1 detector can still leak every ID it finds</title><link href="https://research.klusai.com/results/models/2026/06/02/high-f1-can-still-leak-every-id.html" rel="alternate" type="text/html" title="A high-F1 detector can still leak every ID it finds" /><published>2026-06-02T00:00:00+00:00</published><updated>2026-06-02T00:00:00+00:00</updated><id>https://research.klusai.com/results/models/2026/06/02/high-f1-can-still-leak-every-id</id><content type="html" xml:base="https://research.klusai.com/results/models/2026/06/02/high-f1-can-still-leak-every-id.html"><![CDATA[<p>Our first de-identification model, <strong><a href="https://huggingface.co/klusai/kp-deid-mdeberta-280m">klusai/kp-deid-mdeberta-280m</a></strong>,
just landed on the public <a href="/leaderboard/">leaderboard</a> as the <strong>best protector</strong> on the
contamination-free Romanian <strong>real-skeleton</strong> track. It earns that title not by topping
detection-F1 — it doesn’t — but on the metric we actually lead with: <strong>re-identification
risk</strong>. And in earning it, it surfaces the program’s headline finding.</p>

<p><strong>Detection-F1 and re-identification protection come apart.</strong> A model can score high on
entity-F1 and still leak the identifiers that re-identify a person; a model trained <em>for
protection</em> can sit mid-table on F1 and leak essentially nothing. The two numbers measure
different things, and on national IDs they disagree hard.</p>

<h2 id="the-dissociation-on-contamination-free-romanian">The dissociation, on contamination-free Romanian</h2>

<p>The <code class="language-plaintext highlighter-rouge">ro-realskeleton-v1</code> track scores each model on <strong>1,123 distinct CNP subjects</strong> —
Romanian national IDs in held-out, source-separated legal text that no baseline has trained
on. We report <strong>CNP leak-rate</strong>: the fraction of subjects whose national ID slips through.
A single missed CNP is not one missed token — it decodes to a birthday, a sex, and a county
at once, so we count what a miss exposes (the “quasi-identifiers leaked” column below).</p>

<table>
  <thead>
    <tr>
      <th>Model</th>
      <th>Detection-F1</th>
      <th>CNP leak-rate (Wilson 95% CI)</th>
      <th>Quasi-IDs leaked</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>kp-deid-mdeberta-280m</strong></td>
      <td>0.741</td>
      <td><strong>0.0%</strong> (0.0–0.34%)</td>
      <td><strong>0</strong></td>
    </tr>
    <tr>
      <td>GLiNER (gliner_multi_pii-v1)</td>
      <td><strong>0.853</strong></td>
      <td>30.2% (27.6–32.9%)</td>
      <td>1,017</td>
    </tr>
    <tr>
      <td>tabularisai/eu-pii-safeguard</td>
      <td>0.747</td>
      <td>35.4% (32.6–38.2%)</td>
      <td>1,191</td>
    </tr>
    <tr>
      <td>OpenMed/privacy-filter-multilingual</td>
      <td>0.576</td>
      <td>26.4% (23.9–29.0%)</td>
      <td>888</td>
    </tr>
    <tr>
      <td>openai/privacy-filter</td>
      <td>0.363</td>
      <td>1.4% (0.9–2.3%)</td>
      <td>48</td>
    </tr>
  </tbody>
</table>

<p>Read the top two rows together. <strong>GLiNER has the highest detection-F1 on the board (0.853)
and the second-worst leak-rate (30.2%)</strong> — it is type-accurate on the entities it catches,
yet roughly one CNP in three walks straight through. kp-deid scores <em>lower</em> on F1 (0.741) and
leaks <strong>0% of 1,123 CNPs</strong>. tabularisai tells the same story from the other direction: a
strong-looking 0.747 F1, the worst leak-rate on the board (35.4%). F1 simply does not predict
who protects the person.</p>

<p>Why the gap? F1 rewards getting the label right; protection only needs <em>coverage</em> — redact the
13-digit string and no harm is done, whatever you call it. A detector tuned to label precisely
can still drop the spans that matter most, and detection-F1 will not flag it. (<code class="language-plaintext highlighter-rouge">openai/privacy-filter</code>
is the instructive corner case: weak F1, but it over-redacts, so its leak-rate is low too.)</p>

<h2 id="a-preliminary-cross-language-signal-polish-pesel-zero-shot">A preliminary cross-language signal: Polish PESEL, zero-shot</h2>

<p>The same dissociation shows up in a second language and a second identifier — <strong>zero-shot</strong>.
kp-deid was trained on Romanian and <strong>never saw Polish</strong>, yet on the <code class="language-plaintext highlighter-rouge">pl-realskeleton-v1</code>
track (<strong>1,096 distinct PESEL subjects</strong>, the Polish national ID, which carries its own
structure and check digit) it still leaks nothing:</p>

<table>
  <thead>
    <tr>
      <th>Model</th>
      <th>Detection-F1</th>
      <th>PESEL leak-rate (Wilson 95% CI)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>kp-deid-mdeberta-280m</strong> (zero-shot)</td>
      <td>0.763</td>
      <td><strong>0.0%</strong> (0.0–0.35%)</td>
    </tr>
    <tr>
      <td>GLiNER (gliner_multi_pii-v1)</td>
      <td>0.825</td>
      <td>57.8% (54.9–60.7%)</td>
    </tr>
    <tr>
      <td>tabularisai/eu-pii-safeguard</td>
      <td>0.738</td>
      <td>30.7% (28.0–33.5%)</td>
    </tr>
    <tr>
      <td>OpenMed/privacy-filter-multilingual</td>
      <td>0.662</td>
      <td>3.7% (2.8–5.0%)</td>
    </tr>
    <tr>
      <td>openai/privacy-filter</td>
      <td>0.406</td>
      <td>0.1% (0.0–0.5%)</td>
    </tr>
  </tbody>
</table>

<p>GLiNER again leads on the structural F1 you’d quote in a model card (0.825) and <strong>leaks more
than half of all PESELs</strong> (57.8%). A model that was never shown Polish protects the Polish ID;
a higher-F1 multilingual detector leaks the majority of them.</p>

<p><strong>An honest caveat, because it matters.</strong> This Polish track is early. It is still in development
(<code class="language-plaintext highlighter-rouge">dev</code>), built from a single authored template family, and <strong>not yet native-speaker- or IAA-validated</strong>.
Treat it as a strong early signal that the dissociation generalizes across languages and
identifier schemes — <strong>not</strong> as a validated, citable headline. Full validation comes before we
lean on it.</p>

<h2 id="what-is-and-isnt-a-claim-here">What is and isn’t a claim here</h2>

<p>The Romanian real-skeleton track is itself still in development (<code class="language-plaintext highlighter-rouge">dev</code>), pending native-speaker and
inter-annotator-agreement validation. So the result above is a <strong>measured, contamination-controlled
delta</strong> on held-out data — not yet a peer-reviewed, citable claim. We’d rather say that plainly
than round it up.</p>

<p>We’re also not the only people pointing at re-identification risk: concurrent, independent work
like <strong>RAT-Bench</strong> builds a re-identification-risk leaderboard over synthetic text on U.S.
demographics. EuroPriv-Bench’s angle is the part that’s underserved — European legal text, a
GDPR-aligned taxonomy, and national-ID structure decoded directly. We think it’s the <strong>first
<em>unified</em> pan-European</strong> benchmark to put detection and re-identification risk side by side on
the same gold; we don’t think it’s the first to care about the problem.</p>

<p>The takeaway is narrow and, we think, durable: <strong>if you pick a de-identification model on
detection-F1, you can pick one that leaks the identifiers you were trying to protect.</strong> Lead
with the leak-rate.</p>

<p>→ See every figure above, with its provenance, on the <a href="/leaderboard/">leaderboard</a> · read the
<a href="/papers/europriv-bench/">EuroPriv-Bench paper</a> · get the model:
<a href="https://huggingface.co/klusai/kp-deid-mdeberta-280m">klusai/kp-deid-mdeberta-280m</a>.</p>]]></content><author><name>KlusAI</name><email>research@klusai.com</email></author><category term="results" /><category term="models" /><summary type="html"><![CDATA[Our first de-identification model, klusai/kp-deid-mdeberta-280m, just landed on the public leaderboard as the best protector on the contamination-free Romanian real-skeleton track. It earns that title not by topping detection-F1 — it doesn’t — but on the metric we actually lead with: re-identification risk. And in earning it, it surfaces the program’s headline finding.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://research.klusai.com/assets/og-research.png" /><media:content medium="image" url="https://research.klusai.com/assets/og-research.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The first open datasets in the EuroPriv-Bench suite</title><link href="https://research.klusai.com/datasets/release/2026/06/01/first-open-ds-kp-datasets.html" rel="alternate" type="text/html" title="The first open datasets in the EuroPriv-Bench suite" /><published>2026-06-01T00:00:00+00:00</published><updated>2026-06-01T00:00:00+00:00</updated><id>https://research.klusai.com/datasets/release/2026/06/01/first-open-ds-kp-datasets</id><content type="html" xml:base="https://research.klusai.com/datasets/release/2026/06/01/first-open-ds-kp-datasets.html"><![CDATA[<p>The first open <strong>EuroPriv-Bench datasets</strong> are now on Hugging Face — general-domain
bring-up sets in Romanian, English, and Polish, <strong>50,000 documents each</strong>:</p>

<ul>
  <li><strong><a href="https://huggingface.co/datasets/klusai/ds-kp-general-ro-50k">klusai/ds-kp-general-ro-50k</a></strong> — Romanian</li>
  <li><strong><a href="https://huggingface.co/datasets/klusai/ds-kp-general-en-50k">klusai/ds-kp-general-en-50k</a></strong> — English</li>
  <li><strong><a href="https://huggingface.co/datasets/klusai/ds-kp-general-pl-50k">klusai/ds-kp-general-pl-50k</a></strong> — Polish</li>
</ul>

<p>These aren’t the first synthetic-PII datasets — the field has plenty. They’re the first
datasets in the EuroPriv-Bench suite, and they’re built to a quality bar most synthetic-PII
sets miss.</p>

<h2 id="the-bar-valid-ids-correct-spans-honest-provenance">The bar: valid IDs, correct spans, honest provenance</h2>

<p>Synthetic PII is easy to generate and easy to get subtly wrong. We held these sets to four
properties, each one checkable:</p>

<ul>
  <li><strong>Checksum-valid locale identifiers.</strong> Where an identifier carries a check digit, the
emitted value passes it: Romanian CNP, Polish PESEL and NIP, IBAN (mod-97), payment cards
(Luhn). Invalid or fake-checksum IDs are <strong>not</strong> emitted. A benchmark that quietly ships
malformed national IDs can’t tell you whether a model handles real ones.</li>
  <li><strong>Offset-correct gold spans, by construction.</strong> Because the PII is injected into the text,
we know exactly where every entity sits — no post-hoc span alignment to drift. We verify it
anyway: <strong>100% byte-equality</strong> between each gold span and the substring it points at, and
<strong>100% BIOES validity</strong> on the tag sequence.</li>
  <li><strong>Zero train/gold overlap.</strong> Training material and gold are kept strictly apart, so a model
can’t score on rows it has effectively seen.</li>
  <li><strong>Uniform provenance, per dataset.</strong> Each card records source and license, the generator
seed, and the taxonomy version — the same fields, the same shape, every time.</li>
</ul>

<h2 id="cleanly-licensed-openly-redistributable">Cleanly-licensed, openly redistributable</h2>

<p>The whole set is <strong>CC-BY</strong>. We sourced cleanly-licensed material only, so the datasets are
openly redistributable end to end — no “results you can see but data you can’t.” That’s a
precondition for the kind of reproducibility EuroPriv-Bench is built around: a number you
can’t trace to data you can load isn’t one you can check.</p>

<h2 id="how-it-fits-the-program">How it fits the program</h2>

<p>These sets feed the EuroPriv-Bench models and benchmark — the general-domain foundation the
detection and re-identification-risk evaluations run on. Romanian matters here in particular:
it isn’t in the common training corpora, so a Romanian gold set tests models on genuinely
unseen ground.</p>

<p>Re-identification risk, not detection-F1, is the metric we lead with — a missed national ID
isn’t one missed token, it’s a leaked birthday, sex, and county at once. Clean, checksum-valid
IDs are what make that measurement honest: you can only count what a miss exposes if the ID
you’re decoding is structurally real.</p>

<p>This is the general-domain bring-up. Legal and clinical synthesis come next.</p>

<p>→ See where these feed in on the <a href="/leaderboard/">leaderboard</a>, or read the
<a href="/roadmap/">roadmap</a>.</p>]]></content><author><name>KlusAI</name><email>research@klusai.com</email></author><category term="datasets" /><category term="release" /><summary type="html"><![CDATA[The first open EuroPriv-Bench datasets are now on Hugging Face — general-domain bring-up sets in Romanian, English, and Polish, 50,000 documents each:]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://research.klusai.com/assets/og-research.png" /><media:content medium="image" url="https://research.klusai.com/assets/og-research.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Introducing EuroPriv-Bench</title><link href="https://research.klusai.com/benchmark/release/2026/05/30/introducing-europriv-bench.html" rel="alternate" type="text/html" title="Introducing EuroPriv-Bench" /><published>2026-05-30T00:00:00+00:00</published><updated>2026-05-30T00:00:00+00:00</updated><id>https://research.klusai.com/benchmark/release/2026/05/30/introducing-europriv-bench</id><content type="html" xml:base="https://research.klusai.com/benchmark/release/2026/05/30/introducing-europriv-bench.html"><![CDATA[<p>We’re releasing <strong>EuroPriv-Bench</strong> — the first <em>unified</em> pan-European de-identification
benchmark. It puts privacy NLP for European languages on a single, GDPR-aligned taxonomy
and a privacy-utility metric, rather than the fragmented, English-centric, detection-F1-only
picture that exists today.</p>

<h2 id="the-gap-it-exposes">The gap it exposes</h2>

<p>Models advertising <strong>96–97% F1</strong> on English PII benchmarks tell you little about how they
behave on, say, Dutch clinical notes under a European privacy taxonomy. When we hold current
baselines to that bar, F1 drops to <strong>0.44–0.61</strong> across <code class="language-plaintext highlighter-rouge">en/fr/es/de/it/nl</code> — with recall
(the privacy-critical failure mode) the weakest link.</p>

<p>→ <strong><a href="/leaderboard/">See the live leaderboard</a></strong></p>

<h2 id="whats-in-v0">What’s in v0</h2>

<ul>
  <li>6 European language configs from cleanly-licensed open sources, remapped to the unified
KlusAI privacy taxonomy and fully attributed.</li>
  <li>A reproducible harness with provenance baked into every result (model id, dataset
config/split, harness &amp; taxonomy version, timestamp).</li>
  <li>Baselines for the current public de-identification models.</li>
</ul>

<h2 id="whats-next">What’s next</h2>

<p>More baselines (multilingual de-id models, GLiNER, Presidio), larger sample sizes, and the
legal/clinical splits — plus under-served languages including Romanian. Follow along here or
on <a href="https://github.com/klusai">GitHub</a>.</p>

<p><em>EuroPriv-Bench is open — see <a href="/leaderboard/#how-to-submit">How to submit</a>.</em></p>]]></content><author><name>KlusAI</name><email>research@klusai.com</email></author><category term="benchmark" /><category term="release" /><summary type="html"><![CDATA[We’re releasing EuroPriv-Bench — the first unified pan-European de-identification benchmark. It puts privacy NLP for European languages on a single, GDPR-aligned taxonomy and a privacy-utility metric, rather than the fragmented, English-centric, detection-F1-only picture that exists today.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://research.klusai.com/assets/og-research.png" /><media:content medium="image" url="https://research.klusai.com/assets/og-research.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The GPU isn’t always the answer</title><link href="https://research.klusai.com/engineering/notes/2026/05/27/the-gpu-isnt-always-the-answer.html" rel="alternate" type="text/html" title="The GPU isn’t always the answer" /><published>2026-05-27T00:00:00+00:00</published><updated>2026-05-27T00:00:00+00:00</updated><id>https://research.klusai.com/engineering/notes/2026/05/27/the-gpu-isnt-always-the-answer</id><content type="html" xml:base="https://research.klusai.com/engineering/notes/2026/05/27/the-gpu-isnt-always-the-answer.html"><![CDATA[<p>We benchmark a lot of models, so harness throughput matters. The intuition — “we have a 60-core
M3 Ultra GPU, use it” — turned out to be exactly wrong for this workload, in an instructive way.</p>

<p>The model under test is <code class="language-plaintext highlighter-rouge">openai/privacy-filter</code>: a sparse Mixture-of-Experts with only <strong>50M
active parameters</strong>, doing short-sequence token classification. We measured inference per example,
several ways:</p>

<table>
  <thead>
    <tr>
      <th>setup</th>
      <th>s/example</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>MPS (Apple GPU, PyTorch), single</td>
      <td>0.81</td>
    </tr>
    <tr>
      <td>MLX (Apple GPU), batched</td>
      <td>0.085</td>
    </tr>
    <tr>
      <td>CPU, batch=32, <strong>28 threads</strong></td>
      <td>0.083</td>
    </tr>
    <tr>
      <td>CPU, batch=32, <strong>4 threads</strong></td>
      <td><strong>0.041</strong></td>
    </tr>
  </tbody>
</table>

<p>Two surprises:</p>

<p><strong>1. The GPU lost.</strong> Both the PyTorch-MPS and the MLX paths were <em>slower</em> than CPU. With so few
active parameters and short sequences, there isn’t enough work per item to amortize the overhead of
getting data onto the GPU — and the MoE’s routing ops fall off the Metal fast path and bounce back
to the CPU anyway. GPUs win on <em>big</em> compute (large models, long sequences, training); they don’t
on a tiny MoE doing short spans.</p>

<p><strong>2. More threads were slower.</strong> PyTorch’s default (28 BLAS threads here) ran at <strong>half the speed</strong>
of 4 threads — the ops are small enough that thread-coordination overhead dominates.</p>

<h2 id="what-actually-used-the-machine">What actually used the machine</h2>

<p>The real lever was <strong>parallelism at the job level</strong>: run many small, thread-capped jobs at once.
Seven worker processes × 4 threads saturates the 28 cores, each job at its own fastest point. A
full sweep (multiple models × multiple language configs) that crawled before now finishes in a
couple of minutes — a ~7× wall-clock win, and identical (deterministic) numbers.</p>

<h2 id="the-lesson">The lesson</h2>

<p>Profile before you reach for the accelerator. “Use the GPU” and “use all the cores” are heuristics,
not laws — and for small models on short inputs, both can cost you. The GPU still earns its keep
here: just for the <em>other</em> job, training our own models, where the compute is actually large.</p>]]></content><author><name>KlusAI</name><email>research@klusai.com</email></author><category term="engineering" /><category term="notes" /><summary type="html"><![CDATA[We benchmark a lot of models, so harness throughput matters. The intuition — “we have a 60-core M3 Ultra GPU, use it” — turned out to be exactly wrong for this workload, in an instructive way.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://research.klusai.com/assets/og-research.png" /><media:content medium="image" url="https://research.klusai.com/assets/og-research.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>