Un scoreur qui notait discrètement tout à zéro
A regex that never matched meant keyword relevance scoring returned a flat 0 for every result, silently, with no error.
Ça disait que ça marchait
Vert, 200, enregistré, « déjà géré » — et faux. Aucune erreur sur laquelle s'appuyer.
Le Lite Mode est la raison d'être de cet outil : il tourne sans aucune clé d'API, retombant sur la correspondance par mots-clés pour que quelqu'un puisse l'essayer sans s'inscrire chez un fournisseur d'IA payant. Il notait chaque annonce à un 0 plat depuis sa toute première livraison.
La cause était une regex qui ne matchait jamais ce qu'elle était censée matcher — donc aucun mot-clé du CV ou de la recherche n'était jamais compté comme présent dans une annonce, donc chaque score de pertinence sortait à zéro. Rien ne levait d'exception. Aucune ligne de log ne disait que quoi que ce soit n'allait pas. Le tableau de bord affichait une liste complète d'annonces, toutes notées 0, triées (mal, voir plus bas) et affichées. De l'extérieur, ça avait l'air que le Lite Mode marchait et ne trouvait juste pas de bonnes correspondances.
C'est le mode de défaillance sur lequel je bute sans cesse et que je consigne sans cesse : une fonctionnalité présente — le chemin de code s'exécute, l'interface montre un résultat, rien n'erreur — et cassée, et le seul moyen de l'attraper est de regarder la sortie réelle et de se demander si le nombre veut dire quelque chose. Un score de 0 pour une annonce qui correspond manifestement au CV est le signe. Un test qui vérifie seulement « l'endpoint renvoie 200 avec une liste » ne le voit jamais.
Le correctif est venu avec des tests de non-régression pour les quatre cas qui comptent : une correspondance claire, une non-correspondance claire, un cas de limite de mot (pour que « java » ne matche pas « javascript »), et le plafond de score. Et il a atterri dans la même release qui a réécrit la CI pour lancer le vrai script console installé contre des conteneurs en direct et affirmer qu'une annonce vraiment notée revient — parce que « les tests passent » venait d'être prouvé comme ne voulant rien dire ici.
Deux bugs plus petits ont fait surface dans la même passe, tous deux de la même forme. Les notifications étaient mortes par défaut parce que le seuil d'alerte était réglé à 70 sur une échelle qui ne va qu'à 10. Et les résultats n'étaient pas réellement triés par score, malgré le README qui affirme que les scores élevés remontent en haut. Chacun de ces cas est invisible à moins de lire les valeurs plutôt que le code de statut.