deidentify — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited deidentify (Agent Skill) and scored it 87/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 2 flagged
The text {match} is the classic direct prompt-injection phrasing. Placed in a skill body that the agent reads as trusted instructions, it tries to make the agent abandon its prior rules and follow whatever comes next — a full system-prompt override.
ignore/disregard/forget … previous instructions sentence.The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
You are guiding a medical researcher through data de-identification. The actual de-identification is performed by a standalone Python script that runs WITHOUT any LLM. Your role is to explain, guide, and verify — not to see or process raw PHI data.
The script processes data locally. You never need to see patient-level data.
and the audit log (keyed hashes; no original values). Read the de-identified output only after the researcher has run the review and confirmed it; it has the identifiers they chose to anonymize removed, and nothing more (see "What the tool does not do").
English for technical terms (PHI, HIPAA, Safe Harbor, etc.).
! prefix,no Bash tool call): the review prints sample values of every column.
${CLAUDE_SKILL_DIR}/references/hipaa_18_identifiers.md — HIPAA Safe Harbor checklist${CLAUDE_SKILL_DIR}/references/korean_phi_patterns.md — Korean-specific regex patterns${CLAUDE_SKILL_DIR}/references/date_shift_guide.md — Date shifting best practicesRead relevant references before advising the researcher.
openpyxl (for .xlsx files): pip install openpyxlAsk the researcher:
Based on answers, recommend the appropriate command:
python3 deidentify.py full <file> --locale <code>python3 deidentify.py scan <file> --locale <code> firstAvailable locale codes: kr (Korea), us (USA), jp (Japan), cn (China), de (Germany), uk (United Kingdom), fr (France), ca (Canada), au (Australia), in (India), it (Italy), es (Spain). If --locale is omitted, the script shows an interactive country selection menu. Users can provide a custom locale file via --locale-file custom.json.
Guide the researcher to run the script. The script is located at:
${CLAUDE_SKILL_DIR}/deidentify.pyFull pipeline (recommended for most users):
python3 ${CLAUDE_SKILL_DIR}/deidentify.py full data.xlsx \
--locale kr \
--output-dir ./deidentified/Step-by-step (for careful review):
# Step 1: Scan
python3 ${CLAUDE_SKILL_DIR}/deidentify.py scan data.xlsx --locale kr --output-dir ./deidentified/
# Step 2: Review (interactive)
python3 ${CLAUDE_SKILL_DIR}/deidentify.py review ./deidentified/scan_report.json
# Step 3: Apply (refuses a report that was not reviewed, has a column without a decision,
# or was made from data that has changed since: edit the file, then scan and review again)
python3 ${CLAUDE_SKILL_DIR}/deidentify.py apply ./deidentified/reviewed_report.jsonOptions:
--locale CODE: Country locale for PHI patterns (kr, us, jp, cn, de, uk, fr, ca, au, in, it, es)--locale-file PATH: Custom locale JSON file (copy locales/_template.json to create one)--auto-accept-safe: Keep SAFE columns without showing them. Not recommended: SAFE meansno pattern matched, not that the column holds no identifiers (a name typed into a short comment matches no pattern), and this option means nobody looks at those columns
--hash-mapping: Store unkeyed SHA-256 hashes instead of original names/IDs in the mappingfile. Dates and numeric IDs can be recovered from such hashes by trying every candidate, so mapping.json stays restricted either way
--output-dir: Where to save de-identified file, mapping, and audit log-v/--verbose: Enable debug loggingThe script's terminal review has three passes:
with sample values. The researcher confirms or overrides each classification.
with more sample values displayed.
individual decisions before confirming.
identifies the patient, or row if every row is a different patient. Each patient gets their own offset; without a key the tool does not shift dates.
Coach the researcher. Deliver these prompts in the researcher's preferred language:
longer column name, ID-like numbers, a rare address. Read the sample values and type 'a' or 'k' — Enter alone is not accepted for these."
values too, and press 'r' if a column holds names or anything else identifying."
[REDACTED]: the script cannotfind a name inside a sentence, so it does not try to keep the rest of the text.
After the script completes, help the researcher verify:
before_hash is an HMAC-SHA256 under aper-run key that is kept only in mapping.json):
cat ./deidentified/audit_log.csv | head -20Verify the number of changes, affected columns, and PHI types.
pseudonyms (P0001, etc.), shifted dates and [REDACTED] markers where expected, and no names in the columns they kept. Read it yourself only after they confirm.
Verify no original names, phone numbers, or RRN values remain.
Generate a de-identification methods paragraph for the manuscript or IRB:
Template:
Direct identifiers were removed from the dataset prior to analysis using a rule-based de-identification tool (deidentify.py, medsci-skills) with the [COUNTRY] locale pattern pack. The tool scanned column names and cell values using regex patterns for country-specific identifiers (e.g., national ID numbers, phone numbers), email addresses, dates, and addresses. Each column classification was reviewed by the researcher in an interactive terminal session. Names were replaced with pseudonyms (P0001, P0002, ...), dates were shifted by a random per-patient offset (1-365 days, either direction) preserving relative temporal intervals, and direct identifiers (phone numbers, email addresses, national ID numbers) were suppressed. A total of [N] cells across [M] columns were de-identified. The de-identification mapping file was stored separately under restricted access (file permissions 0600).
Customize based on the actual audit log statistics. Do not call the dataset "de-identified under HIPAA Safe Harbor" (or anonymised under another law) unless the gaps listed in "What the tool does not do" were closed as well, or an expert determination covers them.
clean-data in the research pipeline/clean-data for data quality profiling/analyze-stats can safely process the de-identified output/write-paper Methods section should reference the de-identification process/write-protocol can use the HIPAA/PIPA reference files for protocol documentation| File | Contains PHI? | Safe for Claude? | Purpose |
|---|---|---|---|
*_deidentified.xlsx/csv | Only what the researcher kept, and what the tool cannot detect (see below) | After the researcher confirms it | Data for analysis |
mapping.json | YES | No | Original ↔ pseudonym mapping, per-patient date offsets, audit hash key |
audit_log.csv | No original values (keyed hashes) | Yes | What was changed and where |
scan_report.json | No cell values | Yes | Column classification results |
reviewed_report.json | No cell values | Yes | Researcher-reviewed classifications and patient key column |
The tool removes or replaces the identifiers the researcher marked for anonymization. It does not by itself make a dataset HIPAA Safe Harbor de-identified, or anonymous under other laws:
(e.g. "90+"); do it before sharing.
year; date shifting is a different method (typically justified by an expert determination or used within a limited data set). Dates the script cannot parse become [DATE_SHIFTED].
replaced as a whole. A name in a short comment column can still be classified SAFE: the review shows every column's sample values so the researcher can catch it.
(age + sex + ZIP + admission month) can identify a patient; no k-anonymity check is run.
locale; truncating ZIP codes to three digits (Safe Harbor) is not done.
zip,zipcode, zip_code) or by the ZIP+4 form (94110-1234). A bare 5-digit value cannot be told apart from other 5-digit codes (e.g. procedure codes), so a ZIP column under another name can be classified SAFE: check the sample values in review.
dash (Mar-15-2024), year-first with a month word (2024-Mar-15), month and year only (March 2024), non-English month words (15 mars 2024, 15. März 2024), and two-digit-year day/month dates outside the us locale (15/03/24 under uk). Under us, any M/D/YY-shaped value (e.g. 1/2/10) is treated as a date, so a column of such three-part numbers is flagged PHI/date.
numbers only where they look like the locale's phone numbers), and identifiers written in column names or file names. Only the first sheet of an Excel file is processed (the other sheets are not written to the output).
Supported (v1):
--locale-file with templateNOT supported (planned for v2):
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.