pedrohcgs/disclosure-check
Pre-screen analysis outputs (tables, figures, logs) built on restricted or confidential data for statistical-disclosure-limitation problems before any release. Scans for small cell counts, complementary-suppression gaps, dominance (p-percent / (n,k)), re-identifiable exact counts, PII leakage, and unrounded sensitive statistics; classifies each finding CRITICAL / WARNING / OK and gates on any CRITICAL. Use before depositing or sharing restricted-data results, or when the user says "disclosure check", "SDL scan", "is this output safe to release", "check for small cells", "disclosure avoidance", "pre-screen for the RDC", or "can I export this from the enclave".
npx skills add https://github.com/pedrohcgs/claude-code-my-workflow --skill disclosure-check
/disclosure-check — Statistical-Disclosure-Limitation pre-screenScan analysis outputs built on restricted or confidential data (Census FSRDC, IRS SOI, administrative registers, linked health records, proprietary firm panels) for the disclosure-avoidance problems that get an export request rejected — *before* it reaches the data provider's official disclosure review. The skill is a pre-screen, not a substitute for that review.
Core principle: A single un-suppressed n=3 cell, an exact count that pins down one firm, or a p-percent dominance failure can re-identify a person or establishment. Catch it on your machine, not in the rejection email from the RDC analyst.
$0 — outputs directory to scan. Defaults to scripts/R/_outputs/. Recognised siblings: scripts/stata/_outputs/, scripts/python/_outputs/, or any export-staging directory (e.g., a to_review/ folder the analyst stages for the RDC).--provider — selects which disclosure-rule profile to load (Phase 0). One of census / irs / irb / generic. Providers differ — thresholds and rules are not interchangeable; default generic is deliberately conservative.--threshold N — override the minimum cell count (default n<10). Census FSRDC commonly uses 10 for establishments; IRS and many IRBs differ. Always reconcile with your provider's *written* rules..claude/rules/confidential-data.md for the project's restricted-data handling contract and the rule-profile placeholder.--provider profile (a placeholder config the forker fills in from their *signed* agreement — Census, IRS, and IRB rules differ and supersede any default here):n<10),p-percent (a cell is unsafe if the largest respondents contribute > p% of the total) and (n,k) (top n units > k% of total),generic profile and flag prominently in the report that real provider thresholds must be substituted.Glob the outputs dir for .tex, .csv, .txt, .log, .smcl, .out, .md tables and figure-data files. For each:
0 < n < threshold that is not already suppressed.p-percent and (n,k) rules.\d{3}-\d{2}-\d{4}), exact dates of birth, addresses, exact lat/long or fine geocodes, record IDs that survived into an output.| Disposition | Meaning | Examples |
|---|---|---|
| CRITICAL | Would fail the provider's disclosure review; blocks release. | n=3 cell un-suppressed; complementary-suppression hole; p-percent dominance failure; any PII; an exact count identifying ≤2 units. |
| WARNING | Plausibly safe but needs a human judgment call. | Cell at exactly the threshold; unrounded total just over a rounding base; geographic statistic near the min-population floor. |
| OK | Within the loaded rules, no action needed. | Counts ≥ threshold and rounded; dominance passes; no PII. |
When two findings interact (a suppressed cell + a recoverable margin), report them together — the gate cares about the joint disclosure risk, not each cell in isolation. Be economics-aware: DiD / event-study cell counts per (cohort × period), IV first-stage subsamples, RCT arm × stratum balance tables, and panel firm-counts are the usual offenders.
For each CRITICAL / WARNING, propose the standard SDL fix, in order of preference:
Each suggestion names the file, the cell/location, the rule it violates, and the concrete edit — never auto-applies it (the analyst owns the disclosure decision).
Exit non-zero on any CRITICAL. WARNINGs surface but do not block. See Exit behavior.
Write quality_reports/disclosure_check_[outputs-dir-slug].md:
# Disclosure Check: [outputs dir]
**Date:** [YYYY-MM-DD]
**Provider profile:** census | irs | irb | generic (rules source: confidential-data.md)
**Min cell count:** [N] **Dominance:** p=[p]%, (n,k)=([n],[k]%) **Rounding base:** [b]
## Summary
| Disposition | Count |
|---|---|
| CRITICAL | M |
| WARNING | W |
| OK | P |
| **Verdict** | **PASS / FAIL** (FAIL iff M > 0) |
## CRITICAL (blocks release)
| File | Location | Rule violated | Observed | Suggested remediation |
|---|---|---|---|---|
| tab3_by_cohort.tex | row "2008", col "n" | min cell (n<10) | n=4 | suppress cell + suppress complement in margin |
## WARNING (human judgment)
| File | Location | Concern | Suggested action |
|---|---|---|---|
## OK
[counts only, or a short list]
## Next steps
1. Resolve every CRITICAL — suppress / round / top-code / aggregate, then re-run.
2. Review WARNINGs with the agreement's written rules in hand.
3. Re-run until zero CRITICAL, THEN submit to the provider's OFFICIAL disclosure review.
/audit-reproducibility's gate semantics: WARNING ≠ FAIL, only CRITICAL blocks.--provider <name> — Load that data provider's disclosure rules (e.g. census-fsrdc, irs, irb). Default: the generic small-cell ruleset.--threshold <n> — Override the minimum cell-count threshold (default n<10); match your data-use agreement's actual rule..claude/rules/confidential-data.md — restricted-data handling contract + the provider-rule profiles this skill loads..claude/rules/replication-protocol.md — for restricted-data papers the replication package ships code + access path, not the microdata; screen every released output first..claude/skills/audit-reproducibility/SKILL.md — numeric paper↔code verification: run it on the *retained* values, this skill on the *released* ones..claude/skills/data-analysis/SKILL.md, .claude/skills/stata-replication/SKILL.md — produce the R / Stata / Python outputs this skill screens.--provider profile is wrong, the scan is wrong. Reconcile with the written agreement, not a default.Take pedrohcgs/disclosure-check from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.