nas-runbooks/common/skills-concurrents-pdf-docx...

173 lines
11 KiB
Markdown

# Skills locaux concurrents à nyora-doc-api — PDF/DOCX/PPTX/XLSX
**Date** : 2026-07-02
**Sphères concernées** : hermes-tt, hermes-nyora, hermes-perso (les 3)
## Problème
Chaque instance Hermes embarque des skills locaux génériques (python-docx,
python-pptx, reportlab/pdfplumber, openpyxl, ou pire : Pandoc/Gotenberg côté TT)
dont la description recoupe un besoin déjà couvert par le service centralisé
**nyora-doc-api** (port 3050). Un skill local bien décrit gagne quasi toujours
la sélection face à un appel API explicite → documents produits hors charte
Nyora (palette non-Or-Bruni, pas de footer obligatoire, police/mise en page
non maîtrisées), ou pire, skill cassé référençant des outils retirés du stack.
Découvert et confirmé le même jour sur 3 documents réels :
- PPTX (hermes-perso) : titre 34pt sur bandeau à hauteur fixe → chevauchement.
- DOCX (hermes-perso) : `PMI_Infinity_Formation_PMP.docx` généré via python-docx
brut (metadata `dc:creator=python-docx`), palette bleu/ambre au lieu d'Or Bruni,
aucun footer Nyora.
- PPTX (hermes-perso, 2e cas) : `MacBookPro_64Go_Prix_Comparatif` — défaut
visuel non lié au moteur mais révélant l'absence de boucle QA
render→image→inspection avant livraison.
## Skills désactivés (déplacés vers `.archive/document-skills-desactive-20260702/`, pas supprimés)
**hermes-perso** (`data/skills/`) :
- `productivity/document-processing/` — PDF (nano-pdf/reportlab), PPTX (python-pptx), DOCX (python-docx) en un seul skill générique
- `excel-python-skill.md` — génération XLSX via openpyxl
- `productivity/document-skills/pptx-presentation/` (déjà désactivé le matin même, pour mémoire)
**hermes-tt** (`data/skills/`) — sprawl le plus important, plusieurs skills obsolètes/cassés :
- `docx/` — copie du skill public Anthropic docx (générique)
- `docx-generation/` — générateur docx-js
- `excel-automation/` — Claude Office Skill Excel générique
- `pdf/` — génération PDF (reportlab/pdfplumber/pypdf)
- `excel-python-skill.md` — génération XLSX via openpyxl
- `generation-pptx.md` — routait PPTX/DOCX/tableau directement vers MiniMax M2.5, sans passer par nyora-doc-api
- `produire-docx.md`**cassé** : référence Pandoc, retiré du stack le 29/06
- `produire-pdf.md`**cassé** : référence Pandoc + Gotenberg, tous deux retirés du stack
**hermes-nyora** (`data/skills/`) :
- `productivity/powerpoint/` — génération PPTX générique
- `excel-python-skill.md` — génération XLSX via openpyxl
- `production-document.md`**cassé** : pipeline veille référençant Pandoc (PANDOC_URL) + Gotenberg (GOTENBERG_URL), tous deux retirés du stack ; bypassait nyora-doc-api par conception
## Ce qui a été conservé (pas des concurrents)
- `hermes-tt/data/skills/pdf-extraction/` — lecture seule (pdfplumber), pas de génération
- `hermes-tt/data/skills/style-mail-xlsx.md` — spécification de style (palette, règles de mise en forme XLSX/mail HTML Zone Sud), aucun code de génération : c'est une référence de charte, pas un moteur. À terme, ces règles devraient être lues par nyora-doc-api plutôt que dupliquées ailleurs.
- `.agents/skills/ppt-visual` (hermes-tt) — conseil de design visuel, pas un générateur de fichier.
## Méthode appliquée (identique au fix pptx du matin)
1. `mkdir -p data/skills/.archive/document-skills-desactive-20260702/`
2. `mv <skill concurrent>` vers ce dossier (déplacé, jamais supprimé)
3. Suppression du cache `.skills_prompt_snapshot.json` (racine `data/` et `data/.hermes/`) pour forcer la régénération de l'index au redémarrage
4. **Reste à faire manuellement** : redémarrer les 3 containers `hermes-agent-tt`, `hermes-agent-nyora`, `hermes-agent-perso` (via Portainer ou n8n Execute Command — le CLI docker n'est pas installé dans le conteneur mcp-nas, donc impossible de le faire depuis cette session)
## Règle générale (déjà actée, reconfirmée)
Avant tout diagnostic "l'IA n'utilise pas le bon outil" sur une tâche documentaire :
vérifier en priorité l'existence d'un skill local concurrent sur l'instance concernée
(mots-clés à chercher : docx, pptx, xlsx, pdf, python-docx, python-pptx, openpyxl,
reportlab, pandoc, gotenberg). Un skill générique bien décrit gagne quasi toujours
la sélection face à un appel API qu'il faut connaître explicitement.
## Prévention
Après toute résolution de ce type, capitaliser immédiatement (mémoire + ce runbook +
NyoraNotes) — ne pas attendre une 3e récidive pour généraliser.
---
## 2e vague — 2026-07-04 (audit systématique des 3 instances)
Audit complet des `data/skills/` (recherche par noms de fichiers/dossiers +
grep des moteurs : python-docx, python-pptx, openpyxl, reportlab, pptxgenjs,
docx-js, pandoc, gotenberg, pymupdf, fpdf, weasyprint). 5 concurrents
supplémentaires trouvés, dont 4 cassés (références Pandoc/Gotenberg retirés).
### Skills désactivés (déplacés vers `.archive/document-skills-desactive-20260704/`)
**hermes-tt** (`data/skills/`) :
- `productivity/powerpoint/` — skill PPTX public Anthropic complet (« Create, read, edit .pptx », pptxgenjs + schémas OOXML). Générateur générique passé sous le radar le 02/07 : l'équivalent avait été archivé sur nyora mais pas sur tt.
**hermes-nyora** (`data/skills/`) :
- `research/technology-watch-professional-docs/` — « creation of professional documents for executive audiences » : conversion DOCX via `$GOTENBERG_URL` (retiré du stack le 29/06). Concurrent par description ET cassé.
- `research/market-intelligence/` — étape de livraison « MD to DOCX » via Pandoc (retiré) + référence `pandoc-techniques.md`. La méthodologie de recherche est récupérable en réécrivant un skill sans pipeline documentaire si le besoin revient.
- `productivity/file-sharing-workflow/` — description explicite « document creation, conversion, and secure sharing » : sections Pandoc API + Gotenberg (tous deux retirés). Le partage de fichiers reste couvert par `partage-pingvin.md` (racine skills), qui lui n'est pas concurrent.
**hermes-perso** (`data/skills/`) :
- `flyer-test.md` — pipeline HTML → Gotenberg → PDF (Gotenberg retiré). Générateur PDF générique cassé.
### Conservés après examen (2e vague)
- `generation-contenu-volumineux` (les 3) — méthodologie de construction par étapes, aucun moteur de génération embarqué.
- `productivity/nano-pdf` (tt) — édition de PDF existants uniquement, pas de génération.
- `productivity/docx-rapport-verification` (tt) — vérification/correction de rapports DOCX marchés publics : métier, pas générique.
- `productivity/ocr-and-documents` (les 3) — extraction/OCR, lecture seule. NB : sur nyora il référence encore `related_skills: [powerpoint]` archivé — référence morte, bénigne.
- **À surveiller** — skills métier avec scripts de génération embarqués (génèrent localement hors nyora-doc-api mais restent spécifiques à leur sphère) : `achats/*` (tt : gen-pptx-nyora.py, gen-docx-v3.py, gen-rla-excel.md, build-sfax-excel.py), `fashion_trends` (perso : fallbacks HTML/RTF + fashion-document-generator.py), `research/orientation-universitaire-tunisie` (perso, + copie dans tt/productivity : orientini-veille-pptx.py). À terme, router leur production via nyora-doc-api.
### Post-archivage 04/07
- Caches `.skills_prompt_snapshot.json` purgés (seul tt en avait un, à la racine de `data/`).
- Les 3 agents redémarrés un par un **depuis l'hôte NAS** (`ssh nas` puis `/usr/local/bin/docker restart hermes-agent-<i>`) — contrairement au 02/07 c'est faisable quand la session vient du Mac (le blocage ne concernait que le conteneur mcp-nas). Health = healthy, UI 3010/3020/3030 = 200, ownership `data/` = 1026:100 intact.
---
## Piège découvert 09/07 — cron référençant un skill archivé
Le job cron hermes-perso « Veille Orientini 2026 » (actif, 3x/jour) référençait encore
`pptx-presentation` (archivé le 02/07) comme skill principal + instruction « template
light-theme » dans le prompt. Le job tournait sans erreur (last_status ok) et produisait
ses PPTX en génération locale — exactement le contournement que l'archivage devait empêcher.
Corrigé le 09/07 (GO Nabil) : référence retirée, génération routée vers nyora-doc-api,
procédure docker stop → édition jobs.json → docker start.
**Règle ajoutée à la méthode** : après tout archivage de skill, vérifier les
`cron/jobs.json` des 3 instances (champs `skill`, `skills[]` et le texte du prompt)
sur le nom du skill archivé. Détail : common/audit-data-hermes-20260709.md.
---
## 3e vague — 2026-07-12 (audit périodique des 3 instances)
Même méthode que le 04/07 (recherche par noms + grep moteurs, exécutée via
`ssh nas` depuis le Mac). **1 seul concurrent trouvé, sur hermes-perso.**
### Skill désactivé (déplacé vers `.archive/document-skills-desactive-20260712/`)
**hermes-perso** (`data/skills/`) :
- `productivity/python-pptx-documents/` — générateur PPTX générique complet via
python-pptx, avec sa **propre charte « Navy/Gold »** (palette navy/or maison,
`references/theme-navy-gold.md`) au lieu de la charte Nyora. Déclencheurs très
larges (« User asks to create a PPTX presentation », « Any task ending in
.pptx output ») = concurrent frontal de nyora-doc-api par description.
**Créé le 09/07 à 19h11** — le jour même de la correction du cron Orientini :
l'agent a vraisemblablement capitalisé sa pratique de génération locale en
skill avant/pendant la correction. C'est la démonstration que les archivages
ne suffisent pas : **l'agent peut recréer un concurrent** ; l'audit doit être
périodique.
### RAS ailleurs (3e vague)
- hermes-tt et hermes-nyora : aucun nouveau concurrent. Les conservés des vagues
précédentes sont inchangés (`nano-pdf`, `docx-rapport-verification`,
`ocr-and-documents`, `excel-data-parsing-workflow` = extraction métier CI-CPT,
`document-data-extraction`, `ao-extraction-workflow`, `lire-document.md`,
`style-mail-xlsx.md`).
- Cron vérifiés (règle du 09/07) : aucune référence au skill archivé ; le cron
tt « Brief RLA v3 » génère bien via nyora-doc-api (vérifié dans
`send_brief_pptx.py` : sortie « PPTX (nyora-doc-api): … ») ; le cron perso
« Veille Orientini » contient bien l'instruction nyora-doc-api / « JAMAIS de
génération locale python-pptx » posée le 09/07.
- Aucun `.skills_prompt_snapshot.json` présent (ni racine `data/` ni
`data/.hermes/`) sur les 3 — rien à purger.
- Seul `hermes-agent-perso` redémarré (seule instance modifiée) : healthy,
UI 3030 = 200 (l'UI met ~2-3 min à répondre après le healthy), ownership
`data/` = 1026:100 intact.
### Références mortes signalées (non concurrentes, non archivées)
Gotenberg et Pandoc sont retirés du stack depuis le 29/06 (aucun conteneur ne
tourne), mais restent documentés comme services actifs dans :
- tt `devops/local-services-stack/` (tableaux d'endpoints gotenberg:3000, pandoc:8080)
- nyora `nyora/nyora-project-execution/` (health checks gotenberg/pandoc)
- le cron nyora « Health Check Quotidien » curl encore `172.17.0.1:3001` (Gotenberg)
À corriger à l'occasion — ces skills sont des références infra, pas des
générateurs, donc hors périmètre d'archivage.