# Hub public de skills Hermes (skills.sh) — identifiants, scanner de sécurité, override manuel **Date** : 2026-08-20 **Sphères concernées** : hermes-tt, hermes-nyora, hermes-perso ## Contexte Vidéo Dr Firas sur Hermes (Mem0, Caveman, Defuddle, Marketing Skills, Humanizer). Vérification préalable : le produit qu'il décrit est bien le nôtre, pas une simple analogie — confirmé en direct sur hermes-agent-tt (Hermes Agent v0.20.0, build 2026.8.3, image nousresearch/hermes-agent:v2026.8.3, CLI /opt/hermes/.venv/bin/hermes). ## Ce qui a été fait - **humanizer** (les 3 instances) : 2.5.1 (builtin, ported, figé à la sortie de l'image) -> 2.11.2 (amont), généralisé sur tt/nyora/perso à la demande de Nabil. Verdict scanner SAFE sur les 3 (2 faux positifs "injection" récurrents sur des exemples pédagogiques internes à la skill, sans conséquence). - **caveman** (hermes-tt, test) : installé. Verdict SAFE, aucun finding. - **product-marketing** (hermes-nyora) : installé, comblait un vrai manque (socle marketing absent). Verdict SAFE. - **ai-seo** (hermes-nyora) : verdict automatique DANGEROUS (3 findings) — installé manuellement après revue complète. Voir section dédiée ci-dessous. - Pack marketingskills (49 skills) : PAS installé en entier — nyora avait déjà copywriting/seo-audit/content-strategy/social/dr-nexum-production en local, doublon évité. - **defuddle** : pas installé — nyora-veille couvre déjà le nettoyage web ; node/npm présents dans les conteneurs (le piège CLI-absent de la vidéo ne s'appliquait pas ici) mais aucun besoin identifié. - **Mem0** : pas ré-évalué — déjà tranché le 18/08 (évaluation théorique seule, plafond 43 conteneurs NAS respecté, 0 déploiement). Mémoire native confirmée lexicale (FTS, state.db 272 Mo sur hermes-tt, provider: ''), même limite que le trigger notes_fts cassé sur nyora-notes-tt — les deux à traiter ensemble dans une session dédiée. ## Humanizer 2.11.2 — remplacement des tirets déjà natif (règle 14) Demande Nabil : généraliser humanizer + lui faire remplacer les tirets "qui sautent aux yeux". Vérifié avant d'ajouter quoi que ce soit : la version 2.11.2 couvre déjà ça nativement et en détail (règle §14 "Em and en dashes") — interdiction des tirets cadratins/demi-cadratins (— / –) sauf si l'échantillon d'écriture de l'utilisateur les utilise déjà, remplacement par point/virgule/deux-points/parenthèses ou reformulation, détection aussi des doubles-tirets ASCII (--) et tirets espacés, avec une étape de vérification finale (recherche de — et – avant de rendre le texte). Rien ajouté côté custom pour ne pas dupliquer/entrer en conflit avec la règle amont — si elle se révèle insuffisante en usage réel (le rewrite laisse encore passer des tirets), le signaler pour ajuster plutôt que d'empiler une règle redondante. **Point d'attention pour la suite** : cette version vient d'un fetch URL directe, donc un futur --force réappliquera l'amont sans changement particulier de notre part (pas de customisation locale à perdre). Si un jour on personnalise le contenu du SKILL.md directement, le documenter ici — un --force futur écrasera silencieusement toute modification manuelle non trackée par un identifiant hub. ## ai-seo — DANGEROUS bloqué, installé manuellement après revue complète Verdict automatique DANGEROUS, 3 findings, --force refuse ("Blocked ... --force does not override a dangerous verdict" — contrairement au CAUTION du 13/08 sur last30days, aucun override CLI n'existe pour ce palier). Revue complète effectuée avant toute décision : SKILL.md (494 lignes) + les 6 fichiers references/ (761 lignes), soit 1255 lignes au total, grep systématique sur les patterns d'exécution/exfiltration réels (curl, wget, rm -rf, sudo, eval/exec, os.system, subprocess, base64, ignore previous/all, system prompt, api_key, ssh, .env, bearer, authorization, password) — aucune occurrence. Les 3 findings sont confirmés faux positifs de pattern-matching statique sur du contenu marketing bénin : - persistence CRITICAL sur une phrase mentionnant llms.txt/AGENTS.md comme convention de fichier (aucune modification de config agent réelle) - exfiltration HIGH sur la phrase générique "Include local context where relevant" (conseil de rédaction, pas de données) - traversal MEDIUM sur un lien markdown relatif ../../tools/REGISTRY.md vers un fichier du même repo Décision Nabil (20/08) : "la meilleure solution technique, à toi de voir" — installation manuelle réalisée après cette revue complète (pas juste les lignes flaguées), pas de contournement du scan lui-même (le CLI ne le permet structurellement pas). **Solution technique appliquée** : 1. Fetch direct des 7 fichiers (SKILL.md + references/*.md) depuis raw.githubusercontent.com 2. Placement manuel dans /opt/data/skills/ai-seo/ (structure identique à celle qu'aurait produite un install réussi), chown root:root pour matcher la convention des skills installées normalement par le process Hermes 3. Entrée ajoutée à la main dans /opt/data/skills/.hub/lock.json avec scan_verdict="dangerous_manual_override" (valeur volontairement non-standard) et le détail des 3 findings + leur évaluation en metadata/scan_provenance — traçabilité complète de l'override pour tout audit futur 4. Effet observé : `hermes skills list` affiche la skill en Source/Trust "local"/"local" plutôt que "skills.sh"/"community" — comportement jugé correct et volontairement laissé tel quel : l'outil ne peut pas prétendre à une provenance hub-vérifiée pour un contenu qui a contourné son propre scan. "local" est la représentation honnête ici, pas un bug à corriger. **Reproductible pour un futur cas DANGEROUS jugé faux positif** : ``` # 1. Fetch et revue complete (pas seulement les lignes flaguees) curl -sS https://api.github.com/repos///contents/skills/ # recuperer SKILL.md + tous les fichiers references/ lies, grep patterns dangereux reels # 2. Placement mkdir -p /opt/data/skills//references cp /opt/data/skills// chown -R root:root /opt/data/skills/ # 3. Entree lock.json (voir schema complet dans /opt/data/skills/.hub/lock.json, # entree ai-seo du 20/08 comme modele) -- scan_verdict explicite non-standard, # findings + evaluation en metadata, jamais maquiller en verdict "safe" ``` ## Piège : l'identifiant hub owner/skills/name suppose une structure de repo précise hermes skills search retourne un identifiant skills-sh/// qui fonctionne pour l'inspect mais peut échouer au fetch réel à l'install : Error: Could not fetch '...' from any source. — sans autre détail. Cause : le résolveur attend SKILL.md sous skills// dans le repo source ; certains repos (blader/humanizer) ont leur SKILL.md à la racine. **Ce qui ne fonctionne pas** : hermes skills install skills-sh/blader/humanizer/humanizer (et variantes) -> fetch échoue silencieusement. **Solution validée** : vérifier la structure du repo (curl -sS https://api.github.com/repos///contents/) puis installer par URL directe : hermes skills install https://raw.githubusercontent.com///main/SKILL.md --name --category --force --yes (--force sert ici à passer le prompt si le scan revient SAFE/CAUTION, pas à outrepasser un DANGEROUS.) ## Vérification docker exec hermes-agent- grep -m1 version /opt/data/skills/creative/humanizer/SKILL.md docker exec hermes-agent-tt /opt/hermes/.venv/bin/hermes skills list | grep -i caveman docker exec hermes-agent-nyora /opt/hermes/.venv/bin/hermes skills list | grep -iE "product-marketing|ai-seo" ## Références - Repo humanizer : https://github.com/blader/humanizer (version amont vérifiée : 2.11.2) - Repo caveman : https://github.com/juliusbrussee/caveman - Repo marketingskills : https://github.com/coreyhaines31/marketingskills - Précédent scanner CAUTION/--force : note NyoraNotes 38330f3b (13/08, last30days-skill) - Décision Mem0/plafond conteneurs : note NyoraNotes be9c5934 (18/08)