dataroom-prep — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited dataroom-prep (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
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.
Déclencher quand l'utilisateur demande de :
Project X - Intitulé du document - yyyymmdd🔒 Les documents et leur contenu ne quittent JAMAIS le PC de l'utilisateur. Toute la persistance se fait en local (workdir + dossier destination) ; rien n'est envoyé vers un serveur externe.
Règles non négociables :
le Top 50 des documents manquants sont 100% hors-ligne (scripts Python, listes DD locales dans data_sources/). Aucun appel réseau n'est requis pour produire une dataroom complète.
extracted.json,ni un titre/chemin issu des documents — vers un outil externe** : pas de Firecrawl, pas de data.gouv, pas de WebSearch/WebFetch, pas de MCP tiers, pas d'upload. Ces données restent strictement dans la session et sur le disque local.
MEMORY.md ni dansles fichiers memory/ qui contienne un nom de société cible, un chiffre, un titre de document ou tout élément du mandat. La mémoire ne sert qu'aux notes de process génériques.
appelle firecrawl_scrape sur le site web public de la société + des sources juridiques (data.gouv / Légifrance / Fedlex). Elle n'envoie QUE l'URL publique et des requêtes secteur/droit — jamais le contenu des documents. Avant de la lancer, prévenir l'utilisateur : « cette étape contacte des serveurs externes (le site public de la société + sources légales) ; veux-tu la lancer ou rester 100% hors-ligne ? ». Si l'utilisateur veut le zéro-réseau total, sauter l'Étape 8 et se contenter du Top 50 local (étape 5bis), qui couvre déjà la liste des documents à demander sans aucune connexion.
extracted.json,decisions.json) dans un workdir temporaire isolé, jamais dans scripts/. Ne pas laisser traîner de fichier contenant des titres/snippets de documents client dans le dossier du skill après le run.
⚠️ RÈGLE DE FLUX : poser TOUTES les questions au tout début, avant de lancer le moindre script. L'objectif est de pouvoir enchaîner l'intégralité du pipeline (extraction → classification → dedup → build → Excel → checklist enrichie) sans interruption ni nouvelle question. Ne PAS découper en « Phase 1 » / « Phase 2 ». La décision sur la checklist enrichie (et ses sous-questions) est demandée ICI, en amont, pas après le build.
Utiliser `AskUserQuestion` pour poser dans cet ordre (regrouper en quelques écrans de questions multiples ; idéalement tout collecter avant la première action) :
toujours posée explicitement** si le chemin n'a pas déjà été donné dans le prompt.
toujours posée explicitement** si le chemin n'a pas déjà été donné dans le prompt. Proposer par défaut un sous-dossier à côté de la source (ex. <dossier parent source>/<Project name>).
TOUJOURS active par défaut, sans confirmation (« bien sûr que oui »). Le nom réel de la société cible + ses marques/filiales/entités liées sont détectés automatiquement par Claude depuis le contenu des documents extraits, puis passés à --scrub de façon strictement interne. Ces noms ne doivent JAMAIS être écrits, affichés, ni dans une question, ni dans le chat, ni dans le raisonnement (cf. RÈGLE ABSOLUE plus bas).
de référence pour le Top 50 des documents manquants (cf. étape 5bis).
Tech / Distribution / Santé / Immobilier / Hôtellerie-Restauration / Transport & Logistique / Agroalimentaire.
Posée ici, dès le début (et non après le build). Si Oui, enchaîner immédiatement dans la même passe de questions les sous-questions de la checklist enrichie :
⚠️ PIÈGE À NE PLUS REFAIRE : ne jamais reporter Q1/Q2/Q3 (chemins + nom de projet) à plus tard sous prétexte que `AskUserQuestion` exige 2 à 4 options et ne fait pas de texte libre nativement. Ces trois questions sont des chemins/texte libre : elles DOIVENT quand même apparaître dans le tout premier envoi de questions, pas dans un second aller-retour. Technique à utiliser : donner 2 options factices qui couvrent les cas réels (ex. pour la destination,"À côté de la source"vs"Autre emplacement"— l'utilisateur tape le chemin réel via l'option "Other", toujours disponible automatiquement) plutôt que d'omettre la question du premier lot. Un lot de questions qui ne contient QUE des choix fermés (langue, pays, secteur…) et laisse le chemin source pour « après » est un flux raté — corriger avant d'envoyer.
Si l'utilisateur a déjà précisé tout ou partie de ces infos dans le prompt, ne pas re-demander. Une fois toutes les réponses collectées, dérouler le pipeline complet sans poser d'autre question.
Lancer scripts/extract.py avec :
--source <path_user> — chemin source--out <skill_workdir>/extracted.json — workdir temporaireLe script :
.pdf .docx .xlsx .pptx .doc .xls .msg.cache, node_modules, _files/)relpath, filename, parent_folder, snippet, readableLancer scripts/classify.py avec :
--extracted extracted.json--language <FR/EN/DE/IT/ES> — langue de la structure--templates templates/folder_structure_<lang>.jsonLe script :
parent_folder + filename + snippet11_Document à trier{Project} - {Theme} - {Subject} - {yyyymm}.{ext}Lancer scripts/dedup.py :
Lancer scripts/build_dataroom.py :
_98_Doublons exacts/_99_Versions anciennes/{N1}/{N2}/Lancer scripts/generate_mapping.py --lang <excel_lang> :
Original | Chemin source | Nouveau nom | Dossier N1 | Sous-dossier N2 | Confiance | Statut dedup | Chemin finalexcel_lang#182E4E, cellules input cyan #72C7E7, police Calibri 9-11 pt⚠️ Ne RIEN re-demander ici. La décision (Oui/Non) et ses 4 sous-réponses (localisation, site web, secteur connu, sources) ont déjà été collectées à l'Étape 1. Se contenter de brancher : - Si l'utilisateur a répondu Non à la checklist → terminer le pipeline après l'Étape 6. - Si l'utilisateur a répondu Oui → enchaîner directement l'Étape 8 avec les réponses déjà en main (localisation, URL site web, secteur connu, sources).
Lancer scripts/enrich_checklist.py :
firecrawl_scrape) → texte de la page d'accueil + about + produits/servicesLe tout sauvegardé au chemin destination user.
Chaque langue a son fichier templates/folder_structure_<lang>.json avec :
Langues supportées : FR, EN, DE, IT, ES. Pour autre langue : utiliser Claude pour traduire les noms à la volée.
| Source | Langue | Type | Statut |
|---|---|---|---|
Firecrawl (firecrawl_scrape) | toutes | Scraping site web | Actif |
data.gouv (mcp__datagouv__*) | FR | Datasets publics français | Actif |
| Légifrance (API publique gratuite) | FR | Lois, codes, jurisprudence | À implémenter (V2) |
| Fedlex (Suisse) | DE/FR/IT | Droit fédéral suisse | À implémenter (V2) |
| OpenLaw | FR | Jurisprudence ouverte | À implémenter (V2) |
Pour V1, focus sur Firecrawl + data.gouv. Les autres en V2.
À la fin du pipeline complet, l'utilisateur trouve dans son dossier destination :
<destination>/
├── <Project name>/ ← dataroom organisée
│ ├── 01_<Informations générales>/ (langue choisie)
│ ├── 02_<Finance>/
│ │ ├── <Bilans annuels>/
│ │ ├── <Facturation commerciale>/
│ │ └── ...
│ ├── 03_<Légal>/
│ │ ├── <NDA & confidentialité>/
│ │ ├── <Brevets>/
│ │ └── ...
│ ├── ... (11 dossiers N1)
│ ├── _98_<Doublons exacts>/
│ ├── _99_<Versions anciennes>/
│ ├── _Rapport DataPrep.xlsx ← mapping + structure + dedup
│ └── _Liste documents à demander.xlsx ← si Phase 2 activée
└── <Project name>.zip ← ZIP livrablePattern obligatoire : `{Project} - {Intitulé réel du document} - {yyyymmdd}.{ext}`
⚠️ RÈGLE ABSOLUE — ANONYMISATION (toujours active, jamais négociée). Le nom réel de la société cible, de ses marques, filiales et entités liées ne doit JAMAIS apparaître nulle part — y compris : - dans les noms de fichiers, sous-dossiers, Excel (y compris colonne « Nom original ») et titres ; - dans tes messages de chat à l'utilisateur ; - dans tes questions (AskUserQuestion ou autres) ; - dans ton raisonnement / réflexion visible, y compris pendant l'étape où tu cherches à identifier ce nom pour le scrubber.>
Seul le nom de PROJET est visible, partout (ex. « la société cible », « Project X »). Ne jamais demander si l'on doit anonymiser : la réponse est toujours oui, implicitement. Lors du titrage IA, décrire le document de façon générique (ex. « entité holding » et non le vrai nom).
>
Détection automatique + filet technique : Claude identifie lui-même les noms réels depuis le contenu extrait (sans jamais les afficher), puis les passe à--scrubderun_pipeline.py, qui retire automatiquement toute occurrence (insensible casse, limites de mots) des noms interdits dans les fichiers/dossiers/Excel générés. Pour éviter que le nom réel transparaisse même dans une commande shell affichée, écrire la liste de scrub dans un fichier local non commenté (--scrub-file <chemin>) plutôt que de l'inliner dans--scrub "..."lorsque c'est possible.
Quatre règles strictes (édictées par l'utilisateur) :
propre déduit du contenu du document (lu via extraction / OCR), pas le nom d'origine. ❌ ... - PV AG fin rem 08 VD - 2024.pdf ❌ ... - StatutsMai2020 - undated.pdf ✅ ... - Procès-verbal AGO cessation rémunération du Président - 20240830.pdf
porte déjà le thème. ❌ ... - Marketing & commercial - Plan marketing ... ✅ ... - Plan marketing 2021-2022.docx
yyyymm / yyyy si le jour/mois est inconnu, ou riensi le document n'a pas de date pertinente).
(viser ~3 à 7 mots, pas de phrase entière ni de sous-clauses). Garder le type de document + l'élément qui le distingue des autres du même type, rien de plus. ❌ ... - Procès-verbal de l'Assemblée Générale Ordinaire Annuelle statuant sur l'approbation des comptes de l'exercice clos le 31 décembre 2020 - 20210630.pdf ✅ ... - PV AGO approbation des comptes 2020 - 20210630.pdf
Format final à retenir : Nom [Projet] + Nom du document (court, descriptif) + yyyymmdd.
Exemples :
Project Hectelion - Extrait Kbis - 20250506.pdfProject Hectelion - Term Sheet signé - 20220428.pdfProject Hectelion - Comptes annuels - attestation de conformité - 20201231.pdfProject Hectelion - Table de capitalisation.xlsx (sans date)Pour les documents en 11_Document à trier (confiance LOW), garder le nom original sans renommage.
Le titre propre ne peut pas être deviné depuis le nom de fichier : il faut comprendre le contenu. Le pipeline procède donc en deux temps :
run_pipeline.py) :pytesseract + Pillow(rendu image puis OCR fra+eng). Avant toute extraction réelle (mode `--source`), le pipeline vérifie automatiquement que `pytesseract`/Pillow/le binaire `tesseract` sont présents et, sinon, tente de les installer tout seul (pip install pytesseract pillow + winget install UB-Mannheim.TesseractOCR sur Windows, brew install tesseract sur macOS, apt-get install tesseract-ocr sur Linux) — silencieux et non bloquant : si l'installation échoue (pas d'admin, pas de gestionnaire de paquets, pas de réseau), le doc est marqué SCANNED_NO_OCR et l'extraction reste gracieuse (pas de crash). Ne jamais sauter cette vérification ni la rendre optionnelle : l'objectif est qu'un maximum de PDF scannés soient lus, à chaque lancement du skill, sans intervention manuelle.
python-docx) et Excel (openpyxl) lus nativement.non couverts par tesseract, rasterise la page en PNG via PyMuPDF puis la lit comme image — OCR visuel) et produit un fichier decisions.json :
{ "<relpath>": { "n1": "03", "n2": "PV Assemblées",
"title": "Procès-verbal AGO ...", "date": "20240830",
"confidence": "HIGH" } }Le pipeline est relancé avec --decisions-json : ces titres/classements surchargent les heuristiques. Le champ date fourni (même vide) est respecté littéralement.
Flux recommandé :
python run_pipeline.py --source ... --extract-only extracted.json # 1. extraire
# 2. Claude lit extracted.json (+ OCR visuel des PDF scannés) -> decisions.json
python run_pipeline.py --source ... --decisions-json decisions.json --make-zip # 3. buildDépendances : pymupdf (requis pour l'extraction enrichie + le rendu OCR visuel) ; pytesseract + Pillow + binaire tesseract pour l'OCR automatique en lot — auto-installés par le pipeline lui-même à chaque lancement s'ils manquent (voir ci-dessus), donc à ne plus jamais demander à l'utilisateur d'installer manuellement en amont.
Après le tri, le rapport Excel gagne un onglet « Documents à demander » : le Top 50 des documents importants MANQUANTS, groupés par catégorie et triés par priorité.
Source : les listes DD de référence Hectelion (issues du SaaS VDR prep), une par pays, avec un onglet par secteur (~344 exigences chacune, colonne Priorité Haute/Moyenne/Basse) :
data_sources/Hectelion - Listes DD - FRANCE.xlsxdata_sources/Hectelion - Listes DD - SUISSE.xlsxMécanique (run_pipeline.py --country FR|CH --sector <onglet>) :
réellement classés dans la dataroom (statut « présents (estimés) » — à revérifier).
Catégorie | Réf. | Document à demander | Priorité | Période | Base légale.Répartition PROPORTIONNELLE obligatoire : les 50 slots sont distribués entre catégories (apportionnement au plus fort reste, pondéré par le nb de manquants de chaque section, min 1 par catégorie représentée), au lieu de tout concentrer sur les grosses sections (Finance). Ex. ~10 Finance, ~7 Juridique, ~6 RH, ~5 Fiscal, ~3 Opérations… À l'intérieur de chaque catégorie, priorité Haute d'abord. Objectif : une demande client équilibrée couvrant tous les volets de la DD.
C'est la version template-driven de la checklist Phase 2 (plus fiable que le scraping) : le pays oriente les obligations légales, le secteur la liste métier.
Toujours appliquer la charte Hectelion (skill hectelion-brand auto-chargé) :
#182E4E, texte blanc, Calibri 11 pt Bold#72C7E711_Document à trierUser: /dataroom-prep
Claude: [Pose TOUTES les questions au début via AskUserQuestion :
Q1 source, Q2 destination, Q3 nom projet, Q4 langue structure,
Q5 langue Excel, Q7 pays, Q8 secteur, Q9 checklist enrichie Oui/Non
(+ si Oui : localisation, site web, secteur connu, sources)]
User: [répond à tout]
Claude: [déroule TOUT le pipeline sans interruption :
extraction → classification → dedup → build dataroom + Excel
→ si checklist=Oui : enrich_checklist.py → scrape + analyse + Excel checklist]
Claude: [livre dataroom + Excel(s) + ZIP]Pour usage automatisé/scriptable, voir scripts/run_pipeline.py qui orchestre les 8 étapes.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.