FranceMetrics

Méthode · les instruments

Ce que nos propres outils nous ont fait croire

Le mur des silences dit ce que les sources nous cachent. Cette page dit l'inverse.

Un compteur qui affichait zéro alors que la base était pleine. Un repli qui ne se déclenchait pas sur une chaîne vide. Un garde-fou qui échouait sur le commentaire expliquant sa propre correction. Voici trente-sept défauts de nos instruments, datés : ce qu'ils affirmaient, ce qui était vrai, ce qui les a démasqués, et la règle que chacun a fait naître.

une leçon n'entre ici que si elle a été PAYÉE : un défaut réellement servi ou réellement mesuré, pas un risque imaginé. Une liste de bonnes intentions ne prouve rien ; une liste d'erreurs datées prouve qu'on regarde.

  1. Lib/sources/orphelins.mjs, le motif qui devait retrouver les textes de loi invoqués par une fiche

    18/08/2026
    Ce que l'instrument affirmait
    que la fiche fautive du 5 965 € invoquait un seul texte : « décret n° 2025-1363 »
    Ce qui était vrai
    elle en invoquait DEUX — « arrêté du 24 décembre 2025 » et « décret n° 2025-1363 » — et c'est le premier, l'arrêté fantôme, que le garde devait attraper. Il ne le voyait pas : mon motif bornait les mots par \\b, qui se calcule sur l'alphabet ASCII. Après « arrêté », dont la dernière lettre est « é », il n'y a AUCUNE frontière de mot. « décret » finit par une consonne et passait ; « arrêté » ne passait pas.
    Ce qui l'a démasqué
    le contre-négatif joué sur la fiche réelle : le garde rendait « zéro orphelin » ET laissait passer l'orphelin connu
    La cause
    j'ai écrit un motif français avec un outil anglais. \\b et \\w ne connaissent ni é, ni à, ni ç : un mot français sur deux finit par une voyelle accentuée, et « décembre » n'est même pas un mot pour \\w. Le motif ne cassait pas — il filtrait en silence, et son silence ressemblait à une absence de faute.
    La règle qui en est sortie
    dans un motif qui lit du français, les frontières de mots s'écrivent avec une classe explicite ([a-zà-öø-ÿ] et ses lookarounds), jamais avec \\b, et les noms de mois avec la même classe, jamais avec \\w. Même famille que la leçon n°25 : ce que la classe de caractères ne dit pas, elle le suppose — et elle le suppose en anglais.
  2. Scripts/qa_orphelins.mjs, le détenteur de pièces — deux versions ratées avant la bonne

    18/08/2026
    Ce que l'instrument affirmait
    que nous détenions l'arrêté du 24 décembre 2025, parce que « 24/12/2025 » se trouve dans data/
    Ce qui était vrai
    cette chaîne s'y trouve deux fois, et aucune ne concerne un arrêté : l'une dans ma propre note de correction qui dit que l'arrêté n'existe pas, l'autre dans la date d'un test de téléphone chez gsmarena. J'ai donc successivement cru détenir une pièce parce que je la démentais, puis parce qu'un smartphone avait été testé le même jour.
    Ce qui l'a démasqué
    le contre-négatif joué sur la fiche réelle du 5 965 €, qui refusait de tomber
    La cause
    j'ai cherché une CHAÎNE là où il fallait chercher une PIÈCE. Une date n'identifie pas un document : elle est partagée par tout ce qui s'est produit ce jour-là. Chercher dans tout data/ garantissait des coïncidences, et une coïncidence acceptée par un contrôle vaut moins que pas de contrôle du tout — elle rassure.
    La règle qui en est sortie
    la détention se prouve contre les SOCLES, et seulement dans les champs qui déclarent une source ; jamais contre le dépôt entier. Et elle se prouve sur le COUPLE nature + identifiant : c'est « arrêté … 24 décembre 2025 » qui doit être présent, pas « 24 décembre 2025 » quelque part. Corollaire : une mention à l'intérieur d'une rétractation n'est pas une détention — un site qui publie ses corrections doit pouvoir nommer le texte fantôme sans le ressusciter.
  3. Lib/sources/porteeDesAffirmations.mjs, deux contre-négatifs de R62.1

    18/08/2026
    Ce que l'instrument affirmait
    que la règle refusait bien une assiette sans son dehors et une assiette sans sa source
    Ce qui était vrai
    les deux fixtures portaient la phrase « ne s'applique plus », qui n'est pas un mot de totalité : la règle se mettait donc en retrait et ne jugeait rien. Les deux contre-négatifs passaient pour la seule raison qu'ils ne testaient rien.
    Ce qui l'a démasqué
    leur échec, une fois la fixture corrigée — ils échouaient dans les deux sens, ce qui a révélé qu'ils ne déclenchaient jamais la règle
    La cause
    j'ai vérifié qu'un contrôle rendait le bon verdict sans vérifier qu'il s'était exécuté. Un contre-négatif qui ne déclenche pas la règle qu'il teste est un test vert qui ne prouve rien — pire qu'absent, parce qu'il occupe la place.
    La règle qui en est sortie
    un contre-négatif doit d'abord DÉCLENCHER la règle, ensuite la faire échouer. Quand une règle a une garde d'entrée (« aucun mot de totalité : je ne juge pas »), chaque fixture doit franchir cette garde, et un témoin doit prouver que la garde elle-même fonctionne.
  4. Le contrôle croisé des empreintes PCS, spécifié par la rédaction et exécuté par moi

    18/08/2026
    Ce que l'instrument affirmait
    que comparer les cinq sha256 du socle aux deux du rapatriement était le contrôle à faire
    Ce qui était vrai
    le socle scelle des .xlsx, nous détenons des .csv extraits : la comparaison ne pouvait PAS réussir. Je l'ai vu avant de l'armer et j'ai déclaré le croisement impossible plutôt que de le rapporter en échec — mais je ne l'avais pas nommé comme une faute de construction, seulement comme une impossibilité de fait.
    Ce qui l'a démasqué
    la rédaction, qui a reconnu la faute de spécification et en a tiré la symétrie
    La cause
    nous savions déjà qu'un garde qui ne peut pas échouer ne prouve rien. Le cas miroir n'avait jamais été écrit : un garde qui ne peut pas réussir ne mesure rien. Les deux ont le même défaut — leur résultat sort de leur construction et non du monde — et le second est plus insidieux parce qu'il produit du rouge, donc l'apparence de la vigilance.
    La règle qui en est sortie
    avant d'armer un contrôle, on montre un cas qui PASSE et un cas qui TOMBE. La discipline du contre-négatif, appliquée dans les deux sens. Et le corollaire de la rédaction, qui vaut d'être gardé tel quel : le pire état d'un garde n'est pas rouge à tort, c'est vert à tort — un faux rouge coûte une heure, un faux vert coûte la confiance dans toute la chaîne, et il la coûte sans prévenir.
  5. « Les chiffres du matin », la bande de la page d'accueil, servie en production

    18/08/2026
    Ce que l'instrument affirmait
    rien — la bande fonctionnait, tous ses chiffres étaient réels et sourcés
    Ce qui était vrai
    elle servait six cartes de 300 px de haut à 78 % de la largeur de l'écran, en dégradé saturé plein-fond : elle mangeait la moitié de la première page, laissait la moitié droite du bureau vide, et tirait le site vers le tableau de bord. Mk l'a signalé, capture à l'appui.
    Ce qui l'a démasqué
    Mk, sur le rendu de production — aucun garde ne mesurait cela
    La cause
    tous nos contrôles portent sur la VÉRITÉ de ce qui est servi, aucun sur sa TENUE. Un chiffre juste, sourcé, daté et illisible reste un échec éditorial, et notre chaîne le déclarait vert. C'est un angle mort de doctrine, pas un oubli d'implémentation.
    La règle qui en est sortie
    la mesure a été faite avant et après, au navigateur : la bande passe de plus de 380 px à 253 px, six cartes de 163 px alignées au pixel. Le geste : la couleur quitte le fond pour l'accent, le rail devient une grille, et trois familles typographiques prennent trois rôles — le serif au chiffre, le sans à la phrase, la chasse fixe aux étiquettes. Ce qui reste à faire est plus large : nous n'avons aucun garde de tenue, et G-bureau ne mesure que le débordement.
  6. Generate-articles.yml — la condition qui sépare le run complet (10 min, Mistral) de l'actualisation intraday (2 min, zéro LLM)

    18/08/2026
    Ce que l'instrument affirmait
    rien — les runs étaient verts, les articles sortaient, la flotte semblait au réglage prévu
    Ce qui était vrai
    la condition comparait le cron déclencheur au littéral « 23 10-20/2 * * 1-5 », remplacé depuis par « 23 11,19 * * 1-5 ». Elle ne pouvait plus jamais réussir : chaque passage intraday payait une génération complète. Dix générations par semaine facturées à la place de dix actualisations — invisible, parce qu'un run trop riche est vert exactement comme un run juste.
    Ce qui l'a démasqué
    l'alerte de quota GitHub (1 801/2 000 min), puis la mesure : 15 runs à ~10 min sur 7 jours là où le réglage en prévoyait 5
    La cause
    La règle qui en est sortie
  7. Les 115 noms de workflows GitHub Actions, renommés le matin même pour porter leur cadence en tête

    17/08/2026
    Ce que l'instrument affirmait
    qu'un nom de workflow est un nom, et qu'un préfixe entre crochets « [1·jour 06:00] » était une décoration lisible qui rangerait la flotte du plus fréquent au plus rare
    Ce qui était vrai
    les noms de workflows sont relus comme des MOTIFS par le filtre workflow_run.workflows, où [ ] * ? sont des métacaractères. Le crochet ouvrant a fait lire chaque nom comme une classe de caractères : les deux workflows à l'écoute n'ont plus reconnu aucune cible et se sont déclenchés sur toute la flotte, en échouant au démarrage — une centaine de runs rouges en trois heures.
    Ce qui l'a démasqué
    MK, qui a vu les échecs s'accumuler dans l'onglet Actions ; puis la chronologie, où chaque workflow terminé déclenchait exactement deux échecs de démarrage, y compris des workflows absents des deux listes d'écoute
    La cause
    un identifiant qui voyage vers un autre système peut y être relu selon une grammaire différente de la nôtre. Le nom était valide en YAML, accepté par GitHub, affiché correctement dans l'annuaire — et pourtant inutilisable là où il servait de clé.
    La règle qui en est sortie
    aucun nom destiné à être cité ailleurs ne contient de métacaractère de motif ; et le garde qui vérifie la forme d'un nom vérifie AUSSI qu'il reste un nom là où il est relu. Le contrôle est écrit : nomEstUnMotif, joué sur trois pièges.
  8. Le lecteur de la flotte (litWorkflow), au premier vrai relevé de la vigie sur les 115 workflows

    17/08/2026
    Ce que l'instrument affirmait
    que onze workflows planifiés étaient en retard — dont un « quatre fois par jour » muet depuis 781 heures — et les signalait en défaut chaque matin
    Ce qui était vrai
    leurs crons étaient COMMENTÉES, avec le motif et la date écrits juste au-dessus (« ⏸ SCHEDULE COUPÉ, quota d'exécutions Actions, 1er août 2026 »). Ces onze workflows étaient délibérément en pause. Le lecteur ramassait les lignes commentées avec les autres : il voyait une cadence là où il n'y avait qu'un souvenir de cadence.
    Ce qui l'a démasqué
    MK, à qui la vigie annonçait onze défauts, et qui a répondu que la pause était volontaire — la vérification des fichiers a montré que l'information y était déjà, écrite, et que seul le lecteur ne la voyait pas
    La cause
    une analyse littérale par expression régulière ignore la structure du fichier qu'elle lit : un commentaire reste du texte, et le texte contient les mêmes mots que le code. Le lecteur voyait « cron: » sans voir le dièse qui le précédait.
    La règle qui en est sortie
    un garde qui crie à tort apprend au lecteur à l'ignorer, et coûte alors plus cher que pas de garde du tout. Une pause déclarée s'affiche avec son motif et ne sonne jamais ; le motif se lit dans le fichier même, jamais dans un champ de registre à tenir à la main — et l'échec antérieur à une pause se dit sans devenir une alerte quotidienne.
  9. L'avenant tarifaire LCL de novembre 2026, dans mes notes de travail sur le vertical bancaire

    17/08/2026
    Ce que l'instrument affirmait
    que l'avenant était UNE BAISSE, le seuil de gratuité des frais de succession passant de 5 965 € à 10 000 €
    Ce qui était vrai
    la valeur de départ est 5 910 € — 5 965 était un souvenir, adossé à aucune pièce. Et le sens est faux : la gratuité des dossiers SANS complexité au-dessus du seuil disparaît, ce qui fait passer une succession simple de plus de 10 000 € de gratuite à 1 % des avoirs. Sur cinq cas de lecteur, un baisse, deux sont inchangés, deux augmentent — dont le cas le plus courant.
    Ce qui l'a démasqué
    la lecture des deux PDF en octets, avec extraction des couleurs de caractères, qui a mis les cinq cas côte à côte
    La cause
    j'ai regardé UN paramètre d'une grille et j'en ai conclu le sens de LA grille. Un mouvement de seuil n'est pas un mouvement de tarif : le seuil dit qui paie, le tarif dit combien. J'ai lu le premier et parlé du second.
    La règle qui en est sortie
    R50.2 — un mouvement composite ne se résume pas. Quand une grille bouge dans deux sens selon la situation du lecteur, le sens unique n'existe pas : écrire « hausse » ou « baisse » revient à choisir un lecteur type et à tromper tous les autres. La page affiche les cas, et le lecteur se situe.
  10. Data/insee/pcs2020/_meta.json, champ « sceaux_sha256 », écrit par moi le 16 août

    17/08/2026
    Ce que l'instrument affirmait
    que les deux nomenclatures rapatriées de l'INSEE étaient scellées, et le fichier s'ouvre sur la règle « PIÈCES RAPATRIÉES TELLES QUELLES — ne pas éditer à la main »
    Ce qui était vrai
    le champ ne contenait AUCUNE empreinte : il contenait la phrase « rejoué conforme le 2026-08-16 — 312 lignes ». Le sceau avait bien été rejoué le jour du rapatriement ; il n'a jamais été rejouable ensuite. N'importe quelle retouche des CSV serait passée sans que rien ne s'en aperçoive, pendant des mois.
    Ce qui l'a démasqué
    la demande de contrôle croisé du §8 : en cherchant les empreintes à comparer, j'ai découvert qu'il n'y en avait pas
    La cause
    j'ai écrit le RÉSULTAT d'une vérification à la place de la MATIÈRE de la vérification. Une phrase rassurante occupe exactement la même place dans un fichier qu'un sha256, et elle se relit sans déclencher le moindre doute — elle est même plus agréable à lire.
    La règle qui en est sortie
    un champ de preuve porte la preuve, jamais son compte rendu. Et le compte rendu ne vaut que si un contrôle le rejoue : la règle « ne pas éditer à la main » était écrite depuis un jour sans que rien ne la joue. Un garde-fou qui n'existe qu'en prose n'est pas un garde-fou, c'est une intention. G-pcs-sceau rejoue désormais les deux empreintes à chaque construction.
  11. Scripts/qa_plafond_devient_prix.mjs, première version, sur la ligne succession de LCL

    17/08/2026
    Ce que l'instrument affirmait
    en comptant les banques face au plafond légal des frais de succession, que LCL était EN DESSOUS du plafond de 857 €
    Ce qui était vrai
    la ligne du corpus portait DEUX états datés dans la même phrase — « au 01/01/2026 […] 1 % dans la limite de 850 € […] Au 01/11/2026 […] 1 % dans la limite de 857 € ». Mon expression régulière prenait le premier, c'est-à-dire l'ancien. LCL n'est pas moins cher : sa grille en vigueur cite le plafond PÉRIMÉ du décret d'août 2025, et son avenant de novembre la recale sur 857 € au centime.
    Ce qui l'a démasqué
    le comptage lui-même : voir « en dessous 1 » alors que la rédaction venait d'écrire que LCL facture exactement le maximum légal
    La cause
    j'ai lu de la prose avec une expression régulière. Une phrase qui contient deux états n'a pas d'ordre canonique ; la regex, elle, en impose un — le premier rencontré — et ce choix arbitraire ne se voit nulle part dans le résultat.
    La règle qui en est sortie
    un état daté se structure, il ne se scrape pas. La ligne est devenue `succession_etats[]`, chaque état avec sa date d'application, son taux, sa limite et son verbatim ; et l'état retenu est celui EN VIGUEUR à la date de lecture du corpus (R47.1), pas le plus récent écrit. Une phrase se relit à chaque fois et se lit mal une fois sur deux.
  12. Lib/moteurs/ceQuiChange.mjs puis scripts/qa_plafond_devient_prix.mjs, écrits à une heure d'intervalle

    17/08/2026
    Ce que l'instrument affirmait
    rien — les deux classes de caractères étaient justes et fonctionnaient
    Ce qui était vrai
    je les avais écrites avec les codets INVISIBLES en toutes lettres : U+00A0 et U+202F tapés directement dans `[\d …]`. C'est la troisième fois. Les deux premières m'avaient coûté des heures de diagnostic ; celle-ci ne m'a rien coûté parce que je l'ai relue avant de la lancer, mais je l'avais quand même écrite.
    Ce qui l'a démasqué
    ma propre relecture, puis un `repr()` en Python qui rend les codets visibles
    La cause
    la leçon n°25 était sue et n'était pas TENUE : je la connais au moment où je relis, pas au moment où j'écris. Savoir une règle et l'appliquer sont deux gestes différents, et seul le second protège.
    La règle qui en est sortie
    leçon n°25 confirmée pour la troisième fois : dans une classe de caractères, un codet invisible s'écrit \u00a0 ou \u202f, jamais en clair. Et le corollaire, qui est le vrai enseignement : une leçon qui ne s'inscrit que dans un journal se répète. Celle-ci doit devenir un contrôle.
  13. La collecte emploi France Travail, cassée du 20 juillet au 16 août — vingt-deux exécutions planifiées

    16/08/2026
    Ce que l'instrument affirmait
    « invalid_scope » : l’application n’est pas abonnée à l’API Offres d’emploi v2. Nous en avons conclu que les identifiants étaient bons et que France Travail avait changé sa nomenclature de scope.
    Ce qui était vrai
    le compte porte DEUX applications aux abonnements différents, et les deux collectes lisaient le même nom de secret. La mise en place de ROME, le 19 juillet, a écrit ses identifiants dans le couple partagé ; la collecte emploi interrogeait depuis lors une application abonnée aux seules API ROME. Le message était exact et désignait le mauvais coupable.
    Ce qui l'a démasqué
    la comparaison des LONGUEURS d’identifiant — 89 caractères enregistrés contre 82 sur l’application consultée — puis la chronologie des exécutions GitHub, qui date l’écrasement au jour près
    La cause
    deux causes se cumulaient. Un secret PARTAGÉ entre deux consommateurs aux droits différents : le dernier configuré gagne, l’autre casse sans que rien ne le dise. Et un diagnostic qui jetait la réponse du serveur hors du mode verbeux, donc invisible sur les exécutions planifiées — les seules qui tournaient.
    La règle qui en est sortie
    un identifiant secret ne se compare pas de visu : ce qui doit être journalisé, c’est une EMPREINTE non divulgante (longueur totale, longueur du segment de nom) permettant de reconnaître quelle application répond. Et deux consommateurs aux droits différents ne partagent jamais un nom de secret — chacun lit le sien, le repli commun est un état de transition qui s’annonce comme tel.
  14. Le calcul hebdomadaire du snapshot de classement (compute_ranks), et le cache qui le sert

    16/08/2026
    Ce que l'instrument affirmait
    que le poids du snapshot était surveillé : le script l'imprimait à chaque exécution et avertissait d'un ⚠ au-delà de deux mégaoctets
    Ce qui était vrai
    le snapshot pesait 1,95 Mo pour un plafond de cache à 2 Mo — 97,5 % de remplissage — et le job sortait en SUCCÈS. Les journaux de la base montrent la conséquence : 93 lectures de la même ligne en 23 minutes malgré une revalidation à l'heure, le cache la refusant en silence. Le poste pesait des gigaoctets d'egress par jour dès que les robots parcouraient les palmarès.
    Ce qui l'a démasqué
    le croisement de deux journaux : l'export des 1000 dernières requêtes de la base (93 lectures identiques) et le journal CI du 10 août (« 1.95 Mo » imprimé en vert)
    La cause
    un seuil qui AVERTIT sans faire échouer n'existe pas : personne ne relit le journal d'un job vert. Et un instrument qui vise 2 Mo pile — le plafond exact — attend sa prochaine commune pour déborder, l'enveloppe de sérialisation n'étant même pas comptée.
    La règle qui en est sortie
    un plafond se place SOUS la limite avec marge (1,6 Mo pour 2), et son franchissement CASSE le job producteur au lieu d'imprimer un avertissement. Ce qui entre au cache est la forme compacte en lignes ; le décodage vit derrière une mémo de processus pour que même un refus ne coûte qu'une lecture par instance.
  15. La boucle de poussée écrite à la main pour pousser le correctif… des boucles de poussée

    16/08/2026
    Ce que l'instrument affirmait
    qu'elle réessayait en cas d'échec : « git push | tail -1 && break » — poussée, affichage, réessai
    Ce qui était vrai
    le tube faisait porter le verdict sur tail, pas sur git : un push rejeté sortait en succès, la boucle cassait au premier tour, et le commit n'était pas poussé. Les vingt-trois workflows corrigés au même moment n'avaient PAS ce défaut — leur boucle ne passait par aucun tube.
    Ce qui l'a démasqué
    le push suivant, rejeté en « fetch first » alors que la boucle venait d'annoncer son succès
    La cause
    l'outil qui vérifie les autres n'est vérifié par personne. C'est la troisième occurrence de la famille : le garde qui se mordait sur son propre commentaire, le garde vert sur six pages vides, et maintenant la boucle de réessai qui ne réessayait pas. Le correctif et son auteur ne partagent pas d'angle mort — ils EN SONT un.
    La règle qui en est sortie
    toute boucle de réessai se juge sur le code de retour de LA COMMANDE, jamais d'un tube qui la suit ; et un mécanisme de fiabilité écrit à la main subit le même contrôle que ce qu'il fiabilise — au minimum, sa contre-épreuve (un échec simulé doit le faire réessayer).
  16. Les deux filets de recherche par fragments joués sur les 311 libellés de la PCS 2020, pour trouver les catégories des dix métiers

    16/08/2026
    Ce que l'instrument affirmait
    qu'un fragment trouvé désigne le sujet cherché : « analyste » des analystes financiers, « édition » le monde de l'édition — et que « logistic » attraperait la logistique
    Ce qui était vrai
    « analyste » n'attrapait que les psychanalystes (31A4), « édition » attrapait l'expédition (67E1), et « logistic » — racine anglaise dans un filet destiné à des libellés français — n'attrapait rien du tout : les quatre postes de la logistique passaient au travers. Trois fautes en deux filets, dont deux par composition et une par anglicisme.
    Ce qui l'a démasqué
    la relecture des résultats un par un avant usage, et le cas connu que le premier filet aurait dû attraper : « logisticien » était précisément le métier cherché, et son poste le plus probable (38F2) manquait à la sortie
    La cause
    une recherche par fragment sur des libellés français produit des faux amis par composition — préfixes et suffixes reconstituent des mots étrangers au besoin — et une racine pensée dans une autre langue peut être muette sans bruit : un filet qui ne rend rien ressemble à une absence réelle.
    La règle qui en est sortie
    un filet de recherche sur des libellés français se construit sur des racines françaises, testées sur au moins un cas connu avant d'être livré ; tout résultat de filet se relit un par un avant usage, le bruit nommé à part des candidats — le filet propose, il ne conclut jamais.
  17. Le lecteur du badge de troncature des pages de besoin (lib/aides/badgeCroisement.mjs), joué par les deux builds de production du seize août

    16/08/2026
    Ce que l'instrument affirmait
    que « 120 dispositifs affichés sur 1 459 » annonçait un total de 1 — et bloquait le déploiement pour une faute que la page ne commettait pas
    Ce qui était vrai
    la page était en règle : c'est la classe de caractères du filet qui ne connaissait que l'espace simple. Le format français écrit ses milliers avec une espace fine insécable (U+202F), et les codepoints invisibles qui figuraient dans la classe d'à côté avaient déjà été perdus par un outillage qui les normalise sans le dire — l'éditeur lui-même n'a pas su les retrouver pour les corriger.
    Ce qui l'a démasqué
    les deux échecs de build Vercel d'affilée sur les trois seules pages dépassant mille dispositifs — la chaîne locale, elle, n'avait jamais rendu la phrase, faute d'un total assez grand pour la déclencher
    La cause
    un caractère invisible écrit en littéral dans une source se copie, se colle, se normalise et se perd sans laisser de trace visible ; une classe de caractères qui en dépend fonctionne ou casse au hasard des outils traversés.
    La règle qui en est sortie
    dans une classe de caractères, tout codepoint invisible s'écrit en échappement (\u00a0, \u202f), jamais en littéral ; et tout filet qui lit des nombres rendus en français connaît les espaces de groupement — avec un contre-exemple à chiffre groupé dans ses tests.
  18. Index des communes du registre scolaire, servi sur trente mille pages

    15/08/2026
    Ce que l'instrument affirmait
    que l'index était mis en cache une fois par semaine — le code le déclarait, et l'avertissement de taille posé le douze août veillait
    Ce qui était vrai
    l'entrée dépassait la limite de deux mégaoctets du cache de l'hébergeur, qui la refusait SANS ERREUR : la table entière se rebalayait — cinquante-quatre requêtes de mille lignes — à chaque rendu d'une page froide, au rythme des robots. Huit cent soixante-deux des mille dernières requêtes de la base étaient ce seul balayage : le premier poste de trafic sortant du site
    Ce qui l'a démasqué
    l'export des journaux de la base par Mk — mille requêtes, une fenêtre de cinq minutes, un motif écrasant
    La cause
    l'avertissement du douze août s'imprimait dans les journaux de production, que personne ne lit. Et la forme stockée — un Record où le slug s'écrit deux fois et les noms de champs trente mille fois — pesait trois fois le contenu utile.
    La règle qui en est sortie
    un avertissement imprimé là où personne ne lit n'est pas un garde : la limite se teste à la construction, sur le pire cas du territoire, et elle la fait tomber. Et ce qui entre au cache voyage en forme compacte — le poids se juge en octets, pas en entrées.
  19. Garde-fou du rendu des médicaments, au changement de gabarit

    15/08/2026
    Ce que l'instrument affirmait
    qu'il contrôlait les fiches — il les repérait à leur titre commençant par « Prix »
    Ce qui était vrai
    le nouveau gabarit ne commence plus par « Prix » : la reconnaissance n'aurait plus trouvé une seule fiche, et le garde serait sorti VERT sans avoir rien contrôlé
    Ce qui l'a démasqué
    la relecture du garde avant de changer la règle qu'il garde
    La cause
    un garde qui se reconnaît à CE QU'IL CONTRÔLE s'éteint le jour où ce qu'il contrôle change. Il identifiait par le title, c'est-à-dire par l'objet même de sa règle.
    La règle qui en est sortie
    un garde identifie ses cibles par un critère INDÉPENDANT de la règle qu'il applique — ici l'adresse du fichier — et il exige un compte minimal : zéro cible contrôlée est un échec, jamais un succès.
  20. G-besoin, au premier rendu des six pages de croisement des aides

    15/08/2026
    Ce que l'instrument affirmait
    que chaque page de besoin disait bien combien de dispositifs elle liste — il exigeait la présence d’un CHIFFRE dans le badge d’âge
    Ce qui était vrai
    les six pages listaient ZÉRO dispositif, le registre étant injoignable à la construction. Zéro est un chiffre : le garde est sorti vert sur six pages vides, prêtes à être publiées pour capter des impressions.
    Ce qui l'a démasqué
    la lecture à la main du badge servi, après que le garde eut annoncé vingt-quatre contrôles conformes
    La cause
    le garde contrôlait la FORME de la déclaration (un nombre est là) au lieu de ce que la déclaration engage (il y a quelque chose derrière la porte). Une condition que la valeur nulle satisfait ne sépare rien.
    La règle qui en est sortie
    un garde de comptage contrôle un COUPLAGE qui peut casser des deux côtés — ici : une vue vide est retirée aux moteurs, une vue peuplée leur est offerte — et il IMPRIME le compte obtenu, pour qu’un zéro se voie même quand il est légitime.
  21. Les vues de croisement des aides — besoins et départements — au premier jet

    15/08/2026
    Ce que l'instrument affirmait
    que les pages étaient conformes : badge d’âge complet, date de base exacte, compte calculé, retrait aux moteurs correctement couplé, cent une pages servies. Tout au vert.
    Ce qui était vrai
    la liste était triée du périmètre le plus LARGE au plus proche, puis coupée à cent vingt. Chaque page départementale aurait servi cent vingt dispositifs nationaux — les mêmes dans les cent un départements — en jetant les dispositifs départementaux, c’est-à-dire la seule raison d’être de la page.
    Ce qui l'a démasqué
    la relecture de PERIM_RANK au moment d’écrire un contrôle sans rapport : le rang vaut 0 pour le communal et 3 pour le national, l’ordre décroissant mettait donc le national en tête
    La cause
    les gardes contrôlaient la PRÉSENCE et la DÉCLARATION — un compte, une date, une balise — et rien sur l’ORDRE. Une page pleine, datée, correctement indexée et entièrement hors sujet satisfait toutes ces conditions.
    La règle qui en est sortie
    quand une liste est TRONQUÉE, ce que la coupe sacrifie fait partie de ce que la page promet : l’ordre se contrôle comme une valeur. Ici, la suite des périmètres servis ne doit jamais décroître.
  22. Garde-fou du plateau vidéo, premier passage

    13/08/2026
    Ce que l'instrument affirmait
    que le plateau du film était conforme — il sortait vert, avec un joli décompte
    Ce qui était vrai
    il n'avait joué AUCUN de ses propres contrôles : le moteur qu'il importait avait pris le contrôle et terminé le processus à sa place, avant la première lecture du HTML servi
    Ce qui l'a démasqué
    la lecture du décompte final, qui annonçait dix-sept contrôles là où le garde en portait plus de quarante
    La cause
    le moteur décide s'il est le programme lancé en regardant si le chemin d'exécution SE TERMINE par son nom de fichier. Le garde s'appelle « qa_video_plateau.mjs » ; il se termine par « plateau.mjs ».
    La règle qui en est sortie
    un module reconnaît son propre lancement en comparant les ADRESSES ENTIÈRES, jamais leurs terminaisons. Et un décompte de contrôles se lit : un garde qui sort vert trop vite n'est pas un garde rapide, c'est un garde qui n'a pas joué.
  23. Fiches de provenance, sur toute page portant un nombre près du bord droit

    13/08/2026
    Ce que l'instrument affirmait
    que rien ne dépassait : la mesure de gabarit écartait les éléments à visibilité masquée, au motif écrit qu'« un panneau replié n'a pas de lecteur, il ne déborde pour personne »
    Ce qui était vrai
    les fiches fermées étaient invisibles mais toujours mises en page, et une boîte positionnée en absolu qui dépasse ÉLARGIT LE DOCUMENT : le comparateur bancaire se tirait latéralement de cent soixante-trois pixels, sans qu'aucun élément visible ne dépasse
    Ce qui l'a démasqué
    un lecteur qui a trouvé l'affichage de bureau « bugué », puis un relevé de la largeur de défilement de la page au lieu de la géométrie des éléments
    La cause
    un motif d'exemption vrai pour la LISIBILITÉ appliqué au DÉFILEMENT. L'œil ne voit pas un élément masqué ; le moteur de rendu, si.
    La règle qui en est sortie
    on mesure la largeur de défilement de la PAGE, pas la géométrie des éléments visibles. Et une exemption se justifie règle par règle : un motif valable pour un contrôle ne se transporte pas dans un autre.
  24. Barre de navigation principale, toutes largeurs de bureau

    13/08/2026
    Ce que l'instrument affirmait
    que le gabarit était conforme — la mesure jouait trois largeurs et sortait verte
    Ce qui était vrai
    le dernier pilier de la barre se repliait sur deux lignes à toutes les largeurs, de mille vingt-quatre à mille neuf cent vingt : la rangée s'épaississait et son chevron partait à la ligne
    Ce qui l'a démasqué
    une capture d'écran de bureau envoyée par un lecteur
    La cause
    la barre était bridée à la largeur d'un paragraphe de lecture, donc elle débordait de son CADRE sans jamais déborder de la FENÊTRE — et la seule largeur de bureau mesurée était plus large que ce cadre. Le défaut vivait exactement dans l'angle mort de l'instrument.
    La règle qui en est sortie
    une mesure de gabarit couvre les DEUX côtés de chaque bascule déclarée, et elle mesure le cadre autant que la fenêtre. Un intitulé de navigation ne se replie jamais : s'il ne tient pas, il doit se voir comme un débordement, pas se cacher dans un retour à la ligne.
  25. Garde-fou d'accord en genre des établissements

    12/08/2026
    Ce que l'instrument affirmait
    que la faute « un école public situé » était encore dans le code
    Ce qui était vrai
    elle était corrigée — la chaîne fautive ne restait que dans le COMMENTAIRE qui explique la correction
    Ce qui l'a démasqué
    l'échec du garde sur des fichiers pourtant corrigés
    La cause
    l'instrument cherchait la faute dans le fichier entier, commentaires compris.
    La règle qui en est sortie
    un garde qui interdit de NOMMER le défaut qu'il corrige interdit d'expliquer la correction. Les commentaires se retirent avant la recherche.
  26. Garde-fou de fraîcheur des articles

    12/08/2026
    Ce que l'instrument affirmait
    que le producteur d'articles fabriquait des faits sans date
    Ce qui était vrai
    tous portaient leur date ; l'instrument coupait une ligne en deux
    Ce qui l'a démasqué
    des noms de faits vides dans le rapport d'échec
    La cause
    une expression de gabarit porte ses propres accolades, et le relevé par accolades s'y perdait.
    La règle qui en est sortie
    quand la donnée tient sur une ligne, on la relève ligne à ligne. Un instrument doit être plus simple que ce qu'il mesure.
  27. Décryptage immobilier servi en page d'accueil

    12/08/2026
    Ce que l'instrument affirmait
    un rendement locatif présenté sous la date du jour
    Ce qui était vrai
    il divisait un loyer par un prix vieux de deux ans, et ne portait lui-même aucune date
    Ce qui l'a démasqué
    un lecteur — puis un garde-fou écrit dans la foulée
    La cause
    un chiffre dérivé n'héritait pas de la date de ses opérandes.
    La règle qui en est sortie
    un fait sans date ne se publie pas, et un chiffre dérivé porte la PLUS ANCIENNE date de ses opérandes. Le millésime s'affiche à côté de la date de publication dès qu'ils s'écartent.
  28. Toutes les fiches communes

    12/08/2026
    Ce que l'instrument affirmait
    des prix immobiliers courants
    Ce qui était vrai
    un millésime de retard : la source publie deux fois l'an, et la parution d'avril n'avait pas été ingérée
    Ce qui l'a démasqué
    le budget de fraîcheur du garde précédent, qui a déduit qu'un millésime plus récent devait exister
    La cause
    une source à rythme connu que personne ne guettait.
    La règle qui en est sortie
    une source à rythme connu se guette, elle ne se découvre pas. Un retard n'interdit pas de publier — son silence, si.
  29. Page d'accueil, bande des décryptages

    12/08/2026
    Ce que l'instrument affirmait
    que le défaut du rendement locatif de deux mille vingt-quatre était corrigé
    Ce qui était vrai
    il ne l'était que pour les articles À VENIR : les centaines déjà publiés n'avaient aucun millésime en base, donc aucun badge, et l'un d'eux tenait encore la une avec des prix de deux ans
    Ce qui l'a démasqué
    un lecteur qui a revu le même défaut en production après l'annonce de sa correction
    La cause
    le millésime était écrit en base au moment de la publication, au lieu d'être calculé au rendu — et la vitrine ne filtrait rien.
    La règle qui en est sortie
    une correction qui ne vaut que pour l'avenir laisse le défaut servi : c'est la moitié d'une correction. Le verdict se recalcule à chaque rendu, contre la date de relevé et non contre la date de publication, et la vitrine écarte ce qui est hors budget en DISANT combien elle a écarté.
  30. Registre bancaire, collecte des documents tarifaires

    12/08/2026
    Ce que l'instrument affirmait
    que deux établissements servaient un document tarifaire périmé à leur adresse officielle
    Ce qui était vrai
    leur document COURANT était publié ailleurs sur le même site, listé avec son libellé daté sur la page de tête — l'adresse que nous suivions était une URL périmée encore en ligne
    Ce qui l'a démasqué
    la relecture de la page de tête de chaque établissement, au lieu de la seule adresse mémorisée
    La cause
    une adresse mémorisée une fois et suivie ensuite sans revérifier ce que l'établissement présente comme courant.
    La règle qui en est sortie
    avant de déclarer la fraîcheur d'un document non confirmée, relire la PAGE DE TÊTE de l'établissement : le document courant y est listé avec son libellé daté. Découvrir puis récupérer, jamais récupérer une adresse mémorisée — c'est la garantie contre le fossile.
  31. Comparateur bancaire, entrée du classement

    12/08/2026
    Ce que l'instrument affirmait
    qu'un tarif publié d'avance figurait au classement avec sa note, comme la règle venait de l'exiger
    Ce qui était vrai
    l'entité n'atteignait même pas le composant : la vue qui lui fournissait les banques la filtrait en amont, et le classement paraissait conforme parce qu'il n'avait rien à classer
    Ce qui l'a démasqué
    le garde de surface, qui a réclamé la mention de médiane sur une page où l'entité était introuvable
    La cause
    une règle posée sur une VUE déjà triée plutôt que sur la population complète.
    La règle qui en est sortie
    R48.1 — un garde se pose sur la population complète, jamais sur une vue. Une règle qu'on peut satisfaire en changeant les données d'entrée n'est pas une règle, c'est une préférence.
  32. Page d'accueil

    11/08/2026
    Ce que l'instrument affirmait
    « 0 signal capté aujourd'hui » — la vitrine du site annonçait qu'elle n'avait rien capté
    Ce qui était vrai
    trente-sept mille trois cent cinquante-neuf points de données étaient synchronisés le jour même
    Ce qui l'a démasqué
    la lecture du HTML SERVI, et non de la page une fois animée dans le navigateur
    La cause
    le compteur partait de zéro et montait par animation. Le nombre était juste dans la donnée, faux dans le document livré — et c'est le document livré que lisent les moteurs de recherche, les lecteurs d'écran et le premier coup d'œil.
    La règle qui en est sortie
    un garde-fou lit la surface RENDUE, jamais l'intention du composant. Ce qui n'est pas dans le HTML servi n'existe pas.
  33. Fiches d'aides aux entreprises

    11/08/2026
    Ce que l'instrument affirmait
    des métadonnées de description « présentes »
    Ce qui était vrai
    elles étaient servies VIDES sur une partie des pages
    Ce qui l'a démasqué
    un contrôle de longueur sur les métas du build
    La cause
    l'opérateur de repli employé ne voit que l'absence de valeur, pas la chaîne vide. Un objet qui répond « » passait donc devant son repli sans le déclencher.
    La règle qui en est sortie
    un repli doit se déclencher sur ce qui est VIDE, pas seulement sur ce qui est absent. Le vide est une valeur, et c'est la plus trompeuse.
  34. Grilles d'électricité, abonnements à neuf et douze kilovoltampères

    11/08/2026
    Ce que l'instrument affirmait
    des abonnements en base là où le document donnait des heures creuses
    Ce qui était vrai
    les deux colonnes du document ne divergent qu'à partir de neuf kilovoltampères — en dessous, elles sont identiques, et le glissement était donc invisible
    Ce qui l'a démasqué
    un pont d'identité entre deux sources indépendantes, rejoué à chaque construction du site
    La cause
    une lecture de colonne appariée sur un tableau où deux colonnes se ressemblent aux premières lignes.
    La règle qui en est sortie
    une correction publique, numéro quinze, et une identité qui fait tomber la construction si l'explication cesse d'être vraie. Un contrôle qui ne peut pas échouer ne contrôle rien.
  35. Première mise en production du module énergie

    11/08/2026
    Ce que l'instrument affirmait
    rien — la construction s'arrêtait net
    Ce qui était vrai
    la mesure mobile avait déjà été jouée, sur le même code, au poste de travail
    Ce qui l'a démasqué
    l'échec de la première publication
    La cause
    le garde cherchait un navigateur sur des machines de construction qui n'en installent pas.
    La règle qui en est sortie
    sans son instrument, un garde DÉCLARE bruyamment qu'il ne joue pas ici, et dit où il joue. La déclaration n'est pas une tolérance silencieuse : elle s'imprime dans chaque journal de construction.
  36. Garde-fou de fraîcheur de l'accueil

    11/08/2026
    Ce que l'instrument affirmait
    un compteur à zéro dans une page qui affichait le bon nombre
    Ce qui était vrai
    le nombre était bien là, coupé en deux par un nœud de commentaire du moteur de rendu
    Ce qui l'a démasqué
    le garde qui se mordait lui-même à son premier passage
    La cause
    l'analyseur lisait « 37 359<!-- --> signaux » et n'y voyait pas de nombre.
    La règle qui en est sortie
    un analyseur de surface retire les nœuds techniques avant de lire, et il porte un contrôle dédié à ce piège précis.
  37. Mesure mobile du module énergie

    10/08/2026
    Ce que l'instrument affirmait
    « feuille de style absente » sur douze mesures d'un coup
    Ce qui était vrai
    les pages étaient parfaitement habillées
    Ce qui l'a démasqué
    le port occupé par un serveur survivant d'une construction interrompue
    La cause
    l'instrument mesurait un serveur qu'il n'avait pas démarré, lequel servait un build effacé.
    La règle qui en est sortie
    un instrument refuse de mesurer ce qu'il n'a pas mis en place — et un refus de mesurer est un échec du garde, jamais un laissez-passer.

Ce que cette page n'est pas

Ce n'est pas une confession, et ce n'est pas un exercice de modestie. Chaque défaut ci-dessus a laissé un garde-fou qui fait tomber la construction du site s'il revient — la correction sans le garde n'est qu'une réparation ; avec lui, c'est une leçon. Ce que les sources, elles, nous refusent est ailleurs : sur notre page de méthode et sur les pages de couverture de chaque module. Registre tenu au le dix-huit août deux mille vingt-six.