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.
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.
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.
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.
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.
« 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.
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
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
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.
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.
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.
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é.
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.
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.
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.
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.
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.
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.
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é.
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.
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.
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.
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.
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.
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.
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.
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.