Audits · septembre 2026Nettoyage avant indexation : tableau de décision

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/main e3e4b572a (après le merge de #1525).

  • Méthode : quatre audits en lecture seule menés en parallèle :

    1. architecture et URLs ;
    2. SEO technique ;
    3. contenu faible, périmé ou faux ;
    4. 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èmeCorrectif
0.1Fuite 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/0393 est archivé. D13 reste un item de décision ouvert, parce qu'il faut des faits que seul le propriétaire détient : growth-web/0628 pour les identifiants LCEN et le médiateur, billing/0373 pour le trimestriel. D12 a son pendant produit dans intelligence/0388 (SimilarWeb).

#QuestionOptionsRecoPourquoi maintenant
D1Langue 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 /bloga) /blog ; b) garder /insights et renommer le panneau Insights du cockpita). 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)
D3Nom 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 noma). 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.
D4Fusion /network/referral + /network/affiliate : même ledger, mêmes conditions, deux pages indexables sur la même requêtea) une page /network/affiliate avec deux sections d'audience, et 308 depuis referral ; b) garder les deuxa). Remplacer ADR 0015, qui les gardait parce qu'elles étaient « déjà indexées », prémisse fausse.21 fichiers
D5L'é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.
D6Le 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.
D7Carriè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.
D8Placeholders 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.
D9Les 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.
D10Garder 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) supprimera). Et publier les 6 entrées de changelog DRAFT qui attendent une relecture humaine : aujourd'hui le changelog a 1 entrée, d'avril.
D11Guides tracking /setup/tracking/* : 13 guides (GA4, GTM, Cookiebot…) derrière l'auth, invisibles pour Googlea) 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.
D12Posts « 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 promessea) tout de suite, et ouvrir un item distinct sur le risque ToS du scraping Similarweb.Un post faux publié sous ta signature
D13Mentions 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
D14Petits 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.
D15Entité 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 .app, et docs. 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
D17Composants 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.
D18Rows de démo du Hub sur la home (boutiques inventées, étiquetées DEMO), ton choix du 2026-09-19a) garder ; b) les retirer pendant la fenêtre d'indexationa). 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)

#CorrectifPilier
A1Ré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
A2robots.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
A3noindex + 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
A4Robots é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
A5FAQ 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
A6Liens 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
A7JSON-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
A8Canonicals 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
A9Pagination : canonical sur soi-même pour ?page=N quand N > 1 (marketplace, forum).growth-web
A10noindex 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
A11Titres :
• 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
A12lastmod du sitemap réel (updatedAt ou date git), ou omis. Aujourd'hui c'est l'heure de la requête.growth-web
A13Graphe 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
A14Autodiscovery RSS (/insights/rss.xml, /changelog/rss.xml) : ajouter une option feeds à buildMarketingMetadata.growth-web
A15Fichiers 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
A16Redirections :
• 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
A17Petits 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
A18Doc 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
A19Gardes :
• 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é

#ContenuAction
B1tutorials/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
B2blog/marketplace-curation (6 locales) : « ~8 % des annonces sont Verified » (toutes le sont, par nous) ; « Verified est payant », ce que le flux sponsor contreditsupprimer
B3blog/mcp-tools-scopes-shopify-assistant (en, fr) : « 15 tools, 9 scopes » contre 22 et 11 en réalité308 vers /docs/mcp-tools
B4blog/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 Vitalsfusion dans /features/mcp/connect/{claude-code,cursor} (308)
B5blog/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
B6Les 4 posts Method : IDs internes F20, F22, facts.md que personne ne peut résoudreretirer les IDs
B7blog/why-skills-matter : « fork a skill » et « earn credits » n'existent pas ; blog/launching-boostecom : promesses d'inventaireréécrire ; marquer launching comme annonce datée
B8docs/referrals : « 30 % de Max 20x = $90/mois » (c'est $119.70), et « plus que la première année »corriger sur les constantes
B9docs/{fr,de,es,it,pt}/api-overview + webhooks (10 fichiers) : 386 handlers et 7 webhooks, contre 414 et 9supprimer les traductions (l'anglais sert de repli)
B10Meta 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
B11docs/mcp-server, docs/plans-and-limits : historique public de « ce qui était faux avant »retirer (l'historique appartient au changelog)
B12tutorials/the-proof-post-playbook : « Composition mode » est un outil interne, pas marchandréécrire
B13tutorials/chrome-extension-contextiq : slug au nom retiré, comportement décrit périmérenommer le slug maintenant (308), réécrire
B14Images :
• 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)

#QuoiVolume
C1Clés i18n lues nulle part dans marketingPages.*, pricing, shared.credits, patterns.*127 clés × 6 locales = 762 chaînes
C2Fichiers 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
C3Exports morts (extractArrayFaq, topicLabelKey, topicBlurbKey, useAccount…), exports internes à dés-exporter, lignes de barrel inutiles~30
C4La FAQ de clôture est écrite trois fois (MarketingFaqSection, HomeFaqSection, PricingFaq) : on garde MarketingFaqSection après lui avoir ajouté footer et balanceDescription2 copies en moins
C515 composants de shared/ n'ont qu'un seul consommateur : les déplacer dans le _components de leur route15 déplacements
C6Le kind de contenu changelog n'a aucun dossiercode mort

3. Ordre d'exécution

  1. Vague 0 : #1532 (fuite roadmap), mergée. A1 (slugs) part avec la vague 1.

  2. Vague 1, correctifs sans décision : lots A, B et C, sept agents en parallèle, items 3002 à 3008.

  3. Vague 2, renommages décidés : D2 à D9, dans cet ordre :

    1. Learn cluster et blog ;
    2. MCP ;
    3. agents ;
    4. réseau ;
    5. carrières ;
    6. marketplace ;
    7. systems.

    Ils touchent tous next.config.mjs, nav.tsx et sitemap.ts : une vague séquentielle, ou un seul agent intégrateur.

  4. 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.