You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Public surfaces were leaking implementation detail about how the
corpus is produced — generator file names, render pipeline, seed
mechanics, shard names, corpus sizes. Those are the moat; they don't
belong on the public side.
Trimmed across:
- README.md — drop "2,206 synthetic shots", swap "synthetic-data
generators" for "data pipelines that produce them", soften
the rfdetr training disclosure to "in-distribution with its
training, held-out images, same source".
- docs/index.md — same edits + collapse the methodology bullets
(no more RFC-6761 / `getBoundingClientRect` / `headless Chromium`
/ "deterministic generators with fictional pools"). FAQ "didn't
train on val set" answer no longer reveals the seed mechanism.
- SOURCES.md — rewrite from a literal provenance manifest
(paths into private repos, file counts, render pipeline) to a
high-level disclosure of what's in/out and where it lives.
- ROADMAP.md — drop the 5-day v0 launch plan, internal repo paths,
authorship/distribution decisions. Keep just the forward-looking
items.
- LIMITATIONS.md — drop "HTML/CSS template rendering" and the
shard filename listing (`adversarial.jsonl` etc); keep the
honest in-distribution / English-only / small-N disclosures.
- METHODOLOGY.md — drop "deterministic generators use fixed seeds /
bootstrap seed 42" — recovery recipe.
- CHANGELOG.md — drop file names of the trace generator
(`pii_pool.py` / `build_seeds.py` / `inject.py`) and the
2,206-image specific count.
- THREAT_MODEL.md — drop "deterministic generators" from the
trust-boundary row.
- results/framework_coverage.md — drop the shard listing from the
Moat section (`intl_id`, `special_category`, etc.).
What still stays public (methodology / credibility surface):
- That data is synthetic / no real PII
- The 13-label taxonomy + framework mapping
- N values, IoU threshold, CI methodology
- The public sample, per surface
- The fact that the full val sets and pipelines are private
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
-`LICENSE` (Apache 2.0) for code and `LICENSE-DATA` (CC BY 4.0) for corpora.
28
-
-`text/` sub-bench: vendored from `screenpipe-pii-bench` (422 cases, 13 categories, 17 adapters including 3 new frontier API adapters: `claude`, `gpt5`, `gemini`).
29
-
-`image/` sub-bench: vendored from `screenpipe-pii-bench-image` (2,206 synthetic images across 9 templates, 4 adapter scaffolds, ~9MB subset).
30
-
-`trace/` sub-bench: built from scratch. `pii_pool.py` (97 synthetic items / 12 categories), `build_seeds.py`, `inject.py`, `replay.py`, `score.py`, adapters for Claude / GPT-5 / Gemini.
Copy file name to clipboardExpand all lines: LIMITATIONS.md
+13-18Lines changed: 13 additions & 18 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,16 +6,11 @@ What ScreenLeak doesn't measure, doesn't cover, or measures imperfectly. Updated
6
6
7
7
### Synthetic data only
8
8
9
-
- All three sub-benches are synthetic.
10
-
- Image bench is generated by HTML/CSS template rendering, not real screen captures.
11
-
- Trace bench injects synthetic PII into otherwise-synthetic computer-use traces.
12
-
- No real user data was used in any corpus.
9
+
- All three sub-benches are synthetic. No real user data was used in any corpus.
13
10
14
-
**Synthetic-domain caveat.** The generator pool uses plausibly-realistic email domains (`.com`, `.io`, `.vc`) rather than RFC-6761 reserved domains, deliberately — a redactor that learns to skip `.example`would game the bench trivially. As a side effect, some synthetic domains coincidentally collide with real-but-unrelated organizations. The local-parts are synthetic and we make no claim that any email in the corpus belongs to a real person. If a collateral collision matters to your organization, contact`louis@screenpi.pe` for a swap.
11
+
**Synthetic-domain caveat.** The bench uses plausibly-realistic email domains rather than reserved ones — otherwise a redactor that learned to skip placeholder-style domains would game the bench trivially. As a side effect, some synthetic domains coincidentally collide with real-but-unrelated organizations. The local-parts are synthetic and we make no claim that any email in the corpus belongs to a real person. If a collateral collision matters to your organization, email`louis@screenpi.pe` for a swap.
15
12
16
-
**Why this matters:** frontier models may overfit to "synthetic-looking" UI. A model that scores 90% zero-leak on `image/` may still leak on a real Slack screenshot with anti-aliasing artifacts, third-party browser extensions, or unusual font rendering.
17
-
18
-
**Mitigation in v0:** templates closely mimic real apps (Slack, Outlook, Cursor, Arc, 1Password, Confluence, GitHub PR, Calendar, Terminal). Hard negatives (blank inboxes, public repo READMEs) are baked in. **Real-screen validation is not part of v0 — it's slated for v1.0.** Until then, treat the absolute image-bench numbers as best-case (in-distribution) figures, and treat the *relative* ordering of adapters as the load-bearing signal.
13
+
**Why this matters:** frontier models may overfit to in-distribution UI shapes. A model that scores 90 % zero-leak on `image/` may still leak on a real Slack screenshot with anti-aliasing artifacts, third-party browser extensions, or unusual font rendering. Real-screen validation is on the v1.0 roadmap; until then, treat the absolute image-bench numbers as best-case (in-distribution) figures, and the *relative* ordering of adapters as the load-bearing signal.
19
14
20
15
### Category asymmetry
21
16
@@ -25,41 +20,41 @@ The image bench corpus does not contain spans for these canonical categories:
25
20
-`private_id`
26
21
-`private_date`
27
22
28
-
Either generate synthetic spans for these (post-v0.1 backport) or interpret the image bench numbers as "9-of-12 categories" rather than fully comparable to text bench.
23
+
Interpret the image bench numbers as "9-of-13 categories" rather than fully comparable to text bench. Backport is on the v0.1 roadmap.
29
24
30
25
### English-heavy
31
26
32
27
- Text bench has multilingual splits (Japanese, Korean, French, Spanish, Italian, German, Dutch).
33
-
- Image bench is **English-only**synthetic generation. No CJK, Cyrillic, Arabic, or RTL coverage in v0.
28
+
- Image bench is **English-only**in v0. No CJK / Cyrillic / Arabic / RTL coverage.
34
29
- Trace bench is **English-only**.
35
30
36
-
**Why:** the image bench uses HTML rendering with default fonts. Multi-script support requires per-locale font bundling and per-locale name pools. Slated for post-v0.1.
31
+
Multi-script image bench is slated for post-v0.1.
37
32
38
33
### Adversarial coverage
39
34
40
-
- Text bench has dedicated adversarial splits (`adversarial.jsonl`, `adversarial_format.jsonl`, `adversarial_unicode.jsonl`) covering control characters, unicode tricks, and format-mimicry attacks.
41
-
- Image bench has hard negatives but no dedicated adversarial split (e.g. images with adversarially-styled PII).
35
+
- Text bench has dedicated adversarial splits covering control characters, unicode tricks, and format-mimicry attacks.
36
+
- Image bench has hard negatives but no dedicated adversarial split.
42
37
- Trace bench v0 covers **unprompted leakage only**. Adversarial prompt-injection via on-screen text is slated for v0.1.
43
38
44
39
### Trace bench is small
45
40
46
-
50 traces total in v0 (25 train + 25 val); the leaderboard scores against the val split. With n=25 the 95% bootstrap CIs are ~±20 percentage points wide — comfortably wide enough that the ranking is suggestive but not decisive between adjacent rows. v0.1 scales the corpus to 200 (val 100).
41
+
50 traces total in v0 (25 train + 25 val); the leaderboard scores against the val split. With n=25 the 95% bootstrap CIs are ~±20 percentage points wide — the ranking is suggestive, not decisive between adjacent rows. v0.1 scales the corpus to 200 (val 100).
47
42
48
43
### Image bench: GPT-5.5 is slow
49
44
50
-
GPT-5.5's vision API was slow enough (per-image latency dominated by reasoning) that the original run took ~80 minutes for 221 images. All three frontier models are now scored on the full 221-image val split, but reproducing the GPT-5.5 row may require similar patience or rate-limit handling depending on your account tier.
45
+
GPT-5.5's vision API was slow enough (per-image latency dominated by reasoning) that the original run took ~80 minutes for 221 images. All three frontier models are scored on the full 221-image val split, but reproducing the GPT-5.5 row may require similar patience or rate-limit handling depending on your account tier.
51
46
52
-
### Image bench: rfdetr trained on the same generator
47
+
### Image bench: rfdetr is in-distribution
53
48
54
-
The local `rfdetr_v8` checkpoint was trained on synthetic screenshots produced by the **same** HTML/CSS template generator that the image bench evaluates against. The val split is image-disjoint (no leaked PNGs) but distribution-matched (same templates, same name/email/secret pools). Its 95.3% zero-leak therefore measures **in-distribution recall**, not out-of-distribution generalization. Read it as: "what's achievable on this exact synthetic surface when you can train on the generator." It does *not* claim anything about real Slack/Outlook/Cursor screenshots. We expect the gap to narrow materially on real-screen evaluation — that's a v1.0 deliverable.
49
+
The local `rfdetr_v8` checkpoint was trained on the same source distribution the image bench evaluates against. The val split is image-disjoint (no leaked PNGs) but distribution-matched. Its 95.3% zero-leak therefore measures **in-distribution recall**, not out-of-distribution generalization. Read it as: "what's achievable on this exact surface when you can train on the source." It does *not* claim anything about arbitrary real Slack / Outlook / Cursor screenshots. We expect the gap to narrow materially on real-screen evaluation — that's a v1.0 deliverable.
55
50
56
51
### Frozen leaderboard
57
52
58
53
v0 ships with a single-snapshot leaderboard. No automated CI / live refresh. Models change weekly (especially frontier APIs) — re-run is manual until v0.2.
59
54
60
55
### No capability measurement
61
56
62
-
ScreenLeak measures disclosure, not capability. A model that refuses to do anything will score 100% zero-leak on trace bench and is also useless. Capability is measured elsewhere (WebArena, OSWorld, GAIA).
57
+
ScreenLeak measures disclosure, not capability. A model that refuses to do anything will score 100% zero-leak on trace bench and is also useless. Capability is measured elsewhere (WebArena, OSWorld, GAIA).
|[`image/`](image/)| Find pixel regions of PII in rendered screens |2 206 synthetic shots · 9 app templates · DOM-extracted bboxes|
32
+
|[`image/`](image/)| Find pixel regions of PII in rendered screens |Synthetic screenshots · 9 app templates · pixel-precise gold|
33
33
|[`trace/`](trace/)| Does the agent leak PII it observes inside a task? | 50 traces (25 train + 25 val) with injected PII |
34
34
35
35
All three use the same 13-label taxonomy ([`CATEGORIES.md`](CATEGORIES.md)).
@@ -61,7 +61,7 @@ Zero-leak alone is half the picture. Local size + RAM + latency are the other ha
61
61
62
62
**3. Frontier APIs don't withhold PII when working.** On 25 multi-turn traces, the strongest (GPT-5.5 at 64.0 %, CI 44 – 80 %) still leaks at least one observed PII item in 36 % of traces. Gemini at 20 % leaks in 80 % of traces.
63
63
64
-
**The pattern:** capability ≠ pixel-grounding ≠ disposition. A model nailing text detection at 91 % can still leak PII 80 % of the time when it observes that PII inside a task. See [`THREAT_MODEL.md`](THREAT_MODEL.md) for what counts as a leak, [`LIMITATIONS.md`](LIMITATIONS.md) for caveats (notably: `rfdetr` was trained on the same generator its val split comes from — held-out images, same distribution).
64
+
**The pattern:** capability ≠ pixel-grounding ≠ disposition. A model nailing text detection at 91 % can still leak PII 80 % of the time when it observes that PII inside a task. See [`THREAT_MODEL.md`](THREAT_MODEL.md) for what counts as a leak, [`LIMITATIONS.md`](LIMITATIONS.md) for caveats (notably: `rfdetr`'s val is in-distribution with its training — held-out images, same source).
65
65
66
66
## What's in this repo
67
67
@@ -73,7 +73,7 @@ Zero-leak alone is half the picture. Local size + RAM + latency are the other ha
The **full corpus**(422 text + 221 val image + 50-trace val) and the **synthetic-data generators**live in a private companion repo — both to keep the val sets clean (training on the generator would game the bench) and to keep the moat. Researchers running serious evaluations can request access at `louis@screenpi.pe`.
76
+
The **full val sets** and the data pipelines that produce them live in a private companion repo — to keep the leaderboard uncontaminated by training-on-the-bench and to preserve the moat. Researchers running serious evaluations can request access at `louis@screenpi.pe`.
-**Distribution order:** personal blog → HF datasets → GitHub public → X → HN → DMs (T+1)
22
-
-**Categories:** asymmetric in v1 (image bench is missing 4 categories); document, don't backport
23
-
-**Trace v1 scope:** leakage-only. Adversarial prompt-injection split slips to v0.1.
24
-
-**Trace seed source:**`screenpipe_raw.jsonl` (18K rows, before scrub) — clean PII state for re-injection.
25
-
26
-
## Open decisions (need to lock before day 5)
27
-
28
-
-**License.** Apache 2.0 (matches text bench upstream) vs MIT (simpler) for code. CC-BY-4.0 vs CDLA-Permissive for datasets. Default plan: Apache 2.0 for code, CC-BY-4.0 for datasets unless flagged otherwise.
29
-
-**HF org.**`huggingface.co/screenpipe/*` or `huggingface.co/screenleak/*`. Pick before dataset upload.
30
-
-**Domain.**`screenleak.dev` (new) vs `screenpi.pe/screenleak` (subpath). Subpath is cheaper, dev domain is more credible-looking for research.
31
-
32
-
## Post-v0.1
33
-
34
-
- Real-screenshot validation pass (private corpus only — never published).
35
-
- Train a screen-PII redactor on `image/corpus/annotations_train.jsonl` (1,985 imgs) — separate model artifact.
36
-
- Adversarial prompt-injection split for `trace/`.
-**Real-screen validation pass.** The single biggest open caveat — every image-bench number today is in-distribution. Validating on real Slack / Outlook / Cursor captures is the v1.0 deliverable that makes the image-bench numbers transferable.
14
+
-**Multi-language image bench.** Currently English-only. Adding CJK / Cyrillic / Arabic / RTL needs per-locale font bundling and name pools.
0 commit comments