---
page: keywords
sous-page: planning
route: /keywords/planning
statut: draft
version: 0.1
transverse-liées: [reservoir-data-model (TBD), i18n, design-system, seo-eeat (brief)]
date: 2026-06-03
---

# CdC — `keywords/planning`

> Ex-`suivi`. **Feuille de route au niveau keyword**, pas de rank-tracking. Reçoit ce que `recherche` a poussé, le regroupe en **page-plans**, priorise, programme, et suit l'avancement. **Pont vers `contenu/planning`** qui exécute la page.

## 1. Objectif

Transformer des keywords ciblés (par pays) en un **plan de production de pages** : regrouper plusieurs keywords en **page-plans** (1 principal + secondaires, pour un pays), **prioriser** (score d'opportunité × pays, override manuel), **programmer** (au bon moment, saisonnalité), **suivre l'avancement** (planifié → en prod → en ligne), et **passer la main à `contenu`** (brief + page).

## 2. Périmètre

- **Dans** : backlog des keyword-targets planifiés non encore groupés ; **page-plans** (regroupement keywords → 1 page) ; vues **board / calendrier / liste** ; priorisation ; programmation (date/saison) ; **suivi d'avancement** ; génération de **brief** (EEAT) ; **promotion vers `contenu/planning`** ; vue **capacité/cadence**.
- **Hors** : ciblage/sélection initiale (→ `recherche`). Rédaction & calendrier éditorial fin / pages réelles (→ `contenu/planning`). **Rank-tracking de positions** (hors périmètre actuel).

## 3. User stories *(persona : consultant SEO)*

- Je vois mon **backlog** de keywords planifiés (par pays) et je les **groupe en page-plans** (1 principal + secondaires).
- Je **priorise** par score d'opportunité, ou je réordonne **à la main**.
- Je **programme** une page **avant le pic saisonnier** de son keyword.
- Je suis l'**avancement** sur un **board** (planifié → en prod → en ligne).
- Quand je suis prêt, je génère un **brief** et je **promeus** la page vers `contenu`.
- Quand `contenu` publie, le statut passe **`en ligne` automatiquement**.
- Je surveille ma **cadence** (pages/semaine) pour ne pas sur-planifier.

## 4. Fonctionnalités

- F1 — **Sélecteur de site global** (isolation `site_id`).
- F2 — **Backlog** : keyword-targets en statut `planned` **non encore groupés**.
- F3 — **Page-plans** : créer une page-plan à partir d'une sélection (1 **principal** + N **secondaires**), pour **un pays**.
- F4 ⭐ — **Suggestions de clustering** : regrouper automatiquement le backlog par **intent/proximité sémantique** → propositions de page-plans.
- F5 — **Vues** : **board** (kanban par statut) · **calendrier** (par date/saison) · **liste**. Togglables.
- F6 — **Priorisation** : tri par **score d'opportunité × pays**, **override manuel** (drag).
- F7 ⭐ — **Calendrier saisonnier** : proposer une date de publication **X semaines avant le pic** (série mensuelle du Reservoir).
- F8 ⭐ — **Capacité / cadence** : nb de page-plans programmés par semaine/mois vs capacité cible.
- F9 ⭐ — **« Prêt à briefer »** : générer un **brief de contenu** (pipeline EEAT) depuis une page-plan.
- F10 — **Promotion vers `contenu/planning`** : crée l'item éditorial, lie `content_ref`.
- F11 — **Suivi d'avancement** : `planifié → en prod → en ligne` ; `en ligne` **remonté auto** depuis `contenu`.

## 5. UI / écrans

- **Board kanban** (colonnes : Backlog · Planifié · En prod · En ligne) — cartes = **page-plans** (titre, pays, principal kw, score, date).
- **Toggle calendrier** (mois/saison, avec marqueurs de pic) et **liste**.
- **Panneau page-plan** : keywords principal/secondaires, pays, priorité, date programmée, brief, lien contenu.
- **Bandeau capacité** (cadence vs cible).
- États vide/chargement/erreur ; responsive (board scroll horizontal, calendrier → liste mobile). Tokens `design.md` (`badge-*`, cards).

## 6. Données & actions

- **Affiché** : backlog, board/calendrier/liste de page-plans, capacité.
- **Actions** : grouper en page-plan, accepter une suggestion de cluster, prioriser (auto/drag), programmer (date/saison), générer brief, promouvoir vers contenu, faire avancer le statut.

## 7. Modèle de données *(ajout au socle — détail dans `_transverse/reservoir-data-model.md`, TBD)*

```
page_plan(id, site_id, country, title?, status, priority?, planned_for?,
          brief_ref?, content_ref?, created, updated)
   status ∈ { planned, in_progress, live }      -- 'live' posé par contenu
page_plan_keyword(page_plan_id, keyword_target_id, role)
   role ∈ { primary, secondary }                -- exactement 1 primary par page_plan
```

- Une **page-plan = 1 pays** ; **locale** = langue du keyword principal + `country`.
- **Unicité** : un `keyword_target` appartient à **au plus une** page-plan (anti-cannibalisation).
- `keyword_target.status` passe à `planned` quand groupé, `live` quand la page-plan est `live`.
- `content_ref` = lien vers l'item de `contenu/planning` (rempli à la promotion).
- **À trancher** : un même keyword secondaire réutilisable sur plusieurs page-plans ? (par défaut **non**).

## 8. API Hono

- `GET /sites/:siteId/planning/backlog`
- `GET /sites/:siteId/planning/board` · `GET …/calendar` · `GET …/list`
- `GET /sites/:siteId/planning/cluster-suggestions`
- `POST /sites/:siteId/planning/page-plans` *(body : principal + secondaires[], country)*
- `PATCH /sites/:siteId/planning/page-plans/:id` *(status, priority, planned_for, title)*
- `POST /sites/:siteId/planning/page-plans/:id/brief` *(→ EEAT)*
- `POST /sites/:siteId/planning/page-plans/:id/promote` *(→ contenu/planning)*
- `GET /sites/:siteId/planning/capacity`

> Routes **préfixées par `siteId`**. `status=live` est posé via le **callback de `contenu`** (contrat à définir).

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

Regroupement keywords → page-plan · **clustering par intent/sémantique** · priorisation (score/pays + manuel) · **programmation saisonnière** · génération de brief (EEAT) · calcul de capacité/cadence · synchronisation de statut avec `contenu`.

## 10. Tools / capacités MCP

- `planning_backlog` (read) · `planning_board` (read) · `planning_capacity` (read) · `planning_cluster_suggest` (read)
- `planning_create_page` (write) · `planning_update` (write)
- `planning_brief` (write — EEAT) · `planning_promote` (write — vers contenu)

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

## 11. i18n

- **Locale d'une page-plan** = langue du keyword principal + `country`. Réf. `hreflang`, `international-url-structure`, `locale-content`.
- UI localisée (clés). Réf `_transverse/i18n.md` (TBD).

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

- **A11y** : board/kanban **opérable au clavier** (réordonnancement), `data-tables`, `keyboard-navigation`, `focus-indicators`, `touch-target-size`.
- **Perf** : `core-web-vitals`, `cache-control` (board paginé/virtualisé).
- **Sécu** : isolation **par site** ; `cookie-attributes`, auth.
- **Indexation** : app privée → `meta-robots` (noindex).

## 13. Critères d'acceptation

- [ ] Grouper une sélection en page-plan : exactement **1 principal**, N secondaires, **1 pays**.
- [ ] Un `keyword_target` déjà dans une page-plan ne peut pas être regroupé ailleurs (anti-cannibalisation).
- [ ] Le board déplace une page-plan `planifié → en prod` ; le drag persiste l'ordre/priorité.
- [ ] **Promouvoir** vers `contenu` crée l'item éditorial et renseigne `content_ref`.
- [ ] La publication côté `contenu` fait passer la page-plan (et ses keyword-targets) en **`live` automatiquement**.
- [ ] Le calendrier propose une date **en amont du pic saisonnier** du keyword principal.
- [ ] « Prêt à briefer » génère un brief EEAT rattaché à la page-plan.
- [ ] La vue capacité compte correctement les page-plans par période.
- [ ] Le **switch de site** isole tout.

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

- **Dépend de** : `keywords/recherche` (source : keyword-targets `planned`), `_transverse/reservoir-data-model` (`page_plan`), `contenu/planning` (promotion + retour `live`), pipeline **EEAT** (brief).
- **Risques** : **contrat de synchronisation** du statut `live` avec `contenu` ; qualité du clustering automatique ; cohérence priorité auto vs manuelle.
- **Questions ouvertes** :
  - Contrat exact du **retour `live`** depuis `contenu` (webhook/événement ?).
  - Un secondaire **réutilisable** sur plusieurs page-plans ? (défaut : non).
  - La **capacité cible** est-elle réglée par site, par utilisateur, globale ?
