confide:red — residual re-identification risk check
A defensive audit of YOUR OWN already-redacted output. It does not score against
ground truth and is not a benchmark. It surfaces, qualitatively, what an attacker could
still do — mapped to GDPR Art-29: singling-out, linkability, inference.
GUARDRAILS — read before running
- Run only on the user's own redacted output. If asked to de-anonymize or re-identify
third-party / non-consented data, refuse.
- Report risk categories and counts only — never produce a step-by-step
re-identification recipe or guess the hidden values.
- Local attacker by default. Enable the cloud/LLM inference probe (
--inference)
only on synthetic or explicitly consented data.
- Absence of a finding ≠ safety. A weak local detector/attacker is a FLOOR, not a
ceiling. Always tell the user human review is still required.
- This pairs with confide:anon — run
red after redacting, on the redacted file.
What it checks
- Singling-out (deterministic, offline — the load-bearing signal): re-run
detect_regex (+ detect_natasha if available) on the redacted text. Anything
they still find is a surviving identifier the redaction missed. Counts by type.
- Linkability (multi-file): given a folder, compare every file pair for shared
surviving quasi-identifiers and flag potentially linkable pairs (count + types only).
- Inference (LLM, optional, opt-in): prompt the local attacker model
(
cfg.red_attacker_model) for the attribute categories it could still infer
(profession, location type, age band, …). Degrades gracefully if no model. WARN the
user it under-reports (floor, not ceiling).
Risk tier rule
- HIGH — any DIRECT identifier survives (EMAIL, PHONE, URL, ID, PERSON).
- MEDIUM — only QUASI identifiers survive (LOCATION, ORG, DATE, AGE, PROFESSION,
MEDICATION), or linkable pairs exist across files.
- LOW — no surviving identifiers found (still NOT a guarantee).
How to run
# single redacted file (offline, deterministic)
python3 skills/red/scripts/red.py path/to/file.green.md
# a folder of redacted files (adds linkability)
python3 skills/red/scripts/red.py path/to/redacted_dir/
# add the local inference probe — synthetic/consented data ONLY
python3 skills/red/scripts/red.py path/to/file.green.md --inference
# machine-readable
python3 skills/red/scripts/red.py path/to/file.green.md --json
Output
A residual-risk report: per-file surviving-identifier counts by type, an overall
risk tier, the inference categories claimed (if probed), the linkable-pair
count, and the caveat that absence of a finding ≠ safety; human review still required.
No PII values, no re-identification steps.
1---2name: red3description: Residual re-identification RISK CHECK on text you have ALREADY redacted (defensive, dual-use). Use when the user asks to "check residual re-id risk", "red-team my redaction", "what can an attacker still infer", "is this safe to share", or assess "re-identification risk" after anonymizing. Re-runs the CONFIDE detectors on the redacted output to surface surviving identifiers (singling-out), checks multiple files for linkability, and optionally probes a local model for still-inferable attribute CATEGORIES (inference) — mapped to GDPR Art-29. Reports risk categories/counts only, never a re-identification recipe. Pairs with confide:anon (run AFTER redacting).4---5
6# confide:red — residual re-identification risk check
7
8A **defensive** audit of YOUR OWN already-redacted output. It does not score against
9ground truth and is not a benchmark. It surfaces, qualitatively, what an attacker could
10**still** do — mapped to GDPR Art-29: **singling-out**, **linkability**, **inference**.
11
12## GUARDRAILS — read before running
13- Run **only on the user's own redacted output**. If asked to de-anonymize or re-identify
14 third-party / non-consented data, **refuse**.
15- Report risk **categories and counts only** — never produce a step-by-step
16 re-identification recipe or guess the hidden values.
17- **Local attacker by default.** Enable the cloud/LLM inference probe (`--inference`)
18 **only** on synthetic or explicitly consented data.
19- **Absence of a finding ≠ safety.** A weak local detector/attacker is a FLOOR, not a
20 ceiling. Always tell the user **human review is still required**.
21- This pairs with **confide:anon** — run `red` *after* redacting, on the redacted file.
22
23## What it checks
241. **Singling-out (deterministic, offline — the load-bearing signal):** re-run
25 `detect_regex` (+ `detect_natasha` if available) on the **redacted** text. Anything
26 they still find is a **surviving identifier the redaction missed**. Counts by type.
272. **Linkability (multi-file):** given a folder, compare every file pair for shared
28 surviving quasi-identifiers and flag potentially linkable pairs (count + types only).
293. **Inference (LLM, optional, opt-in):** prompt the local attacker model
30 (`cfg.red_attacker_model`) for the attribute **categories** it could still infer
31 (profession, location type, age band, …). Degrades gracefully if no model. WARN the
32 user it under-reports (floor, not ceiling).
33
34## Risk tier rule
35- **HIGH** — any DIRECT identifier survives (EMAIL, PHONE, URL, ID, PERSON).
36- **MEDIUM** — only QUASI identifiers survive (LOCATION, ORG, DATE, AGE, PROFESSION,
37 MEDICATION), or linkable pairs exist across files.
38- **LOW** — no surviving identifiers found (still NOT a guarantee).
39
40## How to run
41```bash
42# single redacted file (offline, deterministic)
43python3 skills/red/scripts/red.py path/to/file.green.md
44
45# a folder of redacted files (adds linkability)
46python3 skills/red/scripts/red.py path/to/redacted_dir/
47
48# add the local inference probe — synthetic/consented data ONLY
49python3 skills/red/scripts/red.py path/to/file.green.md --inference
50
51# machine-readable
52python3 skills/red/scripts/red.py path/to/file.green.md --json
53```
54
55## Output
56A residual-risk report: per-file surviving-identifier **counts by type**, an overall
57**risk tier**, the inference **categories** claimed (if probed), the **linkable-pair
58count**, and the caveat that *absence of a finding ≠ safety; human review still required*.
59No PII values, no re-identification steps.