Projet

Points de blocage et points d'attention

Tout ce qui bloque, tout ce qui mord. Les détails sont dans les pages d'origine ; celle-ci sert à ne rien chercher deux fois.

Ce qui bloque, et qui ne dépend pas de nous

Cinq points de priorité 1 empêchent l'ouverture publique, quelle que soit la qualité du code. Les messages sont rédigés et les pièces jointes se produisent en une commande (pnpm data:export) : voir a-faire-valider.md.

InterlocuteurCe qu'on attendEn attendant
Direction de la rechercheRattachement des laboratoires aux Graduate SchoolsCalculé par domaines HAL, affiché « proposé »
Direction de la rechercheListe officielle des laboratoiresAnnuaire de l'établissement, 83 structures du RNSR en sont absentes
DPOQuelles personnes publier≥ 3 publications HAL depuis 2022
DPOProcédure de retrait d'une ficheAucune
Juridique et DPOContenu des pages légalesTextes génériques

Et une question que rien de technique ne tranchera : la valeur ajoutée face à HAL, scanR et aux sites des unités n'est pas établie. C'est le critère d'arrêt du projet, inscrit en phase 0 du plan d'action.

Ce qui bloque et qui est à nous

  • Trois fournisseurs d'analytics en parallèle sont un dispositif de comparaison, pas une cible. Rybbit coûte à lui seul 5 conteneurs et la moitié des 2,1 Gio mesurés.
  • Deux requêtes de référence sur vingt échouent par vocabulaire des fiches visées, pas par défaut de l'outil. Le jeu de requêtes ne doit pas être ajusté pour faire monter le score.
  • Les présentations manquantes — 49 structures sur 248 à Saclay, 31 sur 37 à Paris 1 — ne peuvent pas être générées : elles décrivent des unités réelles.

Les pièges, par domaine

Données

  • data/raw/ et data/public/markdown/ ne sont pas versionnés. Après un clone, tout régénérer : ~25 min et 2,5 Go. Les JSON publiés, eux, sont dans le dépôt (18 Mo) — Vercel construit à partir d'eux.
  • data:probe sort en code 1 dès qu'une source échoue, donc toujours avec theses.fr. pnpm data:all échoue en fin de chaîne alors que tout le reste a réussi.
  • theses.fr échoue sur les deux instances. OpenAlex répond sans clé, mais le budget gratuit reste épuisable.
  • L'annuaire Saclay n'affiche pas les codes d'unité : le rapprochement passe par le RNSR, présent sur 97 % des fiches.
  • Toute régénération doit être suivie de pnpm data:freeze, sinon data:verify bloque le push.

Build et déploiement

  • NEXT_PUBLIC_SITE_URL doit être définie au build, pas au démarrage : elle est gravée dans les URL canoniques, les hreflang et tout le sitemap.
  • PORT change le repli de cette variable : construire puis servir sur un autre port grave une mauvaise adresse.
  • next build fige le contenu de public/. Pagefind s'exécutant après, un serveur démarré pendant l'écriture de l'index sert des 404 jusqu'à redémarrage — et la page de recherche accuse le build. Attendre la fin complète du script, pas la ligne « Indexed … pages ».
  • Pagefind déduit la racine du site de l'emplacement de son script. Servi ailleurs que sous /pagefind/, il préfixe toutes ses URL de résultat : les titres restent justes, les liens cassent. Voir exploitation/deploiement-vercel.md.
  • Sur Vercel, les pages pré-rendues ne sont pas dans .next/server/app/. L'adaptateur de la plateforme les range sous .next/server/route-cache/ : un script qui cherche le HTML au chemin habituel n'en trouve aucun. Et la liste des fichiers déployés est arrêtée à la fin de next build : un fichier écrit après, même dans .next/static/, n'est pas servi. Voir Déploiement Vercel.
  • Playwright : les navigateurs ne sont pas installés par pnpm install. Sans eux, a11y et search:eval échouent sur un message trompeur.
  • Nettoyer .next-<instance> avant de reconstruire après un changement de variables NEXT_PUBLIC_* : des reconstructions successives ont déjà laissé un chunk absent servi en 500.

Interface

  • Le thème Mantine contient des fonctions : il ne doit être instancié que dans AppProviders.
  • Les sous-composants Mantine ne traversent pas la frontière serveur. Table.Thead vu d'un composant serveur vaut undefined, et l'erreur — « Element type is invalid » — ne dit pas où chercher. Tout usage de Table.* vit dans un fichier 'use client'.
  • Une couleur ne porte jamais un statut seule : le vert et le rouge employés sont à ΔE 4,1 en deutéranopie. Icône et mot obligatoires.
  • Deux jeux de couleurs de statut : aplats à 3:1 contre la surface, texte à 4,5:1.
  • Aucune couleur en dur hors de src/theme/tokens.css : un #ffffff posé dans un composant casse silencieusement les instances dont la charte n'est pas blanche.

Mesure

  • Un code HTTP 2xx ne prouve rien. Umami répond 200 avec {"beep":"boop"} à un User-Agent de robot ; Rybbit range l'événement dans bot_events. Vérifier en interrogeant les données, jamais le statut.
  • Un navigateur piloté est pris pour un robot : remplacer HeadlessChrome dans le User-Agent, sinon le test mesure le filtre antirobot.
  • Les vues partent tout de suite, les événements attendent 5 s (flushIntervalMs). Un test qui ferme le navigateur avant mesure son propre empressement.
  • Le jeton d'API Matomo expire en annonçant « aucun événement retrouvé », alors que tout est stocké.
  • Comparer un total ne détecte rien : un contrôle « supérieur à zéro » a laissé passer une vue sur deux et une page mal attribuée. Mesurer un écart avant/après.

Où regarder

SujetPage
Qui valide quoi, messages prêtsa-faire-valider.md
Questions ouvertes, Q1 à Q20questions-ouvertes.md
Reprise par un agent ou une personne../plan-agent.md
Pannes d'analytics, symptôme par symptômeanalytics/troubleshooting.md
Réserves sur le POC de mesureanalytics/revue.md
Ce qu'il reste à reprendre dans l'interfaceaudit-UXUX.md