# Salvage de `feature/duckdb-ingest-bench` — plan d'intégration

> Analyse complète : `.superpowers/sdd/duckdb-branch-analysis.md` (2026-07-02).
> Décision requise avant exécution : GO utilisateur (la fin du plan supprime la branche).

**Constat.** 8 des 13 commits ont DÉJÀ atterri sur dev via la réconciliation du 27 juin
(`ac2efc8` + `f9184c4`) : le partitioning keywords est en prod-path sous les migrations
renumérotées **0045_hard_tarot / 0046_fix_keyword_fks** (SQL identique octet pour octet),
et upsert/tests/join-scoping sont à diff zéro vs dev. Ne JAMAIS merger ni rebase la
branche entière : ses migrations 0042/0043 collisionnent avec la séquence dev (0049 pris)
et ses fichiers schéma régresseraient les tables admin/auth/activation.

**Ce qui a de la valeur et n'existe QUE sur la branche** (exactement ce que la
réconciliation avait différé) :

| Commit | Contenu | Risque de pick |
|---|---|---|
| `ac31a3d` | perf(analytics) : UNE instance/connexion DuckDB par job d'import | `processor.ts` intouché sur dev depuis le merge-base → pick propre |
| `5a3bcdd` | bench load-path measure-first (verdict : port DuckDB = NO-GO) | harness autonome |
| `c5a6bff` | harnesses bench scalabilité (load + partition) + résultats mesurés | harness autonome |
| `ae2b8e3` | ADR scalabilité ingest (partitionner keywords par site_id) | doc |
| `007c9aa` | spec hash-partition keywords (local only) | doc |
| `135add0` | plan d'implémentation partitioning | doc |

**Tout le reste se jette** (déjà sur dev sous d'autres hashes, ou obsolète).

## Étapes

1. `git checkout dev && git pull && git checkout -b feature/duckdb-salvage`
2. Cherry-picks dans CET ordre : `ac31a3d`, `5a3bcdd`, `c5a6bff`, `ae2b8e3`, `007c9aa`, `135add0`.
   Conflits attendus : aucun sur `processor.ts` ; possibles trivialités de formatting
   (biome est passé en 2.4.16 depuis) → `bunx biome check --write` sur les fichiers pickés.
3. Amendement doc obligatoire : dans les 3 docs ADR/spec/plan pickés, ajouter une note
   d'entête « Shipped sur dev le 2026-06-27 sous les migrations 0045/0046 (renumérotées
   depuis 0042/0043) » — sinon les numéros cités induisent en erreur.
4. Vérifier que les harnesses bench ne cassent pas `test:all` (ils vivent sous
   `services/analytics/test` / scripts — s'ils s'exécutent comme tests, les gater
   `skipIf` comme les DB tests, ou les déplacer en `scripts/bench/`). Knip peut flagger
   les scripts bench : les référencer dans `knip.json` si besoin.
5. Gate : `bunx tsc --noEmit` + `bun run lint` + `bun run test:all` (1046+ pass attendu).
6. QA perf rapide du pick `ac31a3d` : un import CSV via l'UI (compte QA) → vérifier dans
   les logs d3k qu'une seule init DuckDB apparaît par job.
7. ff-merge dans dev, push, suppression de `feature/duckdb-salvage`.
8. **Suppression de `feature/duckdb-ingest-bench` (local + origin)** — plus rien d'unique
   dessus après extraction. Point de non-retour : c'est le GO explicite demandé.
