anonymize-data

Anonymisez des fichiers CSV, JSON, texte UTF-8 et SQLite à l'aide d'une politique explicite via le projet oai-trial. Utilisez pour anonymiser des données, pseudonymiser des exports, masquer des littéraux de politique, ou découvrir et approuver explicitement des alias approximatifs de noms.

Qu'est-ce que anonymize-data ?

Cette compétence agit comme une fine interface CLI/Docker pour le projet canonique `oai-trial`, dédiée à l'anonymisation de données structurées (CSV, JSON, SQLite) et de texte UTF-8 selon une politique de règles explicite. Elle évite de dupliquer la logique interne du projet (matching, adaptateurs de format, vérification, schémas) et conserve son argparse CLI original, n'ajoutant pas de nouveau service ou interface Python. L'utilisateur peut ainsi exécuter des opérations d'anonymisation, de pseudonymisation, de masquage ou de découverte de noms approximatifs via RapidFuzz, avec des mécanismes de sécurité stricts : les propositions de découverte doivent être approuvées manuellement par l'opérateur, aucune remplacement automatique n'est effectué. La compétence est conçue pour être utilisée sans mémoire, fournisseur de credentials, LLM, réseau ou base de données externe ; seul `uv` est nécessaire pour l'installation initiale. Elle supporte un mode de vérification indépendant et des tests de robustesse via `sanity.sh` et `fixtures/agentic_eval.json`, garantissant que les données sensibles sont correctement détectées et anonymisées, y compris dans des représentations numériques complexes (entiers SQLite, nombres en notation scientifique, etc.).

Compatible avec~Claude Code~Codex CLI~Cursor✓Antigravity
npx skills add https://github.com/grahama1970/agent-skills/tree/main/skills/anonymize-data

Installed? Explore more Recherche et analyse de données skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Anonymiser des données

Opérez le projet canonique oai-trial. Ne dupliquez pas son moteur de correspondance, ses adaptateurs de format, son vérificateur, ses schémas ou sa gestion d'erreurs dans cette compétence. L'interface argparse CLI existante du projet est intentionnellement conservée ; ce wrapper n'ajoute pas de CLI ou de service Python.

Configuration et fonctionnement principal

ANONYMIZE_DATA_ROOT remplace le répertoire de travail principal par défaut ci-dessus. La configuration nécessite uv et installe les dépendances de développement/découverte déclarées du projet. Les opérations d'exécution ne nécessitent ni mémoire, ni identifiants de fournisseur, ni LLM, ni réseau, ni service de base de données.

./run.sh setup
./run.sh --input /data/exports --policy /data/policy.json --output /data/release
./run.sh anonymize --input /data/export.sqlite --policy /data/policy.json --output /data/release

L'entrée est un fichier .csv, .json, .txt ou .sqlite, ou un répertoire contenant ces fichiers. La politique doit être un fichier régulier séparé. Utilisez un répertoire de sortie vide dédié, en dehors des entrées. Les originaux sont copiés dans un instantané temporaire privé ; la sortie réussie contient uniquement corpus/ et report.json.

L'interface de bundle existante reste disponible :

./run.sh run --input /data/bundle --output /data/release
./run.sh verify --input /data/bundle --output /data/release
./run.sh inspect /data/release

Un bundle contient policy.json et corpus/. La politique, l'identité canonique, les règles de valeur protégée, les échecs typés et le schéma du rapport appartiennent au projet. Lisez son README.md, docs/ANONYMIZATION_SEMANTICS.md et schemas/report.schema.json lors de leur interprétation. Ne déclarez pas le succès uniquement à partir d'un code de sortie : lisez le rapport réel, validez ses champs de préparation et inspectez la sortie pour le format demandé. Les rapports corrompus ou manquants ne sont PAS PRÊTS (READY).

Découverte optionnelle RapidFuzz : jamais de remplacement automatique

./run.sh discover --input /data/exports --policy /data/policy.json --output /data/work/review.json
./run.sh approve-discovery --input /data/exports --policy /data/policy.json \
  --review /data/work/review.json --approve CANDIDATE_ID --output /data/work/approved-policy.json
./run.sh --input /data/exports --policy /data/work/approved-policy.json --output /data/release

La découverte compare les valeurs de chaînes structurées entières et les lignes de texte entières par rapport aux entrées de politique de type name. Ce n'est pas une extraction de spans NLP ou un scanner PII général. Par défaut : seuil de similarité 90, marge de séparation 5 ; configurables avec --threshold et --margin. Les égalités, quasi-égalités, valeurs protégées, valeurs contenant des chiffres ou une ponctuation d'identifiant telle que @, /, _, et les littéraux déjà connus ne sont pas proposés. Les apostrophes, traits d'union et points sont autorisés dans les textes en forme de nom ; la similarité n'est jamais une preuve que deux personnes sont une seule.

Demandez à l'opérateur d'approuver des IDs candidats spécifiques. N'approuvez jamais uniquement à partir du score de similarité. L'approbation re-dérive les propositions par rapport à la politique/au corpus actuel, rejette les révisions obsolètes/modifiées et compile une politique de correspondance exacte. Les propositions non approuvées n'affectent jamais l'anonymisation. release_ready: false est obligatoire sur les reçus de découverte/approbation.

Les fichiers de révision et de politique approuvée contiennent des noms bruts : conservez-les en dehors des versions, des journaux et des rapports partagés. Ils sont créés en mode 0600 et n'écrasent jamais un fichier existant. Les instantanés temporaires sont par défaut sur le disque d'artefact ; remplacez avec ANONYMIZE_DATA_WORK_DIR si nécessaire.

Docker reste l'interface autonome

Depuis le répertoire du projet :

docker build -t anonymization-trial .
docker run --rm anonymization-trial
# Image optionnelle activant la découverte ; l'image par défaut garde la dépendance exacte du moteur sans surcharge.
docker build --build-arg INCLUDE_DISCOVERY=1 -t anonymization-trial:discovery .

Montez uniquement l'entrée/la politique demandée en lecture seule et un répertoire de sortie dédié. Le même CLI du projet s'exécute à l'intérieur de l'image ; l'évaluateur n'a pas besoin de cette compétence. Voir docs/DISCOVERY.md du projet pour des exemples complets de commandes montées.

Limites d'échec et de preuve

Le wrapper conserve les codes de sortie du projet et les codes d'erreur nettoyés. Un projet/manquant et des chemins de packages installés incorrects échouent avant le traitement. Utilisez --help pour le contrat d'argument réel. La découverte est du matériel de révision, pas une version, une garantie d'anonymat, une probabilité de confiance ou une autorisation humaine.

./sanity.sh exécute de véritables vérifications CLI positives, négatives et adverses. Le fixtures/agentic_eval.json conservé les répète et nécessite une relecture de l'artefact. Une qualification préalable d'essai ne qualifie pas automatiquement ces extensions post-essai.

Règle de représentation (opérateur 2026-09-11)

Les PII doivent être mises en correspondance avec la valeur, pas avec la chaîne : avant que tout scalaire JSON/SQLite ne soit transmis inchangé, le transformer canoniquement en chaîne (nombres en forme de téléphone au format E.164) et exécuter la correspondance de politique sur la forme chaînée. Les fixtures doivent inclure chaque classe de PII dans chaque type scalaire JSON. Un numéro de téléphone stocké sous forme d'entier est le même numéro de téléphone, y compris lorsque la politique l'écrit sous forme de chaîne formatée telle que 555-123-4567 et que le corpus stocke 5551234567. Les conversions numériques avec perte de précision (zéro non significatif ou flottant) doivent échouer de manière sécurisée, sauf si une règle canonique spécifique au type prouve une équivalence sûre. Voir $best-practices-skills "Matrice de représentation des valeurs".

Leçons de durcissement (ne les réapprenez pas à la dure)

L'essai a été disqualifié parce qu'un téléphone stocké sous forme d'entier JSON/SQLite a passé le vérificateur de chaîne uniquement. La cause racine était une erreur de processus : le contrôle d'acceptation a été rédigé à partir de ce que le code faisait, non dérivé de la spécification livrée. Ces règles existent pour que cette classe d'erreur ne puisse pas se reproduire.

  1. Dérivez le contrôle de la spécification, pas du code. policy.json liste les valeurs sensibles exactes. Le contrôle d'acceptation correct est "aucune de ces valeurs n'apparaît dans la sortie décodée, dans aucune représentation" — lisez les valeurs du fichier de politique, jamais une liste rédigée à la main. Prouvez que le contrôle dépend de la spécification avec une sonde de dépendance (inversez une valeur de politique → le résultat doit s'inverser). Implémentation de référence : le scripts/spec_derived_check.py du projet intégré dans scripts/verify.sh.

  2. Le vérificateur indépendant ne doit partager aucune hypothèse avec la transformation. Le vérificateur original avait le même angle mort de chaîne uniquement que le producteur, donc rien n'a échoué de manière sécurisée. L'oracle de vérification doit être conscient de la représentation et indépendant : analyser JSON (décoder \uXXXX), développer les scalaires numériques sous forme entière/décimale, normaliser NFC/NFD des deux côtés, scanner les cellules de table+vue SQLite ET le DDL sqlite_master ET chaque entier d'en-tête, et scanner toute la limite publiée y compris report.json — pas seulement corpus/.

  3. La classe de représentation complète est une liste de contrôle, pas un seul bug. Chacun de ceux-ci peut transporter une valeur sensible au-delà d'un vérificateur naïf ; le projet corrige et conserve un garde pour chacun : scalaires numériques typés (int/float, notation scientifique), SQLite BLOB (échec sécurisé), Unicode NFC/NFD, reconstruction de vue, résidu de freelist, schéma-DB hostile (index expression/partiel, vues non déterministes, DEFAUTS calculés), littéraux de schéma-DDL et entiers d'en-tête persistants. Voir le docs/SECURITY_REMEDIATION.md du projet pour le tableau complet.

  4. Prouvez-le via le chemin Docker réel, de manière déterministe. La vérification doit être un script validé qui construit l'image, exécute les commandes exactes du brief et relit les octets publiés avec des sorties PASS/FAIL dures — pas de prose d'agent. Référence : security/docker_brief_contract.py (construction + les deux commandes du brief + analyse de fuite consciente de la représentation + précondition d'entrée) et security/docker_hardening_matrix.py (trous adverses via docker run). Enregistrez le commit git et l'id de l'image construite.

  5. Limitez honnêtement la portée. Les pseudonymes déterministes d'espace de noms public divulguent l'égalité/la fréquence et n'offrent aucune résistance au lien externe ; le rapport d'exécution l'indique dans key_mode et does_not_establish. Une valeur de politique égale à une constante de format SQLite obligatoire est une entrée dégénérée, pas une vraie PII ; le pipeline échoue de manière sécurisée sur celle-ci et ce résidu est documenté comme limité.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

grahama1970/acceptance-contract

Turn a client brief, zip bundle, directory, or single requirements file into a typed acceptance-contract bundle with extracted requirements, acceptance checks, open questions, an immutable-goal draft, and a create-report-backed decision report. Use when users say acceptance contract, brief to requirements, freeze the goal, create immutable goal, amend immutable goal, build a Battle requirements bundle, or extract requirements from this bundle.

grahama1970/agent-ecosystem

Canonical map and shared contracts for the agent-governance ecosystem: the pi.receipt_envelope.v1 boundary envelope, the component graph, and the rules for which component owns which schema. Use when wiring a skill or extension into the shared receipt world, when asking how shame, triage-error, tau, ask, project-watchdog, ops-herdr, ponytail, and Memory fit together, or when validating an envelope.

grahama1970/agentic-evals

Agentic evaluation of skills using multi-trial fixtures, deterministic command assertions, trajectory checks, safety constraints, and evidence-backed readiness scoring. Use when users ask for agentic evals, multi-trial skill evaluation, skill trajectory validation, or readiness scoring for a skill workflow.

grahama1970/agent-inbox

File-based inter-agent messaging with headless dispatch. Check inbox, send bugs/requests to other projects, automatically spawn headless agents to fix bugs, and track progress via task-monitor.

grahama1970/agents-registry

Generate and query the centralized agent identity registry. Scans .pi/agents/*/AGENTS.md, parses frontmatter, outputs agents-registry.json and optionally syncs to /memory for semantic search.

grahama1970/agent-status

Artifact-driven status surfaces for long-running project-agent work. Maintains status.json, events.jsonl, proof manifests, and a stale-aware STATUS.html so humans can tell where the agent is, what passed, what is still unproven, and what decision or action is next — without dashboard theater.

grahama1970/align

Round-based context alignment before execution. Use when the human, project agent, WebGPT, scillm, ask, dogpile, memory, or project-knowledge may each hold different facts about a task; especially before ambiguous design, infographic, product workflow, high-stakes implementation, plan-iterate, project-infographic, or multi-review work.

grahama1970/analytics

Flexible data science analytics for any dataset. Auto-discovers schema, recommends charts, exports to create-figure. Works with JSONL, JSON, CSV from any source.

grahama1970/analyze-chatterbox-emotions

Evaluate generated Chatterbox voice files as voice-quality artifacts: affect match, arousal/valence proxies, pause placement, intelligibility inputs, clipping, loudness, and discontinuity flags. Use when reviewing Chatterbox emotional tags, pauses, Turbo/base affect delivery, Persona Dream utterance renders, or whether generated speech matches an intended product-facing affect.

grahama1970/analyze-elf

Reverse-engineer features from ELF binaries. Extracts CLI commands, state machines, protocols, Zod schemas, and data models. Automatically generates a /create-walkthrough prosecution brief with Mermaid diagrams. Uses /treesitter for AST analysis of bundled JS/TS source.

grahama1970/animation-vocabulary

Reverse-lookup glossary that turns a vague description of a web animation or motion effect into its exact term ("the bouncy thing when a popover opens" → Pop in; "the iOS rubber-band scroll" → Rubber-banding). Use when the user asks "what's it called when…", or describes a motion effect without knowing its name and wants the right word to prompt an AI or designer with. For naming an effect, not designing or building one.

grahama1970/anvil

Heavy-duty "No-Vibes" debugging and hardening orchestrator. Use this for complex, stubborn bugs where `review-code` has failed, or for "Red Teaming" (hardening) a codebase. Runs multiple agents in parallel (Thunderdome) using git worktree isolation.

grahama1970/apple-design

Apple's approach to interface design and fluid, physical motion, translated for the web. Use when building or reviewing gesture-driven UI, spring animations, drag/swipe/sheet interactions, momentum and interruptible transitions, translucent materials and depth, typography (optical sizing, tracking, leading), reduced-motion, or the design foundations (feedback, spatial consistency, restraint) behind Apple-style interfaces.

grahama1970/argue

Multi-persona structured debate orchestrator. Personas research via /dogpile, consult colleagues via /ask, and argue toward nuanced synthesis on complex questions.

grahama1970/arxiv

Search arXiv for papers and extract knowledge into memory. Use `search` to find papers, `learn` to extract knowledge.

grahama1970/ask

Use when the user asks to query project memory, ask an oracle, use supported browser-backed reviewers, run Tau roundtable/single-handler workflows, ask Pi-native subagents from within Pi, run persona/deep-review workflows, generate image prompts, check OS/project health through composed skills, or run an ask DAG. This skill is the executable /ask runtime; do not replace it with an informal subagent, plain web search, or hand-written review; inside Pi, explicit Pi-native subagent targets are routed through the pi-subagents tool as an Ask target type.

grahama1970/assess

Step back and critically reassess project state. Use when asked to "assess", "step back", "fresh eyes", "check alignment", "sanity check", "health check", "prune documentation", or "evaluate what's working". Offers documentation pruning and doc-code alignment analysis. Offer to run after major changes (don't auto-run).

grahama1970/assistant

Shared GPT + classifier inference gateway for persona monitor tasks. Routes validation and classification through a 4-tier cascade: heuristic → classifier → local GPT → scillm.

grahama1970/assistant-lab

Self-improvement workbench for /assistant. All the tools needed to diagnose, train, evaluate, and promote models in a continuous loop. The "warm pond" where /assistant evolves its own inference stack.

grahama1970/batch-quality

Pre-flight validation and quality gates for batch LLM operations. ACTUALLY tests samples through LLM before burning tokens. Uses SPARTA contracts for DuckDB validation queries. Integrates with task-monitor for enforced quality gates.

Skills associés