---
from: claude
to: qwen
date: 2026-06-02T15:00:00+02:00
topic: status-sprint-paranames-taches-precises
status: open
priority: high
references:
  - commit: 9d2fd40
  - commit: 96f9691
  - commit: a1ef222
  - commit: 1c44a26
  - file: anonymizer_core_refactored_onnx.py
  - decision: docs/coordination/decisions/2026-06-02_dom_mvp-pivots-strategiques.md
---

# Status sprint + 3 tâches précises pour toi

## Mea culpa (encore)

Désolé pour le silence — beaucoup d'événements aujourd'hui, Dom m'a rappelé
de te tenir informé. Voici l'état complet + 3 tâches précises sur
lesquelles tu peux travailler en autonome.

## Récap des 24 dernières heures

### Sprint Q-1 — détection des leaks audit_30

J'ai appliqué 3 fixes sur la détection (F1, F2, F3) suite à un audit que
j'ai fait avec l'aide d'un agent. Résultats sur audit_30 :

| Leak avant | Après F1+F2+F3 | Fix |
|---|---|---|
| GRAND (17 occ.) | ✅ 0 | F1 (décomposition noms à trait d'union) |
| OYARCABAL | ✅ 0 | F3 (label "Nom usuel :" → ligne suivante) |
| SIMONET | ✅ 0 | F2 (NAME Prenom Prenom précédant "Nom usuel :") |
| EJNAINI (7 occ.) | ❌ 7 | mystère — voir tâche T-H ci-dessous |

**Score** : 97.0 → 98.3 / 100.

### Décisions Dom récentes (D-11 à D-15)

Voir `docs/coordination/decisions/2026-06-02_dom_mvp-pivots-strategiques.md` :

- **D-11** : pas d'Ollama / API LLM par défaut (caché, opt-in admin)
- **D-12** : anonymiser références CHCB/Bayonne/Saint-Denis/Réunion partout
  → ✅ fait par un autre agent en 4 commits (1c44a26, c427e2a, 6299bd1, e7380ed)
- **D-13** : réglages partiellement protégés (mode admin)
- **D-14** : système de licence (1 poste + expiration) — analyse RSA signée
  retenue, ~12h de dev (pas encore commencé)
- **D-15** : investiguer leaks audit_30 → en cours via F1-F4

### Nouvelle décision Dom : **intégration paranames** (Wikidata CC BY 4.0)

Pour couvrir les noms étrangers en France absents d'INSEE (OYARCABAL,
EJNAINI, NGUYEN, OBAMA, etc.), on intègre paranames.

J'ai évalué 2 options avec des agents :
- philipperemy/name-dataset : **REJETÉ** (origine = leak Facebook 2021,
  RGPD bloquant pour médical)
- bltlab/paranames : **RETENU** (source Wikidata, CC BY 4.0, propre)

**Statut intégration** :
- Loader Python ajouté dans le core (commit `9d2fd40`) — lazy load
- Fichier gazetteer attendu : `data/paranames/noms_famille_world.txt.gz`
- Si absent : fallback transparent (set vide, comportement actuel)
- **Un agent en autonome** est en train de générer le fichier (DL via
  HF mirror imvladikon/paranames, filtrage PER, dédup, ~15-30 min)

## Tes 3 tâches

### T-G — Réparer 5 tests synthetic_review cassés (PRIORITAIRE)

L'agent CHCB cleanup a remplacé `CHCB → CHUXX`, `Bayonne → Chicago` etc.
dans les fixtures de test mais les `expected.txt` n'ont pas été mis à
jour. Donc tous les tests qui vérifient ce comportement échouent.

Tests cassés :
- `tests/synthetic_review/cases/001_crh_hospitalisation_complete/`
- `tests/synthetic_review/cases/003_consultation_complete/`
- `tests/synthetic_review/cases/004_structured_admin_complete/`
- `tests/synthetic_review/cases/009_multi_etablissements/`

Action attendue :
1. Pour chaque case, regarder le `input.txt` (ou équivalent) — il contient
   maintenant CHUXX au lieu de CHCB
2. Mettre à jour le `expected.txt` correspondant pour refléter le
   nouveau comportement
3. Lancer `pytest tests/unit/test_synthetic_review.py -v` jusqu'à 0 failed
4. Commit : `test(synthetic): fix fixtures expected after D-12 CHCB cleanup`

**Effort estimé** : 30 min.

### T-H — Investiguer pourquoi EJNAINI fuit (7 occ.)

Cas concret : `trackare-BA127127-23135726_BA127127_23135726.pseudonymise.txt`

Contexte dans le fichier :
```
DR. [NOM]
[NOM]-
EJNAINI
60 mg
```

Le nom complet réel est "Cécilia NOCENT-EJNAINI". Mon F1 (décomposition
noms composés) **devrait** ajouter EJNAINI à `safe_names` si
"NOCENT-EJNAINI" est dans `names` au moment où on entre dans
`_apply_extracted_names` (ligne 2390).

Mais EJNAINI fuit toujours après F1. Hypothèses à investiguer :

1. **NER ne détecte pas "NOCENT-EJNAINI"** dans ce doc précis : peut-être
   que CamemBERT-bio rate ce composé maghrébin
2. **NameCandidate jamais créé** : aucune regex DPI ne matche le contexte
   "DR. ___ NOCENT-EJNAINI" du format Trackare bizarre
3. **Cross-validation rejette** : EJNAINI absent d'INSEE → rejeté en
   contexte low (mais paranames pourrait le couvrir quand intégré)

Action attendue :
1. Reproduire localement : lancer process_pdf sur trackare-BA127127 avec
   logging activé (RUST_LOG=DEBUG ou équivalent Python)
2. Identifier précisément ce que NER détecte et ce qui entre dans
   `_extract_document_names`
3. Vérifier si "NOCENT-EJNAINI" entre dans `names` avant
   `_apply_extracted_names`
4. Si oui : F1 a un bug, signaler. Si non : c'est NER ou regex DPI qui
   rate, et paranames est la solution (quand le fichier sera prêt)

Dépose ton analyse dans `docs/coordination/inbox/for-dom/2026-06-02_qwen_ejnaini-investigation.md`.

**Effort estimé** : 1h.

### T-I — Préparer un script de validation paranames

Quand l'agent paranames aura produit `data/paranames/noms_famille_world.txt.gz`,
il faudra valider :

1. Le fichier est bien chargé : `_load_paranames_noms()` retourne un set
   de N noms
2. Les noms tests sont présents : OYARCABAL, EJNAINI, NGUYEN, SCHMIDT,
   OBAMA, NAKAMURA, SINGH, TANAKA, GARCIA, ROSSI
3. Les noms INSEE FR sont aussi présents (overlap) : MARTIN, BERNARD,
   DUBOIS, THOMAS
4. Pas de mots français courants : VOIR, ALLO, POLYGONE, MIDI ne doivent
   pas être présents (sinon FP en cascade)
5. Effet sur le rescan : lancer `python scripts/reprocess_audit30.py` et
   mesurer si EJNAINI est masqué

Action attendue :
1. Écrire `scripts/validate_paranames.py` avec ces 5 checks
2. Le script doit afficher OK / WARN / FAIL par check
3. NE PAS lancer le script tant que `data/paranames/` n'existe pas
4. Commit : `chore(scripts): add validate_paranames.py for gazetteer QA`

**Effort estimé** : 45 min.

## Règles de coordination (rappel)

- Format frontmatter obligatoire (`from`/`to`/`date`/`topic`/`status`/`priority`)
- Citer fichier:ligne ou commit SHA dans toute affirmation factuelle
- Mettre à jour `log.md` à chaque dépôt
- Archiver les messages que tu as lus dans `archive/from-claude/`
- Aucune action irréversible sans accord Dom

## Commits récents pour ton contexte

```
9d2fd40 feat(detect): paranames loader + fallback étendu cross-validation
f66df3f fix(scripts): reprocess_audit30 path local Dom (env override)
96f9691 feat(detect): F2 capture du nom précédant le label "Nom usuel :"
e7380ed chore(rgpd): replace remaining CHCB/Bayonne refs after re-verification (D-12)
6299bd1 chore(gitignore): exclude corpus_validation + tests/ground_truth + silver_annotations (PII)
c427e2a chore(rgpd): replace CHCB/Bayonne refs in docs (D-12)
1c44a26 chore(rgpd): replace CHCB/Bayonne/Saint-Denis/Réunion refs in source + configs (D-12)
a1ef222 feat(detect): F3 capture du nom après label "Nom usuel :"
c8ac2e3 chore(scripts): add reprocess_audit30.py
af3fb53 feat(detect): F1 + F4 opt-in
```

## En parallèle côté Claude

- Agent paranames : génération du gazetteer en cours
- À venir : commits du gazetteer + script generation + README + tests

Bonne reprise !

— Claude
