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 pardocs/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
| Surface | Fichier(s) | Portee | Moteur | Qui l'atteint |
|---|---|---|---|---|
| Marketplace search | src/app/api/marketplace/search/route.ts, src/services/marketplace/search.ts | MarketplaceListing status=LIVE | Postgres websearch_to_tsquery pondere A/B/C/D, cache KV 5 min | public anonyme |
| Knowledge search | src/app/api/stores/[storeId]/knowledge/search/route.ts, src/services/knowledge/search.ts | corpus vectoriel d'UNE boutique | pgvector + re-rank par affinite d'agent | membre de la boutique |
| Intelligence nl-search | src/app/api/intelligence/nl-search/route.ts | graphe de stores tiers | Haiku parse en filtres structures, puis SQL | public, 20 req/min |
| Admin ⌘K | src/components/patterns/navigation/admin-command-palette.tsx | routes statiques de src/config/admin-routes.ts | cmdk, filtrage client, aucun reseau | User.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 page | Array.filter cote client | selon 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
- 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.
- 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.
- 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.
- Le contrat
searchHubpromis parsrc/features/systems/types.tsn'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.