Nettoyage avant indexation : tableau de décision
Les rapports bruts sont consolidés ici et dédoublonnés. Chaque ligne porte sa preuve (fichier:ligne) dans les rapports sources.
-
Date : 2026-09-25
-
Base :
origin/maine3e4b572a(après le merge de #1525). -
Méthode : quatre audits en lecture seule menés en parallèle :
- architecture et URLs ;
- SEO technique ;
- contenu faible, périmé ou faux ;
- code et clés i18n morts.
Les rapports bruts sont consolidés ici et dédoublonnés. Chaque ligne porte sa preuve (fichier:ligne) dans les rapports sources.
-
Pourquoi maintenant : le site est peu indexé. Un renommage coûte aujourd'hui une redirection. Il en coûtera une par URL indexée plus tard, et six une fois les URLs localisées.
0. Déjà corrigé
| # | Problème | Correctif |
|---|---|---|
| 0.1 | Fuite P0. /roadmap publiait ~300 items de backlog internes : titres internes, chemins, branches, PR du dépôt privé. Certains décrivent des failles de sécurité encore ouvertes (security-identity/0421, 0422). Chaque item avait sa page et son entrée de sitemap. | #1532 (growth-web/3001, mergée le 2026-09-25) : filtre backlogRef = null sur l'index, le détail, le sitemap et le vote. Une garde empêche le retour. Aucune donnée n'est supprimée. |
1. Décisions qui n'appartiennent qu'au propriétaire
Tranché le 2026-09-25 : le propriétaire a accepté toutes les recos, D1 à D18. D1 est écrite dans l'ADR 0038, qui remplace l'ADR 0002, et
growth-web/0393est archivé. D13 reste un item de décision ouvert, parce qu'il faut des faits que seul le propriétaire détient :growth-web/0628pour les identifiants LCEN et le médiateur,billing/0373pour le trimestriel. D12 a son pendant produit dansintelligence/0388(SimilarWeb).
| # | Question | Options | Reco | Pourquoi maintenant |
|---|---|---|---|---|
| D1 | Langue dans l'URL (ADR 0002, growth-web/0393). Aujourd'hui la langue vit dans un cookie. Google n'indexe donc que l'anglais, et ~31 000 mots traduits ne rankeront jamais. | a) as-needed : EN reste /pricing, /fr/pricing, etc. ; b) always : /en/pricing partout ; c) rester en cookie (traductions réservées aux connectés) | a), pages publiques seulement. Remplacer ADR 0002, réserver dès aujourd'hui en fr de es it pt comme slugs d'org, construire la couche après les renommages. | b) déplace TOUTES les URLs : pas cher aujourd'hui, très cher dans 3 mois. a) ne déplace aucune URL existante. Se tranche avec app-shell/0365 (ISR), puisque la langue dans l'URL retire un des deux verrous. |
| D2 | /insights devient /blog | a) /blog ; b) garder /insights et renommer le panneau Insights du cockpit | a). Le code, le contenu, la clé de nav et le slug réservé disent déjà blog. | 67 fichiers, un 308 /insights/:path* (RSS compris) |
| D3 | Nom du produit MCP. Un seul concept porte aujourd'hui cinq noms : API, Bridge AI, Shopify MCP server, BoostEcom MCP, Bridge AI (MCP). | a) « Shopify MCP » à /features/mcp ; b) garder /features/api et choisir un seul nom | a). Retirer « Bridge AI » de la copy publique et sortir la ligne du menu Marketplace. Les guides passent à /features/mcp/connect/[client]. | 80 fichiers. « API » désigne aussi l'API REST Intelligence. |
| D4 | Fusion /network/referral + /network/affiliate : même ledger, mêmes conditions, deux pages indexables sur la même requête | a) une page /network/affiliate avec deux sections d'audience, et 308 depuis referral ; b) garder les deux | a). Remplacer ADR 0015, qui les gardait parce qu'elles étaient « déjà indexées », prémisse fausse. | 21 fichiers |
| D5 | L'équipe IA. Deux jeux de rôles contradictoires. Profils publics : acquisition payante, conversion, email/SMS, analytics, rétention. Docs et runtime : Marketing, Merchandising, Operations, Intelligence, Support. /features/ai-team duplique /agents. | Rôles : a) ceux du runtime (ce que le routeur fait vraiment) ; b) ceux des profils. Slugs : c) prénoms (/agents/maya) ; d) rôles (actuel). | a) + c). Fusionner /features/ai-team dans /agents (308), libellé de nav « AI agents ». En JSON-LD, les agents deviennent SoftwareApplication au lieu de Person. | Les slugs par rôle ont déjà dérivé une fois (growth-web/0647). Les prénoms, eux, ne bougent pas. |
| D6 | Le cluster Learn. Les 16 tutos sont des walkthroughs produit, pas du contenu communautaire. Les cours tiennent en 1 leçon. | — | /community/tutorials devient /tutorials, /community/courses est supprimé (sa leçon est fusionnée dans /docs/agents, 308), et Docs passe en entrée de nav de premier niveau. Le menu Community devient Resources (Learn / Community / Track). | La leçon cite un outil qui n'a jamais existé et un digest quotidien qui n'existe pas. |
| D7 | Carrières. Deux jobboards se contredisent : 5 postes JSON dans /marketplace/jobs (avril, contact @boostecom.fr) contre 2 postes réellement ouverts sur /community/careers. | — | Supprimer les 5 JSON, déplacer /community/careers vers /careers (308), footer. | Les deux sont dans le sitemap aujourd'hui. |
| D8 | Placeholders marketplace. « BoostEcom Theme / App / Tool / Prompt / Skill » sont publiés LIVE et « Verified ». Le registre interne les marque coming_soon, ou rien ne les porte (aucune app Shopify embarquée n'existe). Hire, agencies et freelancers ne contiennent que toi et ton agence. | — | Supprimer les placeholders non livrés, renommer l'annonce extension en « BoostEcom Spy », mettre en noindex les catégories à moins de 3 annonces LIVE tierces et hire / agencies / freelancers tant que l'inventaire est interne. /marketplace/newsletters redirige vers /sponsor/newsletter (308). | Du faux produit indexé en Product JSON-LD, sur la marque. Attention : le seed au cold start ne supprime pas la ligne en base, il faut l'archiver. |
| D9 | Les Systems. Trois pages par System (6 Systems) et trois schémas de slug. /marketplace/systems n'est pas un type marketplace. | — | /marketplace/systems(/[slug]) devient /features/systems(/[slug]) (308 permanent) et /docs/system-* reste la référence. Une seule page de politique bot pour les deux user agents, sur l'hôte www (le canonique de config/platform.ts). | Les user agents gravent l'URL dans les logs de tiers pour toujours. |
| D10 | Garder une roadmap publique ? Après #1532, elle n'affiche que les lignes admin ou opt-in, donc presque rien. | a) garder + noindex tant qu'elle est maigre ; b) la retirer de la nav ; c) supprimer | a). Et publier les 6 entrées de changelog DRAFT qui attendent une relecture humaine : aujourd'hui le changelog a 1 entrée, d'avril. | |
| D11 | Guides tracking /setup/tracking/* : 13 guides (GA4, GTM, Cookiebot…) derrière l'auth, invisibles pour Google | a) guides publics, scanner toujours derrière l'auth ; b) tout gated (lead magnet) | a). Sur un site neuf, 13 guides pratiques sont un actif SEO. | Surface de sécurité : seuls les guides sortent de PROTECTED_PREFIXES. |
| D12 | Posts « Method » vs le produit. Les posts disent « on refuse le chiffre de trafic » et « toujours un intervalle, jamais un chiffre nu ». Le produit collecte le trafic (Similarweb, repli par scraping via proxies résidentiels et Referer forgé, documenté dans traffic-provider.ts) et le Hub affiche un revenu sans intervalle. | a) réécrire les posts pour dire ce que fait le produit ; b) changer le produit pour tenir la promesse | a) tout de suite, et ouvrir un item distinct sur le risque ToS du scraping Similarweb. | Un post faux publié sous ta signature |
| D13 | Mentions légales. Identifiants société (LCEN art. 6 III-1) et médiateur conso (L612-1) sont encore « en cours ». Les CGV annoncent un abonnement trimestriel qui n'existe pas et des « crédits non reportés », alors qu'ils vivent 65 jours (mensuels) ou 365 jours (achetés). | — | Tu fournis SIREN / RCS / adresse / médiateur. Je corrige les CGV sur les constantes du code. | Obligation légale sur des pages indexées |
| D14 | Petits arbitrages de copy | — | Ma reco pour chacun : • H1 de la home : ajouter « Shopify MCP / AI copilot » (un sous-titre suffit). • Nav : « Shopify Experts » devient « Hire an expert » (évite la confusion avec l'annuaire de Shopify) ; « @Atlas chat » devient « AI copilot ». • Nommage : « Store Intelligence » partout, « Spy » réservé à l'extension. • Requête « connecter Shopify à Claude » : une seule page cible, /features/mcp/connect/claude.• Cluster Claude/ChatGPT (12 fichiers) : un seul pillar post, qui absorbe le reste. | |
| D15 | Entité et domaines. Le sameAs de l'Organization contient ton LinkedIn perso. boostecom.fr apparaît dans un post et dans les jobs. docs.boostecom.app est prévu en rewrite. | — | LinkedIn perso passe sur ta Person de fondateur, boostecom.fr redirige (308) vers .appdocs. redirige (308) vers /docs plutôt qu'un rewrite (pas deux hôtes pour un contenu). Décision du 2026-09-25 : boostecom.fr ne redirige pas. C'est son agence emailing, pas un domaine de la plateforme. | |
| D16 | /drop/[token]. Le Disallow de robots.txt empêche le noindex d'être lu, et il publie le motif du chemin. | — | Retirer le Disallow et envoyer X-Robots-Tag: noindex + Referrer-Policy: no-referrer depuis le proxy. | Arbitrage sécurité, d'où la question |
| D17 | Composants mis de côté : FounderQuoteCard (attend une citation réécrite), ModulesLockedBanner (recommandé par patterns/CLAUDE.md mais monté nulle part), ListingCta / MarketplaceItems (MDX, jamais utilisés) | — | Supprimer les quatre, et corriger patterns/CLAUDE.md. On les recréera si le besoin revient. | |
| D18 | Rows de démo du Hub sur la home (boutiques inventées, étiquetées DEMO), ton choix du 2026-09-19 | a) garder ; b) les retirer pendant la fenêtre d'indexation | a). Elles sont étiquetées. À revoir quand il y aura de la vraie donnée. |
2. Correctifs sans décision (j'exécute dès ta validation globale)
Lot A : SEO technique et bugs (un item par ligne, piliers entre parenthèses)
| # | Correctif | Pilier |
|---|---|---|
| A1 | Réserver les slugs d'org thesis et founding. reserved-org-slugs.test.ts échoue déjà sur main, la CI sera rouge au retour du quota. Un opérateur vérifie en base qu'aucune org ne les porte. | app-shell |
| A2 | robots.txt : • allow: /api/og dans chaque groupe : l'image de partage de TOUTES les pages est bloquée, donc les cartes X et LinkedIn n'ont pas d'image ;• préfixes nus ( /auth, /account, /admin, /ops, /collab, /invite) ;• retirer /intelligence et /feedback de la liste allow. | growth-web |
| A3 | noindex + canonical sur /auth (indexable aujourd'hui avec le titre de la home), /invite, /onboarding, /setup/tracking/[...slug] (hors guides si D11 = a), /extension/install et les URLs ?preview= des annonces. | security-identity, app-shell, marketplace |
| A4 | Robots épinglés en en dans ensureLocaleCookie : un crawler à IP française reçoit aujourd'hui du HTML français sous une URL déclarée en. | platform-ops |
| A5 | FAQ JSON-LD de la home : elle publie {pct} et {months} en texte brut. Remplir les valeurs comme /pricing le fait, et partager une seule spec entre la section et le JSON-LD. | growth-web |
| A6 | Liens payants et UGC : • rel="sponsored" sur les emplacements pub et la bannière mobile ;• sponsored ou nofollow sur les liens sortants des annonces ;• ugc sur le markdown des utilisateurs ;• corriger CLAUDE.md, qui affirme le contraire. | design-system, marketplace |
| A7 | JSON-LD des annonces : • un type par kind (SoftwareApplication, Organization, ProfilePage…) ; • brand = le vendeur, jamais BoostEcom par défaut ;• pas de Product sans offre ni note. | marketplace |
| A8 | Canonicals des annonces : • canonical par type, et 308 si le type de l'URL est faux ; • le repli JSON ne ressuscite plus une ligne archivée ou vendue en base ; • /sellers/[id] répond 404 sans annonce LIVE. | marketplace |
| A9 | Pagination : canonical sur soi-même pour ?page=N quand N > 1 (marketplace, forum). | growth-web |
| A10 | noindex conditionnel des index vides : events, forum, changelog, careers sans poste ouvert, radar ; plus /community/levels/[level] (8 pages quasi identiques) et /status/history tant qu'il y a moins de 3 mois de données. | growth-web, platform-ops |
| A11 | Titres : • retirer la marque en double (10 titres) ; • ramener 12 titres à 60 caractères et 16 descriptions à 160 ; • traduire les suffixes dynamiques, en anglais en dur aujourd'hui ; • ajouter une garde de longueur. | growth-web |
| A12 | lastmod du sitemap réel (updatedAt ou date git), ou omis. Aujourd'hui c'est l'heure de la requête. | growth-web |
| A13 | Graphe d'entités : • @id sur l'Organization, le WebSite et le fondateur ;• og:locale ;• AboutPage pour /about ;• auteurs d'articles reliés ; • Event JSON-LD exact (mode de participation, statut, pas d'offre après la fin). | growth-web |
| A14 | Autodiscovery RSS (/insights/rss.xml, /changelog/rss.xml) : ajouter une option feeds à buildMarketingMetadata. | growth-web |
| A15 | Fichiers llms.txt, llms.json et llms-full.txt dérivés du code :• prix via listPlans() ;• comptes via les registres ; • rôles d'agents avec @ ;• llms.json en anglais avec le positionnement actuel ;• plus de liens vers des /api interdits par robots.txt ;• inventaire marketplace réel ; • une garde sur les trois fichiers. | growth-web |
| A16 | Redirections : • 5 chaînes admin à deux sauts pointent directement vers la cible finale ; • retirer le doublon /blog ;• les stubs /feedback, /network/agencies et /checkout/sponsor passent dans next.config.mjs (308), leurs dossiers sont supprimés ;• /intelligence/[category] est limité aux 15 slugs connus (les fautes de frappe donnent un vrai 404) ;• une URL par boutique ( /intelligence/stores/[domain], 14 variantes en 308). | platform-ops, intelligence, growth-web |
| A17 | Petits liens et nav : • /scan/tracking pointe vers /features/intelligence et non plus vers une redirection ;• Radar est lié depuis Features > Know et depuis la landing ; • Founding passe dans le menu Pricing ; • les inspecteurs passent dans Know. | growth-web, commerce-systems |
| A18 | Doc drift dans les fichiers de boot des agents : • CLAUDE.md : 0361 au lieu de 0365 ; la ligne /network ; la liste pre-push (19 étapes au lieu de 21) dupliquée entre CLAUDE.md et AGENTS.md ;• AGENTS.md : route workflow inexistante ; • commentaires : layout (sept routes), features/api, llms-full (/agents/maya), EventInput, note de statut de l'ADR 0002, patterns/CLAUDE.md. | transverse |
| A19 | Gardes : • nav-coverage compte n'importe quelle chaîne comme un lien entrant, il ne voit donc aucun orphelin ;• le test de réservation des slugs oublie (docs) ;• i18n:parity ne descend qu'à deux niveaux : ajouter un cliquet feuille par feuille contre les clés mortes. | growth-web, platform-ops |
Lot B : contenu faux ou périmé
| # | Contenu | Action |
|---|---|---|
| B1 | tutorials/connect-klaviyo-to-otis : promet la rédaction de flows, un bouton « Stage in Klaviyo » et le scope lists:write. Le connecteur est en lecture seule, et le travail Klaviyo est routé vers Marketing. | supprimer |
| B2 | blog/marketplace-curation (6 locales) : « ~8 % des annonces sont Verified » (toutes le sont, par nous) ; « Verified est payant », ce que le flux sponsor contredit | supprimer |
| B3 | blog/mcp-tools-scopes-shopify-assistant (en, fr) : « 15 tools, 9 scopes » contre 22 et 11 en réalité | 308 vers /docs/mcp-tools |
| B4 | blog/connect-cursor-claude-code-shopify-mcp + tutorials/connect-boostecom-to-claude-code : deux réponses contradictoires sur l'auth, des comptes faux, une promesse Web Vitals | fusion dans /features/mcp/connect/{claude-code,cursor} (308) |
| B5 | blog/official-shopify-claude-connector-vs-read-only-relay (« fifteen tools across nine scopes ») et blog/shopify-claude-mcp (sa liste oublie 7 outils sur 22) | corriger, et lier la doc au lieu de lister les outils |
| B6 | Les 4 posts Method : IDs internes F20, F22, facts.md que personne ne peut résoudre | retirer les IDs |
| B7 | blog/why-skills-matter : « fork a skill » et « earn credits » n'existent pas ; blog/launching-boostecom : promesses d'inventaire | réécrire ; marquer launching comme annonce datée |
| B8 | docs/referrals : « 30 % de Max 20x = $90/mois » (c'est $119.70), et « plus que la première année » | corriger sur les constantes |
| B9 | docs/{fr,de,es,it,pt}/api-overview + webhooks (10 fichiers) : 386 handlers et 7 webhooks, contre 414 et 9 | supprimer les traductions (l'anglais sert de repli) |
| B10 | Meta descriptions fausses : • /marketplace/systems : « GDPR, à la carte » ;• /community/careers : « 7 disciplines » pour 2 postes ouverts ;• /marketplace/stores : « Escrow, KYC et APA signé à chaque close », faux | corriger, les dériver du code |
| B11 | docs/mcp-server, docs/plans-and-limits : historique public de « ce qui était faux avant » | retirer (l'historique appartient au changelog) |
| B12 | tutorials/the-proof-post-playbook : « Composition mode » est un outil interne, pas marchand | réécrire |
| B13 | tutorials/chrome-extension-contextiq : slug au nom retiré, comportement décrit périmé | renommer le slug maintenant (308), réécrire |
| B14 | Images : • account-avatar.jpg : 563 KB pour un affichage de 36 px ;• gallery/*.png : de 0,8 à 2 MB en vignettes ;• 3 copies identiques de boostecom.png ;• public/** n'a pas de propriétaire dans ownership.json. | compresser (WebP/AVIF), next/image, dédoublonner, assigner public/** |
Lot C : code mort (aucun effet visible)
| # | Quoi | Volume |
|---|---|---|
| C1 | Clés i18n lues nulle part dans marketingPages.*, pricing, shared.credits, patterns.* | 127 clés × 6 locales = 762 chaînes |
| C2 | Fichiers morts dans shared/ (suggestion-card, inline-form, purchase-slot-card, model-context, presence ×2, account/settings, deux switchers form, ecosystem-grid) avec leurs clés en cascade (114 × 6) | 10 fichiers, 1 335 lignes |
| C3 | Exports morts (extractArrayFaq, topicLabelKey, topicBlurbKey, useAccount…), exports internes à dés-exporter, lignes de barrel inutiles | ~30 |
| C4 | La FAQ de clôture est écrite trois fois (MarketingFaqSection, HomeFaqSection, PricingFaq) : on garde MarketingFaqSection après lui avoir ajouté footer et balanceDescription | 2 copies en moins |
| C5 | 15 composants de shared/ n'ont qu'un seul consommateur : les déplacer dans le _components de leur route | 15 déplacements |
| C6 | Le kind de contenu changelog n'a aucun dossier | code mort |
3. Ordre d'exécution
-
Vague 0 : #1532 (fuite roadmap), mergée. A1 (slugs) part avec la vague 1.
-
Vague 1, correctifs sans décision : lots A, B et C, sept agents en parallèle, items
3002à3008. -
Vague 2, renommages décidés : D2 à D9, dans cet ordre :
- Learn cluster et blog ;
- MCP ;
- agents ;
- réseau ;
- carrières ;
- marketplace ;
- systems.
Ils touchent tous
next.config.mjs,nav.tsxetsitemap.ts: une vague séquentielle, ou un seul agent intégrateur. -
Vague 3, couche de langue (D1), une fois toutes les URLs finales en place.
4. Ce que le dépôt ne peut pas montrer
- Search Console : les URLs réellement indexées et les requêtes par page. Elles confirment ou infirment les fusions de contenu.
- La base :
- le nombre de threads, d'événements et d'annonces tierces ;
- les slugs d'org existants (
thesis,founding,careers,tutorials, codes de langue) ; - le nombre de lignes roadmap à
backlogRef(SELECT count(*) FROM bst_roadmap_item WHERE "backlogRef" IS NOT NULL).
- DataFast : la répartition par pays et par langue, pour dater la vague 3.
- Vercel : les hits sur les anciennes redirections admin, avant de les supprimer.