---
name: seo-audit-semantique
description: |
  Audit de couverture sémantique d'un contenu existant, sans scraping SERP. Compare une page à la carte sémantique qu'elle devrait couvrir, mesure les densités réelles par comptage déterministe, et livre un plan de correction priorisé P0/P1/P2 avec un sidecar JSON versionné qui permet de suivre la page dans le temps.

  Produit : bloc de périmètre (ce qui est auditable selon la source), Surprise Score Sémantique 0-100, verdict de couverture X/11 couches, détail par couche (Attendu × Mesuré × Gap), éléments hors scope à supprimer ou déplacer, plan P0/P1/P2, et delta vs audit précédent (P0 résolus, régressions, évolution du score).

  TOUJOURS utiliser ce skill quand l'utilisateur dit : "audite la sémantique de", "audit sémantique de cette page", "ma page couvre-t-elle [requête]", "compare ce contenu à la carte sémantique attendue", "qu'est-ce qui manque à mon article sur [requête]", "diff sémantique", "audit de couverture sémantique", "ma page ne ranke pas — qu'est-ce qui lui manque", "plan de correction sémantique", "pourquoi cette page ne remonte pas", "qu'est-ce que je dois corriger sur cette page", "re-audite après mes corrections", "est-ce que mes P0 sont réglés".

  Utiliser ce skill dès qu'un contenu existant est fourni (texte collé, chemin de fichier, ou URL) avec une requête cible, même si l'utilisateur ne prononce pas le mot « audit » — par exemple s'il demande simplement pourquoi sa page ne performe pas.

  Pour créer la carte d'une page qui n'existe pas encore, c'est seo-preparation-semantique qu'il faut. Ce skill ne rédige pas : il diagnostique et priorise.
---

# Audit de couverture sémantique

Compare un contenu existant à la carte sémantique qu'il devrait couvrir, et livre un plan de correction priorisé. Aucun scraping de SERP : la référence se construit depuis l'intention de la requête, pas depuis le classement existant.

## Inputs

| Variable | Valeur attendue | Statut |
|---|---|---|
| Requête cible | mot pour mot | Obligatoire |
| Contenu à auditer | texte collé, chemin local, ou URL publique (robots.txt OK) | Obligatoire |
| Pays / langue | FR/FR par défaut | Obligatoire |
| B2B/B2C + rôle | « B2B — CMO SaaS 50p » | Obligatoire |
| Objectif | Lead Gen / Conversion / Expertise | Obligatoire |
| Secteur | nommé | Obligatoire |
| Audience | junior / expert / mixte | Obligatoire |
| Localisation | ville ou « N/A » | Obligatoire |
| Version cible | refonte / update freshness / élargissement / migration | Recommandé |
| Expertise unique | une phrase signature | Recommandé |

S'il manque des variables obligatoires, poser **une seule question groupée**. Sans version cible, `refonte` s'applique et le rapport le mentionne — le modulateur change la priorisation, donc l'hypothèse doit être visible.

## Étape 0 — Déclarer le périmètre avant tout verdict

Les champs structurels (title, meta description, schema.org) n'existent que dans le HTML. Conclure « Gap P0 » sur un champ qu'on n'a pas pu lire est un faux positif, et c'est le piège principal de cet exercice.

| Couche | URL / HTML | Markdown | Texte collé |
|---|---|---|---|
| C1–C5, C7–C9, C11 | ✅ | ✅ | ✅ |
| C6 multimodal | ✅ complet | 🟡 tableaux + liens images | 🟡 tableaux seuls |
| C10 structural | ✅ complet | 🟡 H1/Hn seuls — meta et schema `N/A` | ❌ `N/A` |

Écrire le bloc PÉRIMÈTRE en tête du rapport, avant tout verdict :

```
PÉRIMÈTRE D'AUDIT
Source : Markdown (fichier local)
Couches observables     : 11/11 (dont 2 partielles)
Champs non observables  : C10.meta-description, C10.schema-org
⤷ pour les auditer : fournir l'URL ou le HTML rendu
```

Règles de comptage : une couche entièrement non observable sort du dénominateur ; une couche partiellement observable y reste, seuls ses champs manquants passent en `N/A`. Un champ `N/A` ne produit jamais de P0. Si **tous** les champs structurels sont `N/A`, le plan porte la mention « P0 structurels non évaluables sur cette source » — un plan sans P0 ne doit jamais se lire comme « aucun bloquant ».

## Étape 1 — Générer la carte de référence, à l'aveugle

Faire produire la carte par un sous-agent qui invoque `seo-preparation-semantique` en mode Création, avec **la requête et le profil uniquement**.

Ne jamais lui transmettre le contenu à auditer. S'il le voyait, la carte s'alignerait sur ce qui est déjà écrit : l'audit ne trouverait plus rien et validerait la page par construction. C'est le mode d'échec principal d'un audit conduit par un LLM, et il est silencieux — le rapport a l'air excellent, il ne dit simplement rien de vrai.

Demander au sous-agent de remonter la carte en JSON compact, au format attendu par le script de comptage (voir `references/counting-script.md`). Le contexte principal reçoit ainsi une référence exploitable sans absorber le raisonnement des 13 phases.

**Si l'environnement ne permet pas les sous-agents** : générer la carte dans le contexte principal **avant** d'ouvrir le contenu, et porter dans le rapport l'avertissement « carte de référence produite dans le même contexte que le contenu — risque d'ancrage, gaps possiblement sous-détectés ». Dégradé, mais jamais silencieux.

## Étape 2 — Charger le contenu

Une page, jamais le site. Si l'analyse a besoin d'une vue d'ensemble (cluster, maillage), construire un index léger — URL + title + H1 + meta par page — et raisonner dessus plutôt que de charger les pages entières. La qualité de raisonnement se dégrade à mesure que la fenêtre se remplit, et un audit qui a lu vingt pages juge moins bien celle qu'on lui a demandé d'auditer.

## Étape 3 — Mesurer

Le comptage d'occurrences est arithmétique, et les LLM le font mal. Le script bundlé s'en charge :

```bash
python3 scripts/count_density.py --content <fichier> --map <carte.json> --out mesures.json
```

Le travail sémantique reste au modèle : lister les variantes de surface de chaque entité (flexions, casse, tirets, acronymes, synonymes stricts) et les faux positifs à écarter — `PR` vaut *passage ranking* ou *public relations* selon le contexte, et le script ne peut pas le savoir.

Format d'entrée, options et interprétation de la sortie : `references/counting-script.md`.

## Étape 4 — Diffuser sur les 11 couches

Chaque couche produit trois colonnes : **Attendu** (ce que la carte prescrit) × **Mesuré ou Constaté** (ce que le contenu contient) × **Gap + action** (l'écart et le verbe qui le corrige).

Format détaillé par couche, statuts et régimes de mesure : `references/layers-c1-c11.md`.
Seuils de densité, règles P0/P1/P2 et modulateurs de version cible : `references/scoring-thresholds.md`.

Distinguer dans le rapport ce qui est **compté** (C2, C3) de ce qui est **jugé** (les autres). Sur les couches jugées, chaque verdict cite le passage qui le fonde ou constate son absence — un verdict qualitatif sans citation n'est pas vérifiable par l'utilisateur, donc il ne vaut rien.

## Étape 5 — Écrire la sortie

Deux fichiers à côté du contenu audité, jamais d'écrasement :

```
ma-page.md
ma-page.audit-v1.md      ← rapport lisible
ma-page.audit-v1.json    ← sidecar machine
```

Si un `.audit-v(N-1).json` existe déjà, le charger et ouvrir le rapport sur le delta : évolution du Surprise Score, P0/P1/P2 résolus vs ouverts, **régressions** (entité conforme devenue sous-densifiée), nouveaux hors scope. C'est ce qui rend le suivi possible — sans identifiants stables, un re-audit repart de zéro et personne ne sait si les corrections ont servi.

Schéma JSON, identifiants stables et gabarit du rapport : `references/output-schema.md`.

## Règles absolues

- **Aucun scraping SERP.** La référence vient de l'intention, pas du classement existant.
- **Robots.txt strict** pour tout WebFetch. Si bloqué : demander le contenu à l'utilisateur, jamais de contournement.
- **Périmètre avant verdict.** Un champ non lu n'est pas un gap.
- **Le générateur de carte ne voit pas le contenu.** Sans quoi l'audit s'auto-valide.
- **Ne rien inventer sur les chiffres.** Les densités viennent du script ; si une mesure n'a pas pu être faite, le dire plutôt que l'estimer.
- **Ne pas rédiger.** Le livrable est un diagnostic priorisé : pas de H1, pas de hook, pas de paragraphes de remplacement. La réécriture est un travail distinct, mené à partir de ce plan.
- **Hors scope compte autant que les gaps.** Une page qui ne fait que grossir ne se recentre jamais ; les éléments à retirer sont une partie du livrable, pas une remarque en passant.
