Audits · juin 2026Audit code mort & legacy : 11 juin 2026

Audit code mort & legacy : 11 juin 2026

Audit complet de la codebase : fichiers orphelins, dépendances mortes, artefacts cassés, conformité bonnes pratiques 2026+. Outillage : knip 6.16.1 (config commitée : knip.json) + vérifications manuelles par grep sur…

Audit complet de la codebase : fichiers orphelins, dépendances mortes, artefacts cassés, conformité bonnes pratiques 2026+. Outillage : knip 6.16.1 (config commitée : knip.json) + vérifications manuelles par grep sur chaque cluster majeur (taux de faux positifs mesuré sur échantillon : 0/12, les seules « références » restantes étaient des barrels eux-mêmes morts ou des commentaires).

Relancer l'analyse : pnpm dlx knip (le repo n'a pas knip en devDep — voir recommandation §8).

Synthèse

CatégorieVolumePriorité
Artefacts cassés (config prettier, script référencé par l'UI)3P0 — réparer
Fichiers source orphelins (jamais importés depuis une entrée)239P1 — supprimer
Dépendances npm mortes37 (+2 à rebrancher)P1 — désinstaller
Scripts / assets / contenu / i18n orphelins7 itemsP2
Exports & types morts dans des fichiers vivants~2 695 (concentrés dans les barrels export *)P3 — gate CI

Bonnes pratiques 2026 : le socle est sain (§7). Le problème n'est pas la qualité de la config mais l'accumulation de strates remplacées jamais supprimées — chaque refonte (MCP, workflow canvas, Base UI, scanner CLI → web) a laissé l'ancienne implémentation sur place.


1. P0 — Cassé (à réparer, pas du nettoyage)

1.1 .prettierrc.cjs requiert un package qui n'existe plus

module.exports = require("@boostecom/prettier-config")

@boostecom/prettier-config est un vestige du mono-repo à workspaces (aplati en avril 2026). Conséquence : pnpm format et pnpm format:check échouent, l'intégration éditeur est morte, et prettier-plugin-tailwindcss (installé) ne tourne plus. Correctif : config inline .prettierrc.json avec "plugins": ["prettier-plugin-tailwindcss"].

1.2 scripts/marketplace-activate.sh appelle un script supprimé

Le script appelle node scripts/seed-marketplace.mjs : fichier inexistant. Le seeding marketplace est automatique au cold-start depuis sync-from-content.ts (cf. CLAUDE.md). Pire : deux pages dashboard affichent encore ce script dans un message d'erreur utilisateur :

  • src/app/(dashboard)/account/saved/page.tsx:99
  • src/app/(dashboard)/sell/dashboard/page.tsx:44

Correctif : supprimer le script + remplacer les 2 messages (le heal se fait via le schema guard / POST /api/admin/db/push, plus aucun step manuel).

1.3 CLAUDE.md décrit un serveur MCP qui n'est plus monté

CLAUDE.md (§Outils Shopify) présente src/features/shopify/mcp comme LE serveur MCP store-management. En réalité le serveur monté en production est src/app/api/mcp/[storeId]/ (build-server + register-tools via @/features/ai/sdk/sdk/shopify-bridge). L'arbre features/shopify/mcp n'est importé nulle part (sauf mcp/shopify/client.ts, 2 consommateurs). Correctif : mettre à jour CLAUDE.md + supprimer l'arbre mort (§2.1).


2. P1 — Clusters legacy entiers (vérifiés : 0 consommateur)

2.1 Ancien serveur MCP Shopify standalone : 25 fichiers

src/features/shopify/mcp/ : http.ts, index.ts, security.ts, tools.ts, shopify/server.ts, shopify/helpers.ts + 19 fichiers d'outils (shopify/tools/{blogs,bulk-operations,collections,customers, fulfillments,gift-cards,inventory,marketing,markets,metaobjects, navigation,orders,pages,products,shop,theme,translations,webhooks}.ts). Remplacé par la route Remote MCP /api/mcp/[storeId]. Exception à GARDER : shopify/client.ts (importé par features/ai/branches/shared.ts et la calibration).

2.2 Ancien harness d'agents : 19 fichiers

src/features/ai/agents/ : agent.ts, agents/{index,reader,router, router-prompt,writer}.ts, tools/{bash,edit,read,write,index}.ts, config.ts, hooks.ts, identity.ts, index.ts, memory.ts, skills.ts, stream.ts, workflow.ts. C'est un prototype d'agent (outils bash/read/write façon CLI) antérieur à l'orchestrator Atlas. À GARDER dans le même dossier (vivants, importés partout) : identity-registry, identity-types, autonomy, wrap-tools-with-autonomy, tool-permission-matrix.

2.3 Copie morte du workflow canvas : 16 fichiers

  • src/components/patterns/workflow/** (11 fichiers) — duplicata de src/features/ai/workflow/canvas/ui/ (l'arbre vivant). La copie a raté un bugfix appliqué seulement côté live (de2947d store-browser toolbar) : preuve que c'est une strate abandonnée.
  • src/components/canvas/primitives/** (5 fichiers : console-stream, task-list, version-timeline, view-toggle, index).

2.4 Ère CLI du scanner tracking : 20 fichiers

src/features/tracking/scan/ : reporters/** (terminal, html×4, json, markdown, dashboard), batch.ts, compare.ts, share.ts, store.ts, mcp-server.ts, cmp/** (3), config/index.ts, index.ts, lib/web-vitals-injection.ts. Le scan vit désormais dans les routes /scan/tracking + jobs ; les reporters terminal/HTML datent de l'époque outil CLI.

2.5 Reste du cluster features/ai : ~17 fichiers

Chat/voice morts (runtime/tools/voice/{mic-fft,recording, use-mic-volume-bars}, voice-recording-inline.tsx), intégrations Notion abandonnées (chat/actions/notion.ts, runtime/integrations/notion/notion-add-instruction.tsx, multi-step-form.tsx), agent-header.tsx, ai-chat-context.tsx, chat/hooks/use-mobile.ts, chat/layout/design-system.ts, chat/lib/integrations/agent/tasks.ts, chat/lib/integrations/knowledge/memory.ts, context/index.ts, orchestrator/sdk-integration/index.ts, prompts/system-helpers.ts, tasks/actions.ts.

2.6 Widget workflow embarquable jamais shippé : 6 fichiers

src/features/ai/workflow/widget/** (widget, widget-provider, adapters ai-gateway + index, config/types, index) : consomme @workflow/ai + @workflow/core (deps mortes §4). Plus : canvas/index.ts, canvas/workflow-toolbar.tsx, canvas/ui/preview/blocks/{shopify,vercel, viewer}/index.tsx (barrels), modes/index.ts, et 7 fichiers nodes/store-browser/ (connectors-popover, mcps-sheet, node-status-bar, theme-switcher, use-screenshot, shopify-bookmarks, url-validation).

2.7 Micro-modules src/lib/* scaffoldés jamais branchés : 24 fichiers

ModuleFichiers
lib/collaboration/index, manager, types (3)
lib/mcp/index, registry, types (3)
lib/prompts/builder, index, types (3)
lib/validation/feedback, index, validator (3)
lib/frameworks/index, registry, types, shopify/adapter, vercel/adapter (5)
lib/channels/api, index (2)
lib/providers/index, tenant-provider (2)
lib/sops/index.ts, lib/memory/index.ts, lib/orchestrator/index.ts, lib/health/index.ts, lib/storage/index.ts (barrel seul — lib/storage/blob reste vivant), lib/store/resolve.ts, lib/browser/bright-data-adapter.ts, lib/intelligence/types.ts, lib/observability/types.ts(9)

2.8 Composants registry UI installés jamais consommés : 45 fichiers

src/components/ui/ : toast + use-toast (Radix Toast officiellement retiré, sonner est le canon), sidebar, menubar, navigation-menu, breadcrumb, pagination, command (→ dep cmdk), drawer (→ vaul), combobox, context-menu, aspect-ratio, toggle, toggle-group, skeleton, use-mobile, shadcn-compat/dropdown-menu, border-beam, emoji-selector, field, item, version-selector, logo (barrel index.ts seul). Chacun = dossier <name>/{<name>.tsx,index.ts}. Réinstallables à la demande via npx shadcn@latest add <name>, les garder « au cas où » viole la règle registry-first (le registre EST l'inventaire).

2.9 Services / divers : 13 fichiers

services/promotions/{index,types}.ts, services/algorithms/intelligence/{org-coherence-check, inference/creative-clusterer,inference/creative-vision-analyzer, providers/klaviyo-benchmarks,bulk-indexer/index,probes/stubs}.ts, services/algorithms/{compliance/types,retrieval/types}.ts, modules/analytics/{index,tracking/stripe-attribution}.ts, modules/auth/permissions.ts, modules/email/templates/index.ts, features/notes/actions.ts, features/reports/actions.ts.

2.10 Composants app/shell/patterns morts : ~40 fichiers

  • app/(minimal)/scan/tracking/_components/ : methodology-section, robot-header, copyable-code-block, ecosystem-grid (4)
  • app/(dashboard)/admin/content/marketplace/_components/ : bulk-actions, draft-queue-list (2)
  • components/patterns/ : execution-planner complet (6), ai-elements/index, agent/index, context/index, intelligence-pulse, vitals/index, workflow/ui (déjà compté §2.3) (12)
  • components/shells/ : team-particles, team-comparison-drawer, sidebars/{index,sidebar-nav}, shells/index, registry/{index, registry-shell} (7)
  • components/shared/ : intelligence/store-intelligence-banner, theme-switcher/**, hooks/index, shared/index, types/index (6)
  • components/hooks/{index,use-logs-count}.ts, components/hub/ad-library.tsx (3)
  • config/atlas-version.ts, types/knowledge.ts (2)

Liste exhaustive machine-readable : sortie pnpm dlx knip --reporter json, section files (239 entrées).


3. P1 — Dépendances npm mortes (vérifiées une à une)

3.1 Migration Radix → Base UI terminée — 23 packages

Les composants src/components/ui/* wrappent désormais @base-ui/react ; plus AUCUN import Radix dans src/ : @radix-ui/react-{accordion,aspect-ratio,avatar,checkbox,collapsible, context-menu,dropdown-menu,menubar,navigation-menu,popover,progress, radio-group,scroll-area,select,separator,slider,tabs,toast,toggle, toggle-group} (20) + radix-ui (pkg consolidé) + @mdx-js/mdx + @mdx-js/react (le MDX passe par next-mdx-remote/rsc qui embarque les siens en transitif).

3.2 Consommées uniquement par des fichiers morts — 7

cmdk (ui/command), vaul (ui/drawer), react-virtualized + @types/react-virtualized (voice/mic-fft), @workflow/ai + @workflow/core (widget §2.6), shiki.

3.3 Jamais importées — 9

@tabler/icons-react (0 import — lucide : 595 fichiers, hugeicons : 26), @shopify/codemirror-language-client, @shopify/theme-check-browser, @shopify/theme-language-server-browser (le liquid-editor utilise @codemirror/* directement), embla-carousel-react, input-otp, react-day-picker, react-resizable-panels, web-vitals (chargé depuis CDN unpkg par vitals/collector/storefront-bundle.ts, jamais depuis npm).

3.4 devDeps — 3 mortes, 2 à REBRANCHER (pas supprimer)

  • Mortes : autoprefixer (bundlé dans @tailwindcss/postcss v4), tailwindcss-animate (plugin v3, c'est tw-animate-css qui est importé dans globals.css:12), @types/react-virtualized.
  • À rebrancher : prettier-plugin-tailwindcss (dans la nouvelle .prettierrc.json, cf. §1.1) et eslint-config-prettier (à ajouter en dernier élément du flat config eslint.config.mjs : installé mais jamais référencé).

3.5 Faux positifs knip : à GARDER

tw-animate-css (import CSS, invisible pour knip), toutes les deps référencées par next.config.mjs / postcss / runtime Vercel.


4. P2 — Scripts, assets, contenu, i18n

ItemConstatAction
scripts/scope-hub-css.mjsCassé : lit _backup/styles/ (supprimé) ; l'output src/styles/hub/hub.css est déjà commitéSupprimer
scripts/create-quarterly-stripe-prices.mjsOne-off jamais référencéSupprimer (ou déplacer en gist ops)
scripts/fetch-partner-favicons.mjsOne-off jamais référencé (logos déjà dans public/brands/)Supprimer
public/boostecom copy.png80 K, nom avec espace, 0 référenceSupprimer
content/changelog/Orphelin — le changelog vit en DB (ChangelogEntry, seed inline dans prisma/seed.ts, promotion auto via workflow auto-changelog.yml)Supprimer le dossier
Namespaces i18n settings + stepperPresetsPrésents dans les 6 locales, 0 useTranslations/getTranslationsSupprimer des 6 fichiers
Cohérence locales✅ Les 6 fichiers ont des clés top-level identiques (35 namespaces)—

5. P3 — Exports morts dans fichiers vivants (~2 695)

Concentrés dans les barrels export * : top offenders components/patterns/ai-elements/chat/index.ts (293), canonical/index.ts (54), lib/security/index.ts (50), features/connectors/index.ts (49), types/tracking.ts (38), orchestrator/index.ts (38), features/vitals/index.ts (35)…

Ne PAS purger à la main : c'est le pattern barrel qui fabrique du mort en continu (et casse le tree-shaking + alourdit le graphe TS). Traitement :

  1. knip en CI (§8) fige le stock ;
  2. à chaque passage dans un module, remplacer export * par des exports nommés réellement consommés.

6. Doublons restants (hors fichiers morts)

DoublonVivantMort
Workflow preview blocksfeatures/ai/workflow/canvas/ui/preview/blocks/components/patterns/workflow/ui/preview/blocks/ (§2.3)
use-mobile ×3celui consommé par le code vivantcomponents/ui/use-mobile/ + features/ai/chat/hooks/use-mobile.ts
Toastssonnerui/toast + ui/use-toast + @radix-ui/react-toast
Icônes ×3lucide-react (canon, 595 fichiers) + @hugeicons (26 fichiers — consolidation possible mais VIVANT)@tabler/icons-react (0)

7. Bonnes pratiques 2026 — état des lieux

Conforme ✅

  • TypeScript : strict, moduleResolution: Bundler, ES2022, TS 5.9.
  • ESLint 9 flat config + plugin Next core-web-vitals + react-hooks ; overrides justifiés (no-console warn sauf warn/error).
  • Tailwind 4 natif : @import "tailwindcss", @theme inline, @source, zéro directive v3, animations avec prefers-reduced-motion.
  • Next 16 : src/proxy.ts (nouvelle convention middleware), App Router pur, images optimisées avec allowlist, serverExternalPackages correct (Prisma/pg/playwright).
  • Outillage : Node 22 pinné (engines + .nvmrc), packageManager pnpm 10 pinné, onlyBuiltDependencies maîtrisé.
  • Gates : pre-push db:guard:check && typecheck (simple-git-hooks), CI audit-memory-scope (privacy tenant) + auto-changelog, 47 fichiers de tests vitest.
  • Vitest : node env, globals: false, secrets déterministes, seam server-only.

Compromis assumés ⚠️ (documentés dans le code, pas des bugs)

  • next.config.mjs:21-22 ignoreBuildErrors + ignoreDuringBuilds : compensés par pre-push + CI (~15 min économisées par deploy, contexte issue #233). Risque résiduel : git push --no-verify. À réévaluer si l'équipe grossit.
  • 46 crons Vercel (limite 100) : surveillé via /admin/operations/crons.

À corriger 🔧

  • Prettier cassé (§1.1) — la seule vraie rupture de toolchain.
  • eslint-config-prettier installé mais pas branché (§3.4).
  • Optionnel : verbatimModuleSyntax: true dans tsconfig (future-proof).

8. Garde-fou : empêcher le retour du code mort

  1. Ajouter knip en devDep + script "deadcode": "knip" : la config knip.json est déjà commitée (entrées Next.js + scripts + instrumentation, generated guard ignoré).
  2. Gate CI : job pnpm knip --reporter compact après le typecheck (ou au pre-push). Démarrer en non-bloquant, passer bloquant une fois le stock purgé.
  3. Règle d'or registry-first : un composant shadcn retiré du code se DÉSINSTALLE (le registre le réinstalle en 5 s), pas de stock dormant.
  4. Pas de nouveaux barrels export * : exports nommés uniquement.

9. Triage v2 — « orphelin » ≠ « poubelle » (revue produit du 11 juin)

Après revue fichier par fichier (lecture du code, substance, équivalent vivant, historique git), les 239 orphelins se répartissent en trois piles :

Pile 1 — À CONNECTER (~45 fichiers) : travail réel jamais branché

Implémentations substantielles SANS équivalent vivant : à monter, pas à supprimer. Point de montage identifié pour chacune :

ChantierFichiersPoint de montage
Workspace V2components/canvas/primitives/ (console-stream SSE, task-list dnd-kit, version-timeline, view-toggle) + server actions features/ai/tasks/actions.ts, features/notes/actions.ts, features/reports/actions.ts[orgSlug]/[storeSlug]/workspace/page.tsx (les actions CRUD sont prêtes, la UI dnd-kit aussi — il manque le montage des panneaux)
Store-browser : features finies non affichéesmcps-sheet (MCP par store + enable/disable), node-status-bar (372 l.), theme-switcher, connectors-popover, use-screenshot (Browserbase), shopify-bookmarks, url-validation + canvas/workflow-toolbar.tsx (l'API /api/workflow/[id] EXISTE)nodes/store-browser/ (mode-views / index) + canvas workflow
Hub Ad Library v2components/hub/ad-library.tsx — grille créatives façon outil du marché, gating paywall inclus, « replacing the shared table rows »surface « Ad Library » du hub intelligence
Execution Plannerpatterns/ai-elements/execution-planner/ (6 fichiers complets : planner-view, step-card, timeline, agent-avatar)panneau d'orchestration dans ai-chat.tsx (visualiser les plans Atlas)
Intelligence onboardingintelligence-pulse.tsx (chip Strategic Action Plan), store-intelligence-banner.tsx (états visibility/loading/found/missing)shell-client.tsx / cockpit store
Home / Agentsteam-particles.tsx (canvas mesh + reduced-motion), team-comparison-drawer.tsx (comparateur 3 agents, vaul)team-carousel.tsx (background + trigger), ou /agents
Scan tracking setupcopyable-code-block.tsx, ecosystem-grid.tsx (badges supported/beta/coming_soon)pages /scan/tracking + /setup/tracking
Admin marketplacebulk-actions.tsx (batch reject + raison), draft-queue-list.tsxadmin/content/marketplace/page.tsx
Notion instructionsnotion-add-instruction.tsx + chat/actions/notion.ts (rate-limited) + knowledge/memory.ts (buildMemoryContext)panneau intégrations du chat
Pipeline créatives MLcreative-vision-analyzer.ts (vision LLM budget-guardé) + creative-clusterer.ts (clustering embeddings → canonical L4)orchestrateur intelligence (post-scan) — la « ML recos v2 » des docs
Intelligence diversklaviyo-benchmarks.ts (→ EmailSection), org-coherence-check.ts (s'auto-registre, manque le cron), bulk-indexer/ (→ action admin)canonical pipeline + cron + admin
Scraper tier 3lib/browser/bright-data-adapter.ts — la checklist env PROMET ce maillon (BRIGHTDATA_*) mais il n'est PAS branché dans fetch-providers.tschaîne fetch-providers (escalade Firecrawl → Browserbase → BrightData)
Consent enginetracking/scan/cmp/ (discover + validate, 430 l. Playwright)moteur de scan (enrichit les checks compliance c-01…c-07)
Design system finisborder-beam, emoji-selector, use-logs-count, config/atlas-version.tsà disposition (garder) ; atlas-version → surfacer sur /changelog

Pile 2 — LEGACY CONFIRMÉ (~165 fichiers) : remplacé, zéro perte UX

Tout a un équivalent vivant ou est un stub vide : détail aux §2-§4. Résumé : vieux serveur MCP (25, remplacé par /api/mcp/[storeId]), vieux harness agents (19, remplacé par l'orchestrator), copie morte du workflow canvas (11, un bugfix n'existe que côté vivant), ère CLI du scanner (17 : reporters terminal/html/json/markdown, batch, compare, share, store, mcp-server… SAUF cmp/), ancienne voice UI (4 : mic-fft, recording, use-mic-volume-bars, voice-recording-inline, remplacée par voice-toolbar-bar.tsx, les commentaires du code le disent), stubs chat (agent-header, ai-chat-context, multi-step-form, agent/tasks in-memory…), composants registry shadcn standards jamais consommés (~41, réinstallables en 5 s, AUCUN travail custom dedans), scaffolds lib/* superseded (memory → features/ai/memory, orchestrator → features/ai/orchestrator, mcp → features/connectors, prompts → features/ai/prompts, validation, collaboration in-memory, channels, providers, health), barrels morts (email templates, analytics, shells, shared…), version-selector (doublon de patterns/navigation/version-selector vivant), shared/theme-switcher, robot-header + methodology-section (stubs sans JSX), probes/stubs, auth/permissions (RBAC vivant dans server.ts), stripe-attribution (19 l. « prep only »), types orphelins (knowledge, compliance, retrieval, intelligence, observability).

Pile 3 — DÉCISION PRODUIT (7 sujets)

SujetContenuRecommandation
Widget chat embarquablefeatures/ai/workflow/widget/ (~350 l. complets, provider + adapter AI Gateway)GARDER si l'embed externe (PageBuilder/sites tiers) est au roadmap, sinon supprimer
lib/frameworks/registry + adapters Shopify/Vercel pour pipeline de code-gen (362 l. réelles)GARDER si la génération de code multi-framework est planifiée
services/promotions/MVP types + helpers, persistence « deferred »Supprimer (réécrire avec Prisma le jour venu)
lib/sops/SOP MetaGPT-style (245 l. de design)Supprimer (l'orchestrator est free-form) ou garder en référence
lib/store/resolve.ts3 helpers PROPRES que chaque page ré-implémente localementCONNECTER : adopter dans les pages dashboard (dé-duplication)
sidebar-nav.tsx, registry-shell.tsxgénériques propres sans consommateur identifiéSupprimer (réécrivables), sauf refonte admin imminente
ui/drawer + dep vaulteam-comparison-drawer (Pile 1) s'appuie sur vaulConserver tant que le drawer est en Pile 1

Plan d'exécution révisé

VagueContenuRisque
AP0 : correctif prettier + marketplace-activate.sh + 2 messages UI + CLAUDE.md (MCP + BrightData)Nul
BSuppression Pile 2 UNIQUEMENT (~165 fichiers) + typecheck + buildNul (équivalent vivant vérifié pour chaque cluster)
CDeps : désinstaller celles liées à la Pile 2 (~35 : Radix×21, tabler, shopify×3, workflow×2, cmdk, react-virtualized+types, shiki, web-vitals, mdx×2, embla, input-otp, react-day-picker, react-resizable-panels, autoprefixer, tailwindcss-animate) ; GARDER vaul ; rebrancher prettier-plugin-tailwindcss + eslint-config-prettierFaible
DScripts/assets/content/i18n (§4)Nul
Eknip en devDep + gate CI non-bloquant + ignore knip sur la Pile 1 le temps du branchementNul
FBranchements Pile 1 — par chantier, dans l'ordre de valeur : (1) Store-browser features finies, (2) Hub Ad Library v2, (3) Workspace V2, (4) Admin marketplace, (5) Intelligence (pulse + banner + ML pipeline + BrightData + cmp), (6) Execution planner, (7) Home/Agents, (8) Scan setup, (9) NotionPar lot, chaque branchement testé

Les décisions Pile 3 peuvent tomber à tout moment : rien dans A-E n'y touche.


10. Bilan d'exécution (PR #274, 11 juin 2026)

Toutes les vagues exécutées. État final : pnpm deadcode exit 0, typecheck clean, 407 tests verts, builds preview Vercel verts.

VagueRésultat
APrettier réparé (.prettierrc.json + plugin Tailwind), script cassé supprimé + 2 messages UI corrigés, CLAUDE.md MCP corrigé
B176 fichiers legacy supprimés (-21 865 lignes)
C40 packages désinstallés, eslint-config-prettier branché
DAssets/contenu/i18n/scripts orphelins purgés
Epnpm deadcode (knip) en CI — fichiers/deps = bloquant, exports = warning
FPile 1 entièrement branchée (7 chantiers, ~45 fichiers)

Branchements vague F (commits 97d1a74 → d1e5063) : admin marketplace bulk-review · Hub Ad Library v2 (slot intel/intelAds pré-câblé) · Workspace V2 complet (la route était une redirection morte) · store-browser ×8 (status bar, MCPs sheet, theme switcher, connectors popover, screenshot, bookmarks, validation URL, workflow toolbar) · chat (PlannerView sur getStrategicPlan

  • instructions Notion + memory overlay) · home/setup (particles, comparateur d'agents, ecosystem grid, snippets copiables) · intelligence (pulse chip, banner, BrightData tier-3, benchmarks Klaviyo, coherence sweep hebdo, bulk-indexer admin, pipeline ML créatives borné mode-full/3 stores/50 créatives/budget).

Bonus découvert en route : meta-graph.ts importait dynamiquement facebook-nodejs-business-sdk jamais installé, la vérification Meta Pixel des scans échouait depuis toujours. Réécrit en fetch Graph API natif (la feature fonctionne désormais).

Reste parqué (allowlist knip.json) : plus rien. Le lot final (PR de suivi, 12 juin) a branché les quatre derniers parqués : consent engine cmp/ dans le moteur de scan (flag cmpInteraction, défaut true = comportement historique ; les 4 événements SSE CMP s'allument dans une UI qui les attendait), widget chat embarquable sur /embed/widget (adapter réaligné sur le contrat /api/chat, exception frame-ancestors scopée), détection de framework au wizard connect (detectFrameworkFromFiles soft-fail), resolveStoreBySlug adopté par 6 pages, et les spares design-system (version Atlas sur /changelog + admin health, badge logs sur la console store-browser, BorderBeam sur la carte pricing populaire, EmojiSelector en remplacement de la rangée d'emojis codée à la main du feedback). Bonus : CMP_DETECTED partait après l'acceptation du banner (bug), corrigé en route. L'allowlist knip ne contient plus que le schema guard généré et le vendor ai-elements.