# SEO Content Pruning

> seo-content-pruning : l'existant, page par page

- Skill: `lcrvl2/seo-content-pruning` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add lcrvl2/seo-content-pruning`
- Raw SKILL.md: https://api.skillmd.com/api/skills/lcrvl2/seo-content-pruning/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- Author: lcrvl2 (https://skillmd.com/u/lcrvl2)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/lcrvl2/seo-content-pruning

---


# seo-content-pruning : l'existant, page par page

Répond à UNE question : **que fait-on de chaque page déjà en ligne ?** C'est le premier livrable client (implémentable dans la semaine), le plus gros gain rapide du SEO. La stratégie de mots-clés (quoi créer) est un AUTRE skill (seo-strategy) : les deux partagent seulement le socle des offres.

**Règles dures** : la GSC est la SEULE source de données (pas d'estimation tierce) ; la coupe et la fusion sont des PROPOSITIONS avec brief, tranchées par un humain, jamais exécutées par l'agent ; sur un petit site le verdict par défaut est garder (tout trafic sain envoie de bons signaux à Google). Aucun métier ni secteur hardcodé.

## L'arbre de décision (implémenté dans le script)

Questions posées dans l'ordre, par page. Les seuils sont des seuils de MISE EN REVUE, jamais des couperets :

1. **Trop récente ?** (moins de 6 mois si la date est connue) : on ne juge pas.
2. **Elle performe ?** (clics 90j au-dessus du benchmark du site = médiane des pages à clics) : garder.
3. **Gain proche ?** (position 5-20 avec au moins 30 impressions, ou fortes impressions à CTR quasi nul) : **optimiser**, priorisé par proximité du gain (la position la plus proche de la page 1 d'abord).
4. **Sujet daté ?** (année révolue dans l'URL ou le title) : **actualiser** sur l'année courante.
5. **Cannibalisation ?** (une même requête portée par 2+ pages) : **fusion proposée** (garder la plus forte, rapatrier les meilleures sections, 301 des absorbées) : humain.
6. **Zéro trafic sur 12 mois ?** Trois verrous avant la proposition de coupe : page **prestation** (valeur de conversion, jamais coupée), **backlinks** (la règle la plus unanime des sources : jamais de coupe sèche, 301 vers la page la plus proche), **fenêtre 12 mois obligatoire** (protège le saisonnier). Sinon : **à examiner (coupe)**, avec brief quoi/pourquoi/comment.
7. **Sous-performance persistante** (impressions sans clics sur 12 mois, pas de gain proche) : **à trancher** par l'agent : la structure tient = actualiser, l'intent a changé = réécrire.

## Procédure de l'agent

### Étape 1 : le socle des offres (partagé avec seo-strategy)

Si `outputs/socle.json` existe (déposé par seo-strategy ou un run précédent) : le relire, ne re-juger que le delta. Sinon le construire :
1. Lire le cerveau : `product-value.md` (offres + priorités), `audiences-personas.md` (cibles + hors-cible), `positioning-messages.md` (national/local), `vocabulary.md` (NAP).
2. Si product-value ne délimite pas des offres nettes : NE PAS deviner, remonter les trous au owner et s'arrêter.
3. Assigner chaque page à une offre + un rôle (`prestation` / `soutien` / `hors-offre`), jugé sur les REQUÊTES GSC de la page, pas le titre seul (une page peut contenir les mots d'une offre et attirer un public hors-ICP). **`prestation` = la page VEND une offre ACTUELLE de product-value.md (CTA, devis, tarifs visibles), pas juste elle en parle.** Conséquences : une LP d'une offre qui n'est plus vendue ne matche aucune offre = hors-offre = arbre normal (la protection disparaît quand le cerveau est à jour) ; une page qui parle d'une offre sans la vendre = soutien ; deux LP pour la même offre = la cannibalisation les attrape (fusion proposée). Le rôle prestation ne protège que de la COUPE : optimiser/actualiser/réécrire s'appliquent normalement.
4. Écrire `outputs/socle.json` :
```json
{
  "offers": [{"name": "...", "priority": 1, "sectors": ["..."], "zones": ["..."]}],
  "page_map": {"https://...": {"offre": "... ou null", "role": "prestation|soutien|hors-offre"}},
  "protected_urls": ["https://.../lp-principale", "https://.../page-copy-gelee"]
}
```
**`protected_urls` : les pages que le système ne modifie JAMAIS.** La home est protégée d'office (script) et les pages légales/utilitaires par pattern. L'agent y ajoute ce qu'il identifie (pages de campagne actives) et demande au owner les pages non devinables : la LP principale, toute page à copy validée/gelée. Une page protégée = verdict "garder (protégée)", jamais candidate à la coupe, jamais absorbée par une fusion ; ses signaux de gain sont remontés en information seulement.

### Étape 2 : déposer l'export GSC

Via gsc-mcp (`get_search_analytics`), sur `site_url = client.gsc_property`, DEUX fenêtres : 90 jours (signaux de gain) et 12 mois (verdicts de coupe/fusion, saisonnalité). Écrire `data/gsc/<date>/pruning-export.json` :

```json
{
  "gsc_property": "sc-domain:...",
  "date": "YYYY-MM-DD",
  "windows": {"short_days": 90, "long_days": 365},
  "pages_short": [{"page": "https://...", "clicks": 0, "impressions": 0, "ctr": 0.0, "position": 0.0}],
  "pages_long":  [{"page": "https://...", "clicks": 0, "impressions": 0, "ctr": 0.0, "position": 0.0}],
  "queries_by_page_short": [{"page": "https://...", "query": "...", "clicks": 0, "impressions": 0, "ctr": 0.0, "position": 0.0}],
  "page_dates": {"https://...": "YYYY-MM-DD"}
}
```
`page_dates` (optionnel) : dates de publication si connues (sitemap lastmod). Absentes = la question "trop récente" est sautée, le noter au livrable.

**Backlinks (optionnel mais recommandé)** : l'API GSC n'expose pas le rapport Liens ; c'est un export UI (GSC > Liens > Pages les plus liées > Exporter). Déposer le fichier tel quel à côté : `data/gsc/<date>/links-top-pages.csv` (ou .json). Sans lui, les candidates à la coupe sont marquées "backlinks à vérifier dans GSC > Liens" et la vérification fait partie de la décision humaine.

### Étape 3 : lancer le script

```bash
python seo/skills/seo-content-pruning/scripts/pruning.py <slug>
```
Idempotent par jour (`--force` pour relancer). Sortie : `outputs/pruning/<date>/actions.json` (verdict, raisons, signaux, flags par page + groupes de fusion + benchmark utilisé + règles appliquées).

### Étape 4 : les jugements restants (agent)

1. **Trancher les `a_trancher_reecrire`** : relire la page (crawl) et ses requêtes ; la structure et l'angle collent encore à l'intent = actualiser ; l'intent de la requête a changé ou la page est à côté = réécrire (même URL, on repart du sujet).
2. **Vérifier les fusions proposées** : une "cannibalisation" peut être une pagination ou deux intents réellement différents ; ne garder dans le livrable que les fusions défendables.
3. **Écrire les briefs des décisions humaines** (coupe et fusion) : quoi / pourquoi (métriques à l'appui) / comment (mécanique 301 ou 410, liens internes à nettoyer, par lots avec mesure entre les lots).

### Étape 5 : le livrable

Écrire `outputs/pruning/<date>/content-pruning.md`, en français, sobre :
1. **Le socle** : les offres, ce que le site en couvre, les trous (offre sans page prestation = signalée, elle part dans seo-strategy).
2. **La liste d'action page par page** : URL | clics/impressions (90j et 12 mois) | offre + rôle | verdict | action précise | rang. Les "optimiser" triés par proximité du gain.
3. **Les décisions humaines** : fusions proposées et candidates à la coupe, chacune avec son brief. Rappeler la mécanique d'exécution (301/410, par lots, mesure).
4. **Les anomalies** : pages invisibles (dans le site, zéro impression 12 mois), orphelines (impressions mais hors crawl), et le statut backlinks (export fourni ou à vérifier).

**Jamais** : présenter un export simulé comme réel, supprimer ou fusionner soi-même, conclure sur une position sous 30 impressions, juger une page de moins de 6 mois.

## Tools (harness-aware)

**En Claude Code** : `ToolSearch: "select:mcp__gsc-mcp__get_search_analytics"` (et `get_search_by_page_query`). **Dans les autres harness** (Hermes inclus) : l'accès GSC équivalent. Pas d'accès GSC = code 2 = le skill s'arrête et le dit.

## Contrat

| | |
|---|---|
| **Lit** | `data/gsc/<date>/pruning-export.json` (+ `links-top-pages.*` optionnel), `outputs/socle.json`, crawl de la réserve (optionnel : titles, union crawl ∪ GSC) |
| **Écrit** | `outputs/socle.json` (si premier à tourner), `outputs/pruning/<date>/actions.json` + `content-pruning.md` |
| **Consommateurs** | Content-refresh et les briques de brief (les "optimiser/actualiser/réécrire" validés), l'humain (coupe/fusion), seo-strategy (le socle + les offres sans page) |

Frontière avec Content-refresh : ce skill est la photo stratégique complète, prise une fois ; refresh est la boucle hebdo qui surveille le delta ensuite.

## Sur Hermes

Run ponctuel (pas de scheduled job) : au démarrage d'un client, puis au re-run annuel de la stratégie. Le livrable peut être déposé en commentaire d'une carte dédiée du board. Les décisions humaines (coupe/fusion) se matérialisent en cartes bloquées "Décision owner : coupe/fusion proposée" si on veut les tracer sur le board.

