Audits · septembre 2026Audit — recherche globale (2026-09-11)

Audit — recherche globale (2026-09-11)

Source de backlog/app-shell/0596. Corrige par docs/architecture/global-search.md.

Source de backlog/app-shell/0596. Corrige par docs/architecture/global-search.md.

Methode

find src/app/api -path '*search*' -name route.ts, puis lecture de chaque handler et de son service, puis grep de cmdk/CommandPalette et de placeholder="Search/Rechercher sur src/.

Constat : cinq moteurs, zero connexion

SurfaceFichier(s)PorteeMoteurQui l'atteint
Marketplace searchsrc/app/api/marketplace/search/route.ts, src/services/marketplace/search.tsMarketplaceListing status=LIVEPostgres websearch_to_tsquery pondere A/B/C/D, cache KV 5 minpublic anonyme
Knowledge searchsrc/app/api/stores/[storeId]/knowledge/search/route.ts, src/services/knowledge/search.tscorpus vectoriel d'UNE boutiquepgvector + re-rank par affinite d'agentmembre de la boutique
Intelligence nl-searchsrc/app/api/intelligence/nl-search/route.tsgraphe de stores tiersHaiku parse en filtres structures, puis SQLpublic, 20 req/min
Admin ⌘Ksrc/components/patterns/navigation/admin-command-palette.tsxroutes statiques de src/config/admin-routes.tscmdk, filtrage client, aucun reseauUser.role === "ADMIN" uniquement — mont e par <AdminCategoryRail>, donc n'existe que sous /admin
Recherche de table<AdminDataTable searchable>, <FilterControls>, les deux switchers (store/org)les lignes DEJA chargees dans la pageArray.filter cote clientselon la page

Chaque reponse a sa propre forme : { data, total, query, source } pour le marketplace, { hits, error } pour knowledge, { query, parsed, results } pour nl-search. Rien ne permet d'interclasser deux sources dans une liste.

Ce que ca cassait concretement

  1. Aucune ressource de l'OS n'etait cherchable : ni boutique, ni organisation, ni scan, ni audit, ni conversation, ni tache, ni membre. Retrouver le scan d'une URL demandait de connaitre l'organisation, puis la boutique, puis d'ouvrir l'onglet Tracking et de scroller l'historique.
  2. Le seul ⌘K du produit ne sert qu'a l'admin plateforme. Un proprietaire d'organisation n'a aucun raccourci de navigation nulle part ailleurs dans le dashboard.
  3. La recherche de table est un mensonge d'echelle : elle filtre la page courante. Sur une table paginee, un terme absent de la page rend « aucun resultat » alors que la ligne existe ailleurs dans la liste.
  4. Le contrat searchHub promis par src/features/systems/types.ts n'a jamais existe. Son en-tete annoncait qu'un manifeste de System alimentait « search hub commands » ; registry.ts, douze lignes plus bas, le dementait deja explicitement (« This header used to claim that... search hub commands... derive from here too. They do not »).

Correctif

Un moteur unique, src/lib/search/, expose par GET /api/search et par <GlobalCommandPalette> (⌘K, partout dans le dashboard hors /admin, qui garde le sien). Il reutilise les trois moteurs existants — la recherche marketplace est appelee telle quelle par le provider marketplace, sans duplication — et connecte enfin le registre admin-routes.ts a une recherche joignable de partout (provider pages), ce qui est la premiere moitie honnete de la promesse que systems/types.ts avait faite en l'air.

Design complet, formule de classement, modele de scoping et limites connues : docs/architecture/global-search.md.