---
page: contenu
sous-page: online
route: /contenu/online
statut: draft
version: 0.1
transverse-liées: [conventions, i18n, design-system, queue-workers (TBD)]
date: 2026-06-03
---

# CdC — `contenu/online`

> **Pages publiées** (entité `online_page`) : inventaire, **fraîcheur**, détection des pages **à mettre à jour / obsolètes**. Connexion CMS = **D2** (plugins/ping, plus tard) ; **fallback v1 = scan Firecrawl**.

## 1. Objectif

Tenir l'**inventaire des pages en ligne** d'un site et leur **santé éditoriale** dans le temps : quand ont-elles été mises à jour, lesquelles **vieillissent**, lesquelles méritent une **refonte** — et reboucler vers la production.

## 2. Périmètre

- **Dans** : liste des `online_page` (`live`) ; **fraîcheur** (last_updated) ; flags `à mettre à jour / obsolète / dépubliée` ; **détection** (scan Firecrawl v1 ; plugins/ping = D2) ; lien `online_page ↔ content_item` d'origine ; **rebouclage** « à mettre à jour » → nouvel item de refonte dans `planning`.
- **Hors** : production initiale (→ `planning`) ; perf (→ `stats`, **en souffrance** D1) ; détail de l'intégration CMS (→ **D2**).

## 3. User stories *(persona : SEO / éditeur)*

- Je vois **toutes mes pages en ligne** et leur **dernière mise à jour**.
- On me signale les pages **vieillissantes** ou dont un **keyword redevient trending** (depuis le Reservoir).
- Je marque une page **à mettre à jour** → un item de **refonte** part en `planning`.

## 4. Fonctionnalités

- F1 — **Sélecteur de site global**.
- F2 — **Inventaire** des pages live : `url · titre · last_updated · statut · content_item lié`.
- F3 ⭐ — **Détection « à mettre à jour »** : âge, (perf — D1, en souffrance), **keyword redevenu trending** (Reservoir).
- F4 — **Détection des pages** : **scan Firecrawl** périodique (v1) ; **plugins/ping** (D2, plus tard).
- F5 — **Lien** `online_page ↔ content_item` ; le statut `live` remonte vers `keywords/planning`.
- F6 — **Rebouclage** : « à mettre à jour » → crée un `content_item` de **refonte** dans `planning`.

## 5. UI / écrans

- **Table des pages live** + filtres (statut, fraîcheur, thème) + détail. Badges `live / à mettre à jour / obsolète`. **DnD/quick-actions** (R2). Tokens `design.md`. Responsive.

## 6. Données & actions

- **Affiché** : inventaire + fraîcheur + flags.
- **Actions** : (re)scanner, marquer à mettre à jour (→ planning), dépublier, ouvrir le content_item.

## 7. Modèle de données

```
online_page(id, site_id, url, title, content_item_id?, status,
            first_published?, last_updated?, freshness_score?,
            flags[needs_update, stale, unpublished], created, updated)
   status ∈ { live, needs_update, stale, unpublished }
```

- Reliée à `content_item` (production). Le scan/CMS met à jour `last_updated`, `status`.
- **Connexion CMS** : voir `_transverse/a-debattre.md` **D2** (plugins/ping) ; v1 = Firecrawl.

## 8. API Hono

- `GET /sites/:siteId/content/online` *(inventaire, filtres)*
- `GET /sites/:siteId/content/online/:id`
- `POST /sites/:siteId/content/online/scan` *(job Firecrawl)*
- `POST /sites/:siteId/content/online/:id/needs-update` *(→ crée un item de refonte dans planning)*
- `PATCH /sites/:siteId/content/online/:id` *(statut)*

## 9. Capacités requises *(fonctionnel — mapping modules TBD)*

Inventaire des pages · **détection de fraîcheur** · **scan Firecrawl** (jobs) · (D2) sync CMS via plugins/ping · rebouclage vers production.

## 10. Tools / capacités MCP

- `online_inventory` (read) · `online_get` (read)
- `online_scan` (write) · `online_mark_update` (write)

> Privé vs public-limité : **TBD**.

## 11. i18n

- Page = locale (langue+pays). UI localisée. Réf `_transverse/i18n.md` (TBD).

## 12. Qualité *(réf. fiches des 128 par slug)*

- **Perf** : inventaire paginé/virtualisé, scans en **jobs**. **A11y** : `data-tables`, `keyboard-navigation`. **Sécu** : isolation **par site**, auth. **Indexation** : noindex.

## 13. Critères d'acceptation

- [ ] L'inventaire liste les pages live avec leur **dernière mise à jour**.
- [ ] Un **scan Firecrawl** met à jour `last_updated`/`status`.
- [ ] Une page **vieillissante** (ou keyword redevenu trending) est flaggée **à mettre à jour**.
- [ ] « À mettre à jour » crée un **item de refonte** dans `planning`.
- [ ] Le **switch de site** isole tout.

## 14. Dépendances & risques · questions ouvertes

- **Dépend de** : `contenu/planning` (publication + refonte), **Firecrawl** (scan v1), **D2** (plugins/ping), `keywords/reservoir` (trending), `_transverse/queue-workers`.
- **Risques** : fiabilité du `last_updated` sans CMS (Firecrawl ≈ approximation). **Questions ouvertes** : fréquence de scan ? critères exacts de « à mettre à jour » (dépend en partie de D1).
