# 01 — Blog sans flux RSS : discovery + hygiène

> **Specs** : Feed discovery · Feed content hygiene — tier **recommended**
> **Verdicts** : feed-discovery 🔴 **FAIL** · feed-hygiene ⚪ N-A (pas de flux à auditer)
> **Priorité : P2** · **Effort estimé** : 2-3 h (plugin Gatsby + config)
> **Lié** : l'item agent-readiness *machine-readable-formats* échoue pour la même raison — ce fix résout les deux.

## Problème

Le site publie un blog actif (~22 articles) mais **aucun flux n'existe et rien n'est déclaré** :

- `/rss.xml`, `/feed.xml`, `/atom.xml`, `/blog/rss.xml` → tous **404**
- Les 2 seuls `<link rel="alternate">` du head pointent… la homepage elle-même, sans `type` (ce sont les hreflang) — aucun `type="application/rss+xml"`

## Impact

- Lecteurs RSS, agrégateurs et **agents IA** n'ont aucun moyen typé de suivre les publications — ils doivent re-scraper `/blog` et diff-er du HTML.
- Pour un blog de conseil local (« que faire en cas de nid de frelons »), le flux est aussi un canal de syndication gratuit (Flipboard, feedly, veille des mairies/syndics…).

## Correctif

### 1. Générer le flux au build (`gatsby-plugin-feed`)

Le site est en Gatsby 5 — plugin officiel :

```js
// gatsby-config.js
{
  resolve: 'gatsby-plugin-feed',
  options: {
    feeds: [{
      output: '/rss.xml',
      title: 'ABC Guêpes — Blog',
      // query sur les posts, serialize: { title, description, date, url, guid: url, custom_elements: [{ 'content:encoded': html }] }
    }],
  },
},
```

### 2. Le déclarer dans le `<head>` (feed-discovery)

Sur l'accueil et `/blog` au minimum (toutes les pages est encore mieux) :

```html
<link rel="alternate" type="application/rss+xml"
      title="ABC Guêpes — Blog"
      href="https://www.abc-guepes.com/rss.xml">
```

### 3. Cahier des charges du flux (feed-hygiene — à respecter dès la v1)

| Exigence spec | Implémentation |
|---|---|
| `atom:link rel="self"` | URL absolue du flux dans le flux lui-même (`https://www.abc-guepes.com/rss.xml`) |
| `<guid isPermaLink="true">` **stable** | = permalien de l'article ; ne **jamais** changer entre deux builds (sinon les lecteurs re-notifient tout) |
| Contenu **complet** | `<content:encoded>` avec le HTML intégral de l'article — pas un extrait tronqué (anti-pattern explicitement listé par la spec) |
| Dates RFC 822 | `pubDate` depuis le frontmatter des posts |
| Module Syndication | `sy:updatePeriod` / `sy:updateFrequency` alignés sur la cadence réelle de publication |
| Validation avant déploiement | https://validator.w3.org/feed/ — 0 erreur |

## Vérification

```bash
curl -sI https://www.abc-guepes.com/rss.xml        # 200, application/rss+xml (ou application/xml)
curl -s  https://www.abc-guepes.com/ | grep 'application/rss+xml'   # link rel=alternate présent
curl -s  https://www.abc-guepes.com/rss.xml | grep -c '<guid'        # = nombre d'articles
```
- Rebuild sans nouveau post → diff du flux vide (guids stables).
- Abonnement test dans un lecteur (NetNewsWire/feedly) : articles complets, images OK.
