# Recherche — réalignement sur le CdC (vue Réservoir) + page staged conservée

**Date:** 2026-06-09
**Source de vérité:** `~/Documents/seo insight/docs/specs/keywords/{recherche,reservoir,export-import}.md` + `_transverse/conventions.md` (R1/R2).

## Contexte / divergence

Le CdC définit **Recherche = une vue sur le Réservoir filtré** (F2 « Source = Reservoir ») + la **matrice de ciblage `keyword × pays`** (`keyword_target`: candidat/planifié/en ligne). Il n'y a **pas** de notion de « stage research » : tout keyword du Réservoir est ciblable en Recherche, et le flux vers Planning passe par `keyword_target.status → planned`.

L'implémentation actuelle a introduit un modèle `stages[]` : Recherche = `stages.includes("research")` (un sous-ensemble qu'on **pousse** depuis le Réservoir via « → Recherche »). C'est la divergence à corriger.

**Effet de bord:** une fois Recherche = le Réservoir, « importer dans Recherche » est **automatique** (importer dans le Réservoir suffit) — aucune destination d'import séparée à coder (le besoin initial est subsumé).

## Décisions (validées)

1. **`/keywords/recherche` (NEW, CdC)** : montre **tout le Réservoir du site** (on retire le filtre `stages.includes("research")`). Garde **tout** l'existant : matrice de ciblage, sync GSC, exclusions (« Exclus »), export enrichissement, colonnes consensus, pagination, KeywordSheet.
2. **`/keywords/recherche-staged` (OLD)** : comportement actuel exact (sous-ensemble `stage research`), **gardé live** + entrée de nav. Sert de fallback.
3. **Composant partagé** : un seul `ResearchContainer` avec un prop **`stageFilter?: boolean`**. `/recherche` → `false` (tout le Réservoir) ; `/recherche-staged` → `true` (filtre `stage research`). Zéro duplication, deux routes live.
4. Le **sync GSC** continue de poser `stage research` (inchangé) → alimente toujours la page staged. Rien cassé côté GSC/exclusions/consensus.

## Hors scope (inchangé pour l'instant)
- Le passage Réservoir→Planning par drag-and-drop (R2) et la refonte des bulk-actions du Réservoir — chantier séparé.
- Les F6/F7/F8 du CdC recherche (gaps/fan-out, saisonnier, shortlist) — non démarrés, restent backlog.
- L'auto-détection à l'import lourd (R1) — séparé (l'import lourd garde le choix manuel de source pour l'instant).

## Découpage technique

- **`src/components/keywords/research/research-container.tsx`** — ajouter le prop `stageFilter?: boolean`. Appliquer le filtre `stages.includes("research")` **uniquement si `stageFilter`** dans : (a) le seed `rows` depuis `initialKeywords` n'est PAS refiltré ici (la page fournit le bon set), (b) `load()` (refetch sur changement de site), (c) le refetch `onSaved` du `KeywordSheet`. Tout le reste inchangé.
- **`src/app/(app)/keywords/recherche/page.tsx`** — l'initial fetch **ne filtre plus** par stage (passe tous les keywords research-éligibles = tout le Réservoir) ; passe `stageFilter={false}`. (Idem `initialExclusions` déjà en place.)
- **Create `src/app/(app)/keywords/recherche-staged/page.tsx`** — copie de l'ancienne page : initial fetch **filtré** `stages.includes("research")`, passe `stageFilter={true}`, breadcrumb « Recherche (staged) ».
- **Nav** (`src/components/app-sidebar.tsx` ou le fichier de config nav keywords) — ajouter l'entrée **« Recherche (staged) »** sous Keywords, route `/keywords/recherche-staged`.

## Tests
- **Pur/logique** : le filtre conditionnel est trivial (une condition) → pas de nouveau test unitaire dédié ; couvert par tsc + la vérif live.
- **Live (d3k)** : `/keywords/recherche` montre **tous** les keywords du site (count == Réservoir, pas seulement les 12 staged) ; la matrice/ciblage/sync/exclusions/export marchent ; `/keywords/recherche-staged` montre **uniquement** le sous-ensemble staged (count == ancien) ; la nav expose les deux.

## Risques
- **Volumétrie** : la nouvelle Recherche peut afficher des centaines de keywords → la **pagination existante** (50/page) couvre ça.
- **Confusion Réservoir vs Recherche** : ils montrent désormais le même set ; la différence = Recherche ajoute la **matrice de ciblage** + colonnes Pos. GSC / Pays ciblés. Acceptable (c'est le modèle CdC). À surveiller en UX.
