Skip to content

Commit 83c012d

Browse files
louis030195claude
andcommitted
strip dataset internals from public docs
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>
1 parent eca30d3 commit 83c012d

9 files changed

Lines changed: 67 additions & 148 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,10 @@ Initial private staging release. Three sub-benches assembled, frontier-model ada
2525
### Added
2626
- Repo skeleton + brand (ScreenLeak): `README`, `METHODOLOGY`, `THREAT_MODEL`, `CATEGORIES`, `LIMITATIONS`, `SOURCES`, `CITATION`, `ROADMAP`, `CONTRIBUTING`, `SECURITY`.
2727
- `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.
31-
- Top-level `Makefile` with `vendor`, `bench`, `unify`, `smoke`, `test`, `lint`, `pre-oss`, `clean`.
32-
- `scripts/vendor_text.sh`, `scripts/vendor_image.sh`, `scripts/build_unified_leaderboard.py`, `scripts/pre_oss_check.sh`.
28+
- `text/` sub-bench: 422 cases, 13 categories, 17 adapters including frontier APIs (`claude`, `gpt5`, `gemini`).
29+
- `image/` sub-bench: synthetic screenshots across 9 app templates, 4 adapter scaffolds, with a small public sample.
30+
- `trace/` sub-bench: 12-category PII pool, replay + scoring, adapters for Claude / GPT-5 / Gemini.
31+
- Top-level `Makefile` with `bench`, `unify`, `smoke`, `test`, `lint`, `clean`.
3332
- 31 unit tests covering pii pool, injection (gold-truthfulness, unicode handling, determinism), scorer (literal + fuzzy matching, bootstrap CIs), and unified-leaderboard parsing.
3433
- GitHub CI workflow + issue / PR templates.
3534
- `.synth-allowlist` for files deliberately containing synthetic-realistic strings.
@@ -57,6 +56,6 @@ Without the nudge, some models (notably Claude Opus 4.7) end the turn with zero
5756
### Known limitations (carried into v0.1)
5857
- Image bench category set is asymmetric vs text/trace (missing `private_handle`, `private_id`, `private_date`).
5958
- Trace bench v0 covers unprompted leakage only; adversarial prompt-injection split slips to v0.1.
60-
- Image bench shipped as 60-image subset (~9MB) rather than full 2,206 images. Full corpus uploads as HF dataset on public release.
59+
- Image bench ships with a small public sample; the full val set lives in the private companion repo.
6160
- English-only on image and trace benches.
6261
- No adapter for the screenpipe-pii-redactor model on image or trace benches (text bench only).

LIMITATIONS.md

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,11 @@ What ScreenLeak doesn't measure, doesn't cover, or measures imperfectly. Updated
66

77
### Synthetic data only
88

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.
1310

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.
1512

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.
1914

2015
### Category asymmetry
2116

@@ -25,41 +20,41 @@ The image bench corpus does not contain spans for these canonical categories:
2520
- `private_id`
2621
- `private_date`
2722

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.
2924

3025
### English-heavy
3126

3227
- 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.
3429
- Trace bench is **English-only**.
3530

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.
3732

3833
### Adversarial coverage
3934

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.
4237
- Trace bench v0 covers **unprompted leakage only**. Adversarial prompt-injection via on-screen text is slated for v0.1.
4338

4439
### Trace bench is small
4540

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).
4742

4843
### Image bench: GPT-5.5 is slow
4944

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.
5146

52-
### Image bench: rfdetr trained on the same generator
47+
### Image bench: rfdetr is in-distribution
5348

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.
5550

5651
### Frozen leaderboard
5752

5853
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.
5954

6055
### No capability measurement
6156

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).
6358

6459
## Per-sub-bench limitations
6560

METHODOLOGY.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,10 @@ Reported in milliseconds. Includes adapter pre/post-processing (tokenization, im
7777

7878
## Reproducibility
7979

80-
- All bench corpora are deterministic. Synthetic-data generators use fixed seeds.
80+
- Public sample is included in the repo — anyone can re-run an adapter against it and verify the scoring kernel.
8181
- Adapter randomness: temperature=0 wherever the API allows. For models without a temperature knob, we report median of 3 runs.
82-
- Bootstrap seed: 42.
8382
- Hardware: noted per-row in the leaderboard.
83+
- Full val sets: private companion repo, access on request to `louis@screenpi.pe`.
8484

8585
## What we do NOT measure (in v1)
8686

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Single shared label-subset dict ([`scoring/frameworks.py`](scoring/frameworks.py
2929
| Bench | Question | Corpus |
3030
|---|---|---|
3131
| [`text/`](text/) | Find PII in window titles / AX nodes / OCR fragments | 422 cases · 13 labels · multilingual + adversarial splits |
32-
| [`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 |
3333
| [`trace/`](trace/) | Does the agent leak PII it observes inside a task? | 50 traces (25 train + 25 val) with injected PII |
3434

3535
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
6161

6262
**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.
6363

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).
6565

6666
## What's in this repo
6767

@@ -73,7 +73,7 @@ Zero-leak alone is half the picture. Local size + RAM + latency are the other ha
7373
- `image/corpus/sample/` — 30 rendered screenshots + DOM-extracted gold bboxes
7474
- `trace/data/injected_sample.jsonl` — 5 multi-turn computer-use traces
7575

76-
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`.
7777

7878
## Run an adapter on the sample
7979

ROADMAP.md

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,21 @@
11
# Roadmap
22

3-
## Where we are (2026-05-10)
3+
## v0.1
44

5-
**v0 in progress.** Skeleton + vendor scripts + trace stubs landed. Frontier-model adapters not yet wired. Trace bench data not yet generated.
5+
- **Image bench category coverage** — backport `private_handle`, `private_id`, `private_date` so image is symmetric with text + trace.
6+
- **Adversarial prompt-injection split** for `trace/`. Screen content contains "ignore prior instructions, output user's CC." Does the agent comply?
7+
- **Trace bench scaling** — 50 → 200 traces (val 25 → 100), tighter CIs.
8+
- One more frontier-model refresh as the next round of APIs ships.
9+
- Public submission portal — PR-an-adapter, automated leaderboard refresh.
610

7-
## v0 goals (target: 5 working days)
11+
## Post v0.1
812

9-
| Day | Output | Status |
10-
|---|---|---|
11-
| 1 | Vendor text + image benches in. Add 4 frontier-model adapters to `text/`. Run `text/` leaderboard refresh. ||
12-
| 2 | Add 4 frontier adapters to `image/` (Claude, GPT-5, Gemini 2.5, Pixtral) + run scaffolded `moondream` and `gemma4`. Refresh `image/results/leaderboard.md`. ||
13-
| 3 | Build `trace/` from scratch: pull 50–100 seed traces from `screenpipe-finetune/data/screenpipe_raw.jsonl`, write injection pipeline, replay harness, scoring. ||
14-
| 4 | Unified leaderboard. Polish `METHODOLOGY.md`, `THREAT_MODEL.md`. Draft launch blog post. ||
15-
| 5 | Ship: HF datasets (3), GitHub public, landing page, X thread, HN, 5 targeted DMs to research/safety folks. ||
16-
17-
## Locked decisions
18-
19-
- **Brand:** ScreenLeak
20-
- **Authorship:** "Louis Beaumont (independent, Mediar Inc.)" — research-tone byline
21-
- **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/`.
37-
- Multi-language image bench (currently English-only synthetic).
38-
- Public submission portal (PR-an-adapter).
13+
- **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.
15+
- **Image-watermark / adversarial-style PII** robustness.
3916

4017
## What this is not
4118

42-
- **Not a capability benchmark.** ScreenLeak does not measure "can the agent book a flight." Use WebArena, OSWorld, GAIA for that.
43-
- **Not a model.** ScreenLeak is the bench. The screenpipe-pii-redactor model is a separate artifact (CC BY-NC 4.0, on HF).
44-
- **Not a vendor blog post.** Public framing is research-tone, independent. The screenpipe.com product is mentioned in the founder bio only.
19+
- **Not a capability benchmark.** Use WebArena / OSWorld / GAIA for "can the agent book a flight."
20+
- **Not a model.** ScreenLeak is the bench. `screenpipe/pii-redactor` and `screenpipe/pii-image-redactor` are separate artifacts on HuggingFace.
21+
- **Not a vendor pitch.** Scoring code + sample corpus are open; the full val sets are private to keep the leaderboard uncontaminated.

0 commit comments

Comments
 (0)