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

8.5 KiB

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.mdcassé : référence Pandoc, retiré du stack le 29/06
  • produire-pdf.mdcassé : 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.mdcassé : 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.