Que fait Analyse de fichiers strictement locale ?
Objectif
Analyser des fichiers tabulaires, documents, PDF et images sans envoyer le fichier ou son contenu vers un service cloud, et masquer les données personnelles — noms, coordonnées, adresses, numéros d'identité — dans tous les modes. Les fichiers sources sont ouverts en lecture seule sur la machine locale, l'extraction et les statistiques sont effectuées via des scripts locaux, et chaque artefact reste dans un répertoire de travail local.
Étape 1 — Demander d'abord le chemin local (obligatoire, jamais sauté)
La première phrase après activation de cette compétence doit demander un chemin local, pas commencer l'analyse. Utilisez le libellé ci-dessous, adapté au contexte, en conservant quatre points : rien n'est téléchargé, un chemin absolu est nécessaire, comment copier un chemin, et le sélecteur de fichiers optionnel.
Je vais analyser ce fichier uniquement sur cette machine — rien ne part vers un service cloud, et les noms, numéros de téléphone, adresses et numéros d'identité seront masqués dans le rapport. Veuillez me donner le chemin local absolu, par exemple
/Users/vous/Documents/ledger.xlsxouD:\donnees\ledger.xlsx; séparez plusieurs fichiers par des sauts de ligne. Pour copier un chemin : clic droit sur le fichier → "Copier en tant que chemin" (Windows), ou glissez le fichier dans un terminal / utilisez ⌥⌘C dans le Finder (macOS). Ou dites simplement "choisis les fichiers pour moi" et j'ouvrirai une boîte de dialogue locale.
Suivi :
- L'utilisateur dit "choisis / affiche une boîte de dialogue" → exécutez
python "<skill_dir>/scripts/pick_path.py"(multi-sélection), ou avec--single. Utilisez les chemins imprimés comme entrée. Le code de sortie 2 signifie aucune session graphique — revenez à demander à l'utilisateur de coller les chemins. - L'utilisateur dit "c'est en pièce jointe" mais seule une carte de pièce jointe existe, pas de chemin → gérez selon la section suivante. Ne lisez pas silencieusement la pièce jointe.
- Après réception des chemins, validez : le chemin existe, l'extension est prise en charge, nombre de fichiers raisonnable (groupez par type au-dessus d'environ 10 fichiers).
Quand l'utilisateur a déjà déposé une pièce jointe
Indiquez le risque avant d'accepter quoi que ce soit :
Une chose à signaler : un fichier déposé dans le chat peut déjà être stocké sur les serveurs de la plateforme, donc ce chemin n'est plus purement local. Si ce fichier est confidentiel ou contient des données personnelles, envoyez-moi plutôt son chemin local et je le lirai depuis le disque — rien ne quitte cette machine.
Si l'utilisateur veut toujours la pièce jointe, procédez, mais étiquetez honnêtement la livraison : "l'entrée provient d'une pièce jointe du chat, qui a pu atteindre les serveurs de la plateforme" — n'appelez jamais une pièce jointe "totalement locale".
Étape 2 — Laissez l'utilisateur choisir un mode
Deux options ; l'utilisateur doit choisir. Si non spécifié, utilisez Normal et indiquez le mode dans la première ligne de la réponse.
| Normal (par défaut) | Strict | |
|---|---|---|
| Contenu du rapport | Structure + statistiques + aperçu masqué (premières N lignes, extraits de corps) | Métriques agrégées uniquement : lignes/colonnes, types, taux non vide, nombre de valeurs distinctes, plage, moyenne |
| Texte brut | Le texte masqué entre dans le rapport, visible par le modèle | N'apparaît jamais ; le modèle ne voit que les métriques |
| Convient à | Données internes générales, interprétation sémantique, conclusions écrites | Dossiers clients, paie, données médicales, contrats, documents classifiés |
| Coût | Le contenu masqué entre dans le contexte d'inférence | Aucun jugement sémantique possible, réponses uniquement statistiques |
Libellé :
Choisissez un mode : ① Normal — structure, statistiques et un aperçu masqué pour que je puisse lire le contenu et tirer des conclusions ; ② Strict — métriques uniquement, aucun texte original dans le rapport. Par défaut : Normal.
Masquage obligatoire (tous les modes, ne peut pas être désactivé)
Le masquage n'est pas une option, c'est un comportement par défaut. Le script n'a pas d'interrupteur, et --mode strict ne signifie pas "le masquage est facultatif" — strict ajoute "aucun texte original" par-dessus le masquage.
| Catégorie | Champs couverts | Résultat |
|---|---|---|
| Nom | nom, titulaire du compte, contact, représentant légal, propriétaire, responsable, gestionnaire de compte, demandeur, bénéficiaire, titulaire de carte, actionnaire | [NOM#1] |
| Coordonnées | mobile, fixe (avec indicatif), fax, e-mail | [TEL#1] / [EMAIL#1] |
| Adresse | adresse, résidence, adresse postale, adresse enregistrée, domicile | Province/ville conservée, le reste devient [ADRESSE#1] ; --mask-region masque aussi la région |
| Identité | carte d'identité nationale (18/15 chiffres), passeport, permis de voyage, carte d'officier, code unifié de crédit social | [ID#1] |
| Financier | carte bancaire, numéro de compte, numéro de carte | [COMPTE#1] |
| Autres identifiants | plaque d'immatriculation, n° client, n° employé, n° membre, n° étudiant, n° sécurité sociale, n° police | [PLAQUE#1] / [IDNO#1] |
Trois principes d'implémentation, à citer dans la note de livraison :
- Pseudonymes stables. La même valeur source correspond toujours au même pseudonyme dans une même exécution. "Zhang apparaît 3 fois" devient "
[NOM#1]apparaît 3 fois" — le comptage, la déduplication et les jointures fonctionnent toujours, l'identité ne survit pas. - Aucune correspondance sur disque. La correspondance valeur-pseudonyme vit uniquement en mémoire. Ni
report.mdnimanifest.jsonne la contiennent ; seuls les nombres de correspondances sont écrits. - Heuristiques pour le texte libre. Les tableaux structurés sont classés par en-tête de colonne et masqués colonne par colonne. Le texte libre dans les corps, PDF et diapositives repose sur des expressions régulières et un lexique de noms de famille ("contact : Zhang San", "M. Zhang"). Les heuristiques peuvent échouer — surtout pour des noms isolés sans indice contextuel. Dites-le clairement ; ne prétendez jamais "tout est détecté".
Le fait de conserver province/ville est intentionnel : cela permet une analyse au niveau régional sans exposer l'adresse complète. Utilisez --mask-region lorsque la région elle-même est sensible.
Étape 3 — Extraction locale
python "<skill_dir>/scripts/local_extract.py" "/chemin/vers/ledger.xlsx" "/chemin/vers/rapport.docx" \
--workspace ".local_analysis"
Ajoutez --mode strict pour le mode strict ; --mask-region pour masquer les régions ; --redact "EMP\\d{6}" (répétable) pour des motifs personnalisés.
Sorties (toutes dans --workspace) :
report.md— profil structural masqué + statistiques + aperçu ; la seule entrée pour le reste de l'analysemanifest.json— liste des fichiers, SHA-256, mode,masking.enabled=true, nombres de correspondances de masquage,network_used: false
La console imprime par fichier : type, taille, champs masqués, nombres de correspondances et "requêtes réseau : 0". Lisez report.md avec le lecteur de fichiers local ensuite ; ne remplacez pas par des captures d'écran ou OCR en ligne.
Étape 4 — Calculer localement, jamais mentalement
Sommes, ratios, nombres distincts, tris, regroupements, variations périodiques : toujours calculés par un script local. Sans voir toutes les données, les estimations du modèle sont presque toujours erronées. Réutilisez parse_xlsx / parse_delimited / Masker de local_extract.py dans un script jetable, calculez, puis écrivez les chiffres dans le rapport. Les pseudonymes peuvent être regroupés et comptés directement — pas besoin de les inverser.
Étape 5 — Produire un certificat d'audit
python "<skill_dir>/scripts/local_audit.py" ".local_analysis" --note "traité localement, rien téléchargé"
Le certificat d'audit comporte cinq parties : intégrité du fichier source (re-vérification du hash prouvant la lecture seule, aucune copie), exécution du masquage (état des commutateurs, catégories, correspondances dans cette exécution), inventaire des artefacts, vérification ligne par ligne des règles rouges, conclusion. Code de sortie 0 = succès, 1 = un fichier source a changé pendant le traitement.
Étape 6 — Rapport
Conclusion d'abord, données ensuite, une phrase de clôture :
Cette analyse s'est entièrement déroulée sur cette machine sans aucun service cloud impliqué ; les fichiers sources étaient en lecture seule et inchangés, et le rapport masque les noms, numéros de téléphone, adresses et numéros d'identité (pseudonymes stables). Les artefacts se trouvent dans
.local_analysis/, le certificat d'audit dansaudit.md.
Règles rouges (jamais déclenchées)
| Catégorie | Interdit | Outils typiques |
|---|---|---|
| Documents cloud | Créer, importer ou "éditer" une feuille de calcul/document en ligne | Connecteurs Tencent Docs, Kingsoft Docs, Feishu Docs |
| Drives cloud / stockage objet | Télécharger des fichiers ou artefacts | Tencent Drive, WeDrive, stockage de fichiers cloud |
| Bases de connaissances | Écrire dans une bibliothèque, ingérer des URLs | téléchargement de bibliothèque, base de connaissances ima |
| Recherche externe | Utiliser le texte source ou des fragments comme requête | recherche web, scraping de page |
| Conversion en ligne / OCR | Conversion PDF en ligne, décompression en ligne, reconnaissance d'image en ligne | tout outil en ligne, API de compréhension d'image |
| Envoi sortant | Envoyer des fichiers ou résumés vers chat, e-mail, bots | messages WeCom, e-mail, téléchargement de notes de réunion |
Une seule exception : l'utilisateur dit explicitement "celui-ci peut être téléchargé / envoyé". Même dans ce cas, répétez-le et obtenez une deuxième confirmation avant d'agir.
Chemin local par type de fichier
| Type | Chemin local privilégié | Notes |
|---|---|---|
.xlsx .xlsm | local_extract.py (zip + XML directement) | Multi-feuilles, masquage au niveau colonne ; les dates peuvent apparaître sous forme de nombres sériels |
.csv .tsv .txt .md .json .html | local_extract.py | Détecte UTF-8 / GB18030 et délimiteur ; CSV masqué par en-tête |
.docx .pptx | local_extract.py (zip + XML directement) | Paragraphes, plan hiérarchique, tableaux, puces par diapositive ; corps via masquage de texte libre |
.pdf | local_extract.py | Utilise un CLI workbuddy-pdf local s'il est présent, fallback zlib intégré sinon |
.png .jpg .gif .bmp .webp | local_extract.py | Format, dimensions, hash uniquement ; OCR local uniquement si tesseract existe |
.xls .doc .ppt binaires anciens | Demander à l'utilisateur de ré-enregistrer localement, ou ouvrir dans un éditeur local | Ne jamais envoyer vers un convertisseur en ligne pour extraire le contenu |
| PDF scanné / texte dans les images | OCR local, ou l'utilisateur dicte le contenu | Si pas d'OCR, indiquez honnêtement la lacune — ne passez pas par le cloud |
Images en particulier : sans tesseract, traitez-les uniquement comme métadonnées et dites "le contenu de l'image n'a pas été reconnu", en proposant deux solutions locales (installer OCR et réexécuter / l'utilisateur le décrit). Ne "jetez pas un œil" avec un modèle de vision — cela pousse l'image dans le chemin d'inférence et contredit la demande de l'utilisateur.
Règles de dégradation
- Le script local peut l'analyser → utilisez la sortie du script.
- Aucun texte extractible (scan, format ancien, crypté) → expliquez pourquoi, proposez des alternatives locales (ré-enregistrer localement, OCR local, dictée par l'utilisateur).
- L'utilisateur insiste pour "des résultats maintenant" → revenez à la question du mode : "compte tenu de l'état actuel, je ne peux répondre que statistiquement — acceptable ?"
Erreurs courantes
- Sauter la demande de chemin et analyser directement une pièce jointe du chat : viole l'Étape 1.
- Coller tout le contenu de
report.mddans la réponse : le rapport est le document de travail ; les réponses portent les conclusions et les chiffres clés. - Croire que le mode strict rend le masquage inutile : les deux dimensions sont indépendantes.
- Imprimer des valeurs non masquées dans la console ou un fichier temporaire "pour voir les données" : le masquage doit avoir lieu avant que quoi que ce soit soit écrit.
- Estimer au lieu de calculer localement : les estimations sont presque toujours erronées à l'échelle des données complètes.
- Envoyer
.xlsvers un convertisseur cloud "pour plus de commodité" : viole une règle rouge ; ré-enregistrez localement à la place. - Ignorer l'encodage : lire un CSV GB18030 en UTF-8 produit du mojibake qui pollue le profil des colonnes. Le script le gère ; le code écrit à la main doit aussi le faire.
Note sur les langues
Les règles de détection ciblent les formats de données en langue chinoise (numéros d'identité nationale, adresses province/ville, noms de famille chinois) ainsi que des motifs génériques (e-mail, téléphone, carte bancaire, plaque). Les rapports et la sortie console sont actuellement en chinois ; la logique de détection est indépendante de la langue là où les motifs le permettent. Pour les documents uniquement en anglais, le masquage des tableaux structurés fonctionne toujours via les en-têtes de colonnes, mais la détection des noms dans le texte libre est faible — dites-le plutôt que de promettre trop.