# Plan de correction SEO / GEO — audit du 2026-07-30

## Contexte

Audit read-only déclenché par le constat « le SEO est une catastrophe depuis les modifs ».
**Le constat de départ est infirmé** : mai → juillet 2026, le trafic passe de 4,90 à 12,07 clics/jour
(+146 %), +136 % sur la France seule. La rupture de pente démarre le 19 mai, soit **avant** les deux
déploiements de la campagne (26 mai `a88566a`, 2 juin `aaeb906`) — ceux-ci accompagnent une tendance
déjà lancée, ils ne l'ont pas créée.

En revanche l'audit a mis au jour six problèmes réels. **Un seul est imputable à la campagne**
(les duplicates `.md`). Les autres sont antérieurs ou non attribuables.

---

## État d'avancement — 2026-07-30

| Item | État | Commit(s) |
|---|---|---|
| P0-1 · débloquer `/_next/` | ✅ codé | `a82e574` |
| P0-2 · duplicates `.md` | ✅ codé | `435dda3` + `f97a080` |
| P0-3 · cannibalisation `/` vs `/courtier-en-energie/` | ⬜ à faire — **arbitrage inversé par P0-4** | — |
| P0-4 · audit home / backlinks | ✅ fait (backlinks non inventoriables) | — |
| P0-5 · page `courtier energie b2b` | ❌ **à abandonner** — voir P0-4 | — |
| P1-1 · bots IA | ✅ codé | `a82e574` |
| P1-2 · maillage sans slash | ✅ codé | `fef9d36` + `833c6ee` |
| P1-3 · relance de crawl | ⏸ bloqué par le déploiement | — |
| P1-4 · CTR / puits à impressions | ⬜ à faire | — |
| P2 · dette | ⬜ à faire | — |

> ⚠️ **« codé » ≠ « en prod ».** `main` est resté au `25f646f` du 2026-06-02. Les 8 commits
> correctifs vivent sur `dev` et **ne sont pas déployés**. Tant que `dev` n'est pas mergée dans
> `main`, aucune vérification `curl` du plan ne peut passer au vert et P1-3 (relance de crawl)
> reste bloqué.

Prod = `main` @ `25f646f`, déployée le 2026-06-02 (`dpl_EUMi2bGtghFwKjiV2T1zrFyt4x4F`).
Aucun déploiement depuis. Tout ce qui est marqué **[mesuré]** a été vérifié par requête HTTP réelle
sur `www.aciebenergie.fr` le 2026-07-30 ou par l'API GSC.

---

## P0 — à traiter en premier

### [x] P0-1 · Débloquer `/_next/` pour Googlebot — *codé sur `dev` (`a82e574`), pas en prod*

**Constat** — `app/robots.ts:6` : `BLOCKED_PATHS = ["/api/", "/_next/", "/admin/", "/private/"]`,
appliqué au groupe `Googlebot/Bingbot` (ligne 37) **et** au groupe `*` (ligne 73). Bloque donc pour
Google : tout le CSS et le JS (`/_next/static/*`) et **toutes les images** du site (`/_next/image`) —
62 images rien que sur l'article boulangerie.

**Origine** — commit `51c70b5`, 2025-11-21. **Antérieur à la campagne.**

**Fix** — retirer `/_next/` de `BLOCKED_PATHS`. Si on veut garder un blocage partiel, ne bloquer que
`/_next/static/chunks/` et laisser `/_next/image` et le CSS ouverts. Le plus simple et le plus sûr :
ne rien bloquer sous `/_next/`.

**Vérification** — `robots.txt` en prod ne contient plus `Disallow: /_next/` ; outil d'inspection GSC
sur une page article → section « Ressources de la page », plus aucune ressource « Bloquée par
robots.txt ».

**Effort** : 1 ligne · **Risque** : nul

---

### [x] P0-2 · Sortir les 127 duplicates `.md` de l'index — *codé sur `dev`, pas en prod*

**Constat [mesuré]** — `GET /guides/electricite-boulangerie-prix-economies-2026.md` →
`200`, `content-type: text/markdown`, **article intégral**, **aucun `x-robots-tag`**, et
`Link: <…/electricite-boulangerie-prix-economies-2026.md>; rel="canonical"` — **le duplicate
s'auto-canonicalise**. Découverte garantie par le `<link rel="alternate" type="text/markdown">`
émis dans le `<head>` de chaque article (`app/[category]/[slug]/page.tsx:57`).

Le garde-fou `X-Robots-Tag: noindex` posé sur `/api/:path*` (`next.config.ts:161-168`) **ne
s'applique jamais** : Next.js matche les `headers()` sur le chemin de la requête entrante
(`/guides/….md`), pas sur la destination du rewrite (`next.config.ts:101`). Confirmé par
`x-matched-path: /api/md/…` en réponse **sans** `x-robots-tag`.

**Origine** — commit `aaeb906`, 2026-06-02. **Seul P0 imputable à la campagne.**

**Fix** — trois gestes, les trois sont nécessaires :
- [x] merger `fix/noindex-versions-md` (`5cce4d4`, 15 juin) → `dev` → `main` : ajoute
      `X-Robots-Tag: noindex` sur `app/api/md/[category]/[slug]/route.ts` et `app/services.md/route.ts`
      → **`435dda3` sur `dev`. Le `→ main` reste à faire.**
- [x] `proxy.ts:19-20` : ne pas poser de `Link: rel="canonical"` auto-référent sur les `.md` —
      soit exclure `*.md` du middleware, soit faire pointer le canonical vers l'URL HTML.
      Sans ça, `noindex` + self-canonical restent contradictoires. → **`f97a080`**
- [x] étendre le `noindex` à `/llms.txt`, `/llms-full.txt` (`app/llms.txt`, `app/llms-full.txt`) :
      même situation, crawlables par Googlebot, sans directive → **`f97a080`**

**Vérification** — `curl -I` sur une URL `.md` → `x-robots-tag: noindex` présent et `Link` canonical
pointant vers l'URL HTML (ou absent).

**Effort** : merge + ~10 lignes · **Risque** : faible

---

### [ ] P0-3 · Trancher la cannibalisation `/` vs `/courtier-en-energie/`

**Constat [mesuré]** — `/courtier-en-energie/` capte les head terms à la place de l'accueil,
**systématiquement vers une position pire**. 27 bascules d'URL servante entre juin et juillet :

| Requête | Juin (`/`) | Juillet (`/courtier-en-energie/`) |
|---|---|---|
| `courtier energie b2b` | pos **2,2**, 1 clic | pos **19,3**, 0 clic |
| `courtier energie` | pos 8,9, 5 clics | pos 16,2, 1 clic |
| `courtier en énergie` | pos 10,3 | pos **25,1** |
| `courtier énergie` | pos 16,7 | pos **43,6** |

La page absorbe **1 810 impressions pour 1 clic** (CTR 0,06 %, pos 14,3). Le cluster complet
(`/` + `/courtier-en-energie/` + `/guides/courtage-energie-metier-…`) passe de 9 clics en juin à
**5 clics en juillet** pour 2 499 impressions.

**Causalité NON établie** — vérifié : le `title` de `/courtier-en-energie/` n'a pas changé pendant la
campagne, la page n'était pas dans la restauration d'accents (`e7b4ece`), seuls un fil d'Ariane et un
niveau de titre de footer ont bougé (`0a3b938`, `1dc7d25`). Le timing est suggestif, rien de plus.

**Arbitrage rendu (2026-07-30)** — **`/courtier-en-energie/` porte le cluster.**

**Fix**
- [ ] différencier franchement `/courtier-en-energie/` de l'accueil (intention + title + H1 + angle)
- [ ] réaligner le maillage interne vers `/courtier-en-energie/` (voir P1-2 : 148 liens pointent
      aujourd'hui vers `/guides/courtier-en-energie-guide-complet`, une **troisième** page du cluster —
      arbitrer aussi son sort : satellite explicite ou fusion)
- [ ] créer une page dédiée pour **`courtier energie b2b`** (voir P0-4), requête sur laquelle
      l'accueil rankait à **2,2** avant de se faire remplacer à 19,3

**Vérification** — dans 3-4 semaines, GSC dimensions `query,page` : une seule URL sert les head terms
`courtier energie*`, à une position ≤ celle de juin.

**Effort** : arbitrage + refonte éditoriale · **Risque** : moyen (toucher à l'accueil)

---

### [x] P0-4 · Auditer la home sur l'ancre « courtier en énergie » (tâche distincte) — *fait le 2026-07-30, voir résultats en fin de section*

**Pourquoi c'est distinct de P0-3** — le profil de backlinks acquis pointe vers **la home**, pas vers
`/courtier-en-energie/`. Exemple fourni :

| Champ | Valeur |
|---|---|
| URL source | `https://www.allianceentreprendre.com/courtier-en-energie-les-leviers-pour-maitriser-les-couts-delectricite-et-de-gaz-dune-entreprise/` |
| Destination | `https://www.aciebenergie.fr` (racine) |
| Ancre | `courtier en energie` |

**Tension à résoudre** — P0-3 décide que `/courtier-en-energie/` porte le cluster, mais **toute
l'autorité d'ancre est sur la home**. En l'état on demande à Google de faire ranker une page qui n'a
pas les liens, pendant qu'une autre accumule l'ancre exacte. C'est cohérent avec ce que montre GSC :
la home rankait à **2,2** sur `courtier energie b2b` et à **8,9** sur `courtier energie` ; c'est
`/courtier-en-energie/` (sans backlinks) qui l'a remplacée, à 19,3 et 16,2.

**À faire**
- [ ] inventorier les backlinks acquis : destination réelle + ancre, en distinguant ceux qui pointent
      la racine de ceux qui pointent une page profonde
      → **NON RÉALISABLE en l'état** : aucun outil de backlinks connecté. L'API GSC n'expose pas le
      rapport « Liens » (il n'existe qu'en UI). Demande un export Ahrefs/Semrush ou le CSV du rapport
      Liens de GSC. **Seul lien documenté à ce jour : allianceentreprendre.com → racine, ancre
      « courtier en energie ».**
- [x] vérifier ce que la home cible réellement aujourd'hui : `title`, `H1`, `meta description`,
      densité de l'entité « courtier en énergie »
- [x] décider du transfert d'autorité
- [x] vérifier qu'aucun des liens acquis ne pointe vers une URL sans slash final (voir P1-2)
      → le seul lien connu vise `https://www.aciebenergie.fr` (racine nue, sans chemin) : sain.

---

#### Résultats de l'audit P0-4 — 2026-07-30

**1. La prémisse de P0-3 est périmée : la cannibalisation s'est largement résorbée seule.**

GSC, dimensions `query` filtrées par page, 2026-07-02 → 2026-07-30 (28 j) :

| | Impressions | Clics | CTR |
|---|---|---|---|
| `/` (home) | 614 | **7** | 1,14 % |
| `/courtier-en-energie/` | 420 | **0** | 0,00 % |

Les deux pages ne se disputent plus les mêmes requêtes — elles se sont séparées par **famille
lexicale** :

| Famille | Page servante | Meilleures positions |
|---|---|---|
| `courtier en énergie`, `courtier energie`, **`courtier energie b2b`** | **la home** | b2b **1,2** · `courtier en énergie` 10,1 (95 impr) · `courtier energie` 10,1 (90 impr) · `courtier en énergie pour professionnel` 8,5 (65 impr) |
| `courtage en énergie …`, `courtier électricité …` | `/courtier-en-energie/` | `courtage en énergie pour ETI` 7,3 · `courtage en énergie pour les professionnels` 7,7 · `courtier electricite pro` 11,1 (46 impr) |

**`courtier energie b2b` est repassé à la position 1,2 sur la home** (8 impressions, 0 clic). Le
constat du plan — « servi par `/courtier-en-energie/` à 19,3 » — ne tient plus sur les 28 derniers
jours. L'actif n'était pas perdu, il oscillait.

**2. → L'arbitrage de P0-3 doit être INVERSÉ.**

Le plan avait tranché « `/courtier-en-energie/` porte le cluster ». Les trois signaux disent l'inverse :
la home a **les backlinks**, **les positions** et **les seuls clics du cluster** ; `/courtier-en-energie/`
fait **0 clic sur 420 impressions**. Faire porter le cluster à la page sans autorité, contre une page
qui ranke déjà à 1,2 sur la requête commerciale la plus qualifiée, revient à saborder l'actif.

> **Arbitrage révisé** : **la home garde `courtier en énergie` / `courtier energie b2b`.**
> `/courtier-en-energie/` bascule officiellement sur **`courtage en énergie`** — la famille où elle
> ranke déjà entre 7 et 11 sans effort. C'est la 3ᵉ option du plan initial, celle qui n'avait pas
> été retenue. **Conséquence directe : P0-5 (page dédiée `courtier energie b2b`) devient inutile,
> voire nuisible** — elle cannibaliserait une position 1,2 existante.

**3. On-page de la home — un seul vrai défaut, mais il est central**

| Élément | Valeur | Verdict |
|---|---|---|
| `title` | « Courtier Énergie Professionnel : L'Expertise Ingénieur » | ✅ entité présente, en tête |
| `meta description` | « Courtier en énergie B2B : nos ingénieurs renégocient vos contrats… » | ✅ |
| **`H1`** | « L'Expertise d'Ingénieurs pour Optimiser vos Contrats d'Électricité et de Gaz B2B » | ❌ **ne contient ni « courtier » ni « énergie » comme entité** |
| Sous-titre (`<p>`) | « Votre courtier en énergie indépendant. » | ⚠️ l'entité n'existe que là, dans un `<p>` |

La page qui reçoit l'ancre exacte « courtier en energie » **n'a pas l'entité dans son H1**
(`data/experiments/hero-variants.ts:18-27`). C'est le levier on-page le moins cher du dossier :
la home est déjà à 10,1 sur le head term sans que son H1 ne le mentionne.

**4. Le maillage ne transfère rien vers le cluster commercial**

La home ne lie **jamais** `/courtier-en-energie/`. Elle lie **deux fois**
`/guides/courtier-en-energie-guide-complet/` (`components/courtier-explainer.tsx:158,180`) — la page
informationnelle. Cohérent avec les 148 liens internes déjà recensés en P1-2 vers cette même page :
**c'est le guide, pas la page commerciale, qui capte le maillage du cluster.**

**Actions qui découlent de cet audit** (à ordonnancer dans P0-3 révisé)
- [ ] réécrire le H1 de la home pour y porter l'entité « courtier en énergie » sans casser l'angle
      ingénieur (`data/experiments/hero-variants.ts`)
- [ ] repositionner `/courtier-en-energie/` sur `courtage en énergie` (title + H1 + angle)
- [ ] arbitrer le sort de `/guides/courtier-en-energie-guide-complet/`, qui capte 148 liens internes
      et 2 liens depuis la home : satellite explicite ou fusion
- [ ] **abandonner P0-5** sauf décision contraire explicite
- [ ] obtenir un export backlinks (Ahrefs/Semrush ou CSV GSC) pour clore le point 1

**Vérification** — GSC dimensions `query,page` filtrées sur `courtier`, sur 4 semaines après
déploiement : l'URL servante correspond bien à celle qui reçoit les backlinks.

**Effort** : audit + décision · **Risque** : nul (lecture)

---

### [ ] P0-5 · Créer une page dédiée `courtier energie b2b`

**Constat [mesuré]** — l'accueil rankait **position 2,2** sur `courtier energie b2b` en juin, avec
1 clic. En juillet la requête est servie par `/courtier-en-energie/` à **position 19,3, 0 clic**.
Une position 2 sur une requête d'intention commerciale B2B est un actif qu'on ne récupère pas
en changeant un title.

**À faire**
- [ ] page dédiée, intention transactionnelle B2B assumée (pas un guide) : à qui ça s'adresse
      (PME/ETI/multi-sites), ce qu'on négocie, comment on est rémunéré, preuve chiffrée
- [ ] la différencier de `/courtier-en-energie/` (qui reste la page de cluster générique) et de
      `/guides/courtier-en-energie-guide-complet` (informationnel)
- [ ] l'ajouter au sitemap, au maillage interne et à `llms.txt` (avec slash final — voir P1-2)
- [ ] à coordonner avec P0-4 : si la home conserve l'ancre « courtier en énergie », cette nouvelle
      page doit viser `b2b` / `entreprise` et non le head term nu

**Vérification** — la page est indexée sous 3 semaines, et GSC la montre servante sur
`courtier energie b2b` à une position en amélioration continue.

**Effort** : rédactionnel + intégration · **Risque** : faible (page neuve, rien à casser)

---

## P1

### [x] P1-1 · Rouvrir la surface commerciale aux moteurs IA — *codé sur `dev` (`a82e574`), pas en prod*

**Constat [mesuré]** — `app/robots.ts:49-50` : le groupe `GPTBot / ClaudeBot / anthropic-ai /
Google-Extended` a `disallow: ["/", ...BLOCKED_PATHS]` + une allow-list étroite. Effet réel : sont
**interdits** l'accueil, `/contact/`, `/courtier-en-energie/`, les 3 `/expertise/*`, les 3
`/solutions/*`, les 4 `/secteurs/*`, `/ressources/`, `/sitemap.xml`, `/feed.xml` et tout
`/.well-known/`. Seuls le blog et les outils passent.

Contradiction interne : `/llms.txt` **est** autorisé à ce groupe, mais il pointe majoritairement vers
des URLs que le même groupe n'a pas le droit de fetcher.

**Fix** — ajouter à `AI_READABLE_PATHS` (`app/robots.ts:13`) : `/$`, `/contact/`,
`/courtier-en-energie/`, `/expertise/`, `/solutions/`, `/secteurs/`, `/ressources/`, `/sitemap.xml`,
`/feed.xml`, `/.well-known/`. Ou basculer ce groupe sur `Allow: /` + disallow ciblés.

**Effort** : ~10 lignes · **Risque** : nul (c'est une ouverture)

---

### [x] P1-2 · Corriger le maillage interne sans slash final — *codé sur `dev`, pas en prod*

**Constat [mesuré]** — le site est en `trailingSlash: true` (`next.config.ts:37`), mais sur les
967 liens internes des 127 articles MDX, **726 (75 %) sont sans slash final** et déclenchent un 308.
Top contrevenants : `/guides/courtier-en-energie-guide-complet` (**148×**),
`/guides/turpe-optimisation-entreprise-2026` (47×), `/contact` (25×).

Même défaut dans `app/llms.txt` et `app/llms-full.txt` : ~140 des ~142 URLs répondent 308, parce que
les liens sont concaténés sans slash — alors que `app/sitemap.ts` le fait correctement partout.

**Conséquence** — flux permanent d'URLs non canoniques donné à Google. C'est ce qui alimente le
rapport GSC « Exclue par la balise noindex » (31 URLs, dont 30 sans slash).

**Fix**
- [x] sweep sur `data/blogs/*.mdx` : ajouter le slash final aux liens internes (regex ciblée sur
      `](/guides|/actualites|/reglementation|/cas-clients|/secteurs|/solutions|/expertise|/outils|…)`)
      → **`fef9d36`, 103 fichiers MDX**
- [x] `app/llms.txt` + `app/llms-full.txt` : dériver les URLs de la même logique que `app/sitemap.ts`
      → **`fef9d36`**
- [x] `components/services/landing-breadcrumb.tsx:37` et le BreadcrumbList JSON-LD des articles
      (`app/[category]/[slug]/page.tsx:178-185`) : URLs `item` sans slash, à aligner
      → **`fef9d36`** pour les articles. Côté landings : **non concerné** — le seul `href` passé au
      composant est `"/"`, déjà canonique (vérifié sur les 10 pages). Le défaut `item` manquant sur
      les `ListItem` intermédiaires reste ouvert, il est traité en P2.
- [x] **hors plan initial** : les 74 destinations de `redirects()` pointaient sans slash final et
      chaînaient un 308 → **`833c6ee`**

**Vérification** — recompter : 0 lien interne sans slash ; `llms.txt` → toutes les URLs en 200.

**Effort** : sweep scripté + relecture · **Risque** : faible (vérifier qu'aucune ancre `#` ne casse)

---

### [ ] P1-3 · Relancer le crawl des 7 pages « Crawled – currently not indexed »

**Constat [mesuré, API GSC]** — 7 pages sorties de l'index, dernier crawl entre le 29 avril et le
28 mai (9 à 13 semaines) :

| URL | Dernier crawl | Impressions mai → juillet |
|---|---|---|
| `/guides/courtier-energie-copropriete-guide-complet-2026/` | 2026-04-29 | 160 (pos 5,2) → **0** |
| `/reglementation/decret-tertiaire-2026-obligations-entreprise/` | 2026-05-06 | 74 → **0** |
| `/guides/devis-electricite-entreprise-guide-complet/` | 2026-05-06 | 72 → **0** |
| `/guides/devis-electricite-professionnel/` | 2026-05-10 | 50 → **0** |
| `/guides/fournisseur-electricite-professionnel-comparatif-guide-2026/` | 2026-05-11 | 380 → 286 (pos 16,6 → **62,5**) |
| `/guides/economies-energie-entreprise/` | 2026-05-26 | 9 → 0 |
| `/guides/courtier-energie-copropriete-guide-syndic-2026/` | 2026-05-28 | 175 → 10 |

À noter : deux pages « copropriété » quasi jumelles → cannibalisation probable, à traiter comme P0-3.

**Fix** — P0-1 et P1-2 devraient débloquer le crawl mécaniquement. En complément :
- [ ] enrichir / différencier les pages jumelles avant de redemander l'indexation
- [ ] demander l'indexation manuellement dans GSC une fois P0-1 + P1-2 déployés

**Effort** : dépend de P0-1/P1-2 · **Risque** : nul

---

### [ ] P1-4 · Attaquer les puits à impressions (CTR)

**Constat [mesuré]** — CTR de référence du site : pos 5-9 = 1,46 %, pos 10-14 = 0,79 %.
Manque à gagner cumulé sur les 20 pires pages : **82 clics / 29 jours, soit +23 % du trafic actuel.**

| Page | Impr. | Clics | CTR | Pos | Manque |
|---|---|---|---|---|---|
| `/guides/tarif-electricite-entreprise-grille-prix-2026/` | 3 764 | 4 | 0,11 % | 14,0 | **+25,8** |
| `/guides/optimisation-fiscale-energie-cspe-ticgn-…/` | 1 512 | 5 | 0,33 % | 8,4 | **+17,0** |
| `/courtier-en-energie/` | 1 810 | 1 | 0,06 % | 14,3 | **+13,3** |
| `/guides/raccordement-electrique-professionnel-2026/` | 374 | 0 | 0,00 % | 8,1 | +5,4 |

**Note** — 31 % des impressions du site viennent de **hors-France** à 0,46 % de CTR (USA 3 330
impressions / 1 clic, Pays-Bas 1 367 / 1, Allemagne 1 132 / 1). Ce n'est pas actionnable directement,
mais ça explique une bonne part du CTR global de 1,11 % : sur la France seule il est à **1,40 %**.

**Fix**
- [ ] réécrire `title` + `description` des 4 pages ci-dessus (angle requête, promesse chiffrée)
- [ ] `lib/tools-data.ts:153-154` : title simulateur ≈ 90 caractères avec le template
      `| Acieb Énergie` (`app/layout.tsx:28`) → tronqué en SERP, à raccourcir

**Effort** : rédactionnel · **Risque** : nul

---

## P2 — dette, à faire quand les P0/P1 sont sortis

- [ ] `app/contact/page.tsx:9` — `canonical: "/contact"` sans slash alors que `trailingSlash: true` →
      le canonical pointe vers une URL qui 308. Page de conversion, signal sale.
- [ ] `components/services/landing-breadcrumb.tsx:37` — les `ListItem` intermédiaires sans `href`
      sont émis **sans propriété `item`** → BreadcrumbList probablement rejeté sur les 10 landings.
- [ ] `/outils/` renvoie **404** [mesuré] alors que `app/robots.ts:16` l'autorise explicitement et que
      `/outils` redirige dessus → créer la page d'index.
- [ ] `app/llms.txt` / `app/llms-full.txt` servis en `text/plain` alors que 3 endroits les déclarent
      `text/markdown` ; pas de CORS dessus.
- [ ] `/.well-known/agent-skills/index.json` — non conforme au draft v0.2.0 sur tous les champs
      requis (`$schema` absent, `type` = MIME au lieu de l'enum `skill-md|archive`, `digest` absent),
      pointe des documents au lieu de `SKILL.md`, aucun `SKILL.md` publié. **Décision binaire** :
      écrire un vrai `SKILL.md` conforme, ou supprimer l'endpoint.
- [ ] Contradiction `rel="alternate" type="text/markdown"` : le `<head>` pointe le bon `.md`, le
      header `Link` de `proxy.ts:11` pointe `llms-full.txt` (293 Ko). Passer ce dernier en
      `rel="describedby"`.
- [ ] Les `.md` ne contiennent pas les FAQ frontmatter (102 articles sur 127), ni auteur, ni date, ni
      URL canonique — et contiennent du JSX MDX non résolu (`<Callout>`, `<ShadcnChart>`).
- [ ] `app/.well-known/security.txt` — `Expires` = build + 1 an, gelé par `force-static`. Expire
      silencieusement le 2027-06-01 si pas de redéploiement.
- [ ] Tokens de bots absents (tombent sur `*`, donc autorisés) : `Claude-User`, `Claude-SearchBot`,
      `MistralAI-User`, `Perplexity-User`, `Meta-ExternalFetcher`, `Google-CloudVertexBot`.
- [ ] Champ `draft` de content-collections jamais filtré (0 occurrence dans `app/`, `lib/`,
      `components/`) — latent, aucun article en draft aujourd'hui.

---

## Explicitement hors périmètre — vérifié, ne rien faire

- **`content-visibility: auto`** (`app/globals.css:73-77`) — ne s'applique qu'au `<footer>`. Le
  contenu principal reste dans le DOM et est indexé. **Pas la cause.**
- **`sitemap.ts`** — 17 statiques + 4 catégories + 127 articles ≈ 147, cohérent avec GSC,
  0 erreur / 0 warning, trailing slashes corrects, logique `lastmod` conservatrice. **Sain.**
- **Groupe Googlebot de `robots.ts`** — intact hors P0-1. Aucune restriction par effet de bord.
- **CSP** — en `Report-Only`, ne bloque rien.
- **Restauration des accents (`e7b4ece`) et déplacement du fil d'Ariane (`6d6cd85`)** — diff
  exhaustif des `href` : un seul lien changé (`/mentions-legales/` → `/politique-confidentialite/`,
  fix RGPD volontaire), 10 liens « Accueil » **ajoutés**. Aucun contenu ni lien perdu. L'état de base
  était sans accents : c'est une amélioration nette.
- **Rapport GSC « Exclue par la balise noindex » (31 URLs)** — dates de dernière exploration :
  29 en mars, 2 en mai, **aucune après le 15 mai**. Entièrement antérieur à la campagne. Les URLs ne
  sont plus noindex aujourd'hui [mesuré]. Bruit historique, se purgera avec P1-2.
- **`X-Robots-Tag` sur `/_next/image`** — inerte : sur Vercel, `/_next/image` est servi par l'infra
  d'optimisation d'images de la plateforme, qui court-circuite les `headers()` de `next.config.ts`
  [mesuré : aucun `x-robots-tag` en réponse]. Le blocage réel vient de robots.txt → P0-1.
- **Migration TICFE trailing slash** — pas une régression : 6 clics en mai (2 URLs) → 11 clics en
  juillet (1 URL). Migration réussie.
- **Requêtes de robots de veille** — 0,69 % des impressions, 0 clic, impact CTR 0,008 point.
  Négligeable.

---

## Ordre d'exécution proposé

1. ~~**P0-1** (`/_next/`) — 1 ligne, risque nul, débloque le rendu et Google Images~~ ✅
2. ~~**P0-2** (duplicates `.md`) — merge du fix existant + 2 ajustements~~ ✅
3. ~~**P1-1** (bots IA) — ouverture, sans risque~~ ✅
4. ~~**P1-2** (maillage sans slash) — sweep sur 127 fichiers ; débloque P1-3~~ ✅
5. **⇒ Déployer : merge `dev` → `main`.** Rien de 1-4 n'est actif tant que ce n'est pas fait.
   C'est le préalable à toutes les vérifications `[mesuré]` du plan et à P1-3.
6. **P0-4** (audit home / backlinks) — lecture pure, à faire avant P0-3 et P0-5 car il conditionne
   leur ciblage
7. **P0-3** (cannibalisation) puis **P0-5** (page `courtier energie b2b`) — dépendent de P0-4
8. **P1-4**, **P1-3**, puis P2

Ordre voulu : on sécurise d'abord la technique (1-3), on établit les faits sur le profil de liens (4),
puis on touche à l'éditorial du cluster commercial (6) — pas l'inverse.

---

## H1 · Pages de hub `/secteurs/`, `/solutions/`, `/expertise/`

**Ouvert le 2026-07-31**, à la suite de l'audit de couverture GSC et de la création de
`/outils/`. Voir `docs/audits/2026-07-31-gsc-couverture.md`.

### Constat

Les trois URLs répondent **404** [mesuré]. Elles n'ont pas de `page.tsx` dans `app/`.

Elles ne cassent rien aujourd'hui : les crumbs intermédiaires du fil d'Ariane sont rendus en
`<span>`, pas en lien, et le menu déroulant de la navbar ne lie que les feuilles. Aucun lien
interne ne pointe vers elles [vérifié : 0 occurrence de `href="/secteurs/"` et équivalents].

Ce n'est donc pas un bug — c'est une **absence**. Trois niveaux de l'arborescence n'existent
pas, alors que le site les met en scène dans sa navigation et ses fils d'Ariane.

### Ce que leur création débloquerait

- **Trois pages commerciales** sur des requêtes de milieu de tunnel (`courtier énergie
  industrie`, `solutions électricité verte entreprise`, `expertise courtage énergie`) —
  aujourd'hui servies, mal, par la home ou par les feuilles.
- **Le niveau intermédiaire du fil d'Ariane structuré.** Il est actuellement retiré du JSON-LD
  faute d'URL (`components/services/landing-breadcrumb.tsx`). Avec des pages réelles, les
  10 landings passeraient d'un `BreadcrumbList` à 2 niveaux à un vrai 3 niveaux.
- **Un maillage vers les 10 landings** depuis un hub, au lieu de la seule navbar.

### À trancher avant d'écrire

- [ ] **Hub éditorial ou simple index ?** Une page de listing avec 3-4 cartes n'a aucune valeur
      SEO propre et risque de tomber dans « Explorée, actuellement non indexée » comme les 64
      autres. Il faut du contenu propre : à qui s'adresse chaque secteur, ce qui change d'un
      secteur à l'autre, preuve chiffrée.
- [ ] **Articulation avec `/courtier-en-energie/`** — l'arbitrage de P0-4 lui a donné la famille
      `courtage en énergie`. Vérifier que `/expertise/` ne vient pas la cannibaliser.
- [ ] **Faut-il les trois ?** `/expertise/` recoupe fortement `/courtier-en-energie/`.
      `/secteurs/` et `/solutions/` sont plus clairement distincts.

### Checklist d'exécution — tirée de ce qui a manqué sur `/outils/`

J'ai créé `/outils/` en traitant le 404 mais en oubliant tout le maillage : la page est restée
quasi orpheline jusqu'au commit suivant. À ne pas reproduire.

- [ ] `page.tsx` avec `metadata` (title, description) + `alternates.canonical`
- [ ] Ajout à `app/sitemap.ts`
- [ ] Vérifier `app/robots.ts` (les chemins `/secteurs/`, `/solutions/`, `/expertise/` sont
      **déjà** dans `AI_READABLE_PATHS` — ils autorisent des pages qui n'existent pas)
- [ ] JSON-LD `CollectionPage` + `hasPart`
- [ ] **Maillage** : entrée dans `data/links/navigation.ts`, `SiteNavigationElement` dans
      `app/page.tsx`, ligne d'index dans `app/llms.txt/route.ts`
- [ ] Donner un `href` au crumb intermédiaire dans les 10 landings → le fil d'Ariane structuré
      retrouve son 3ᵉ niveau
- [ ] Vérifier la redirection sans slash (`/secteurs` → `/secteurs/`) en un seul saut
- [ ] Re-crawler les liens internes : 0 erreur

**Effort** : 3 pages rédactionnelles + intégration · **Risque** : faible (pages neuves)

---

## Review

*(à remplir après implémentation)*
