INGÉNIERIE — QUALITÉ & PUBLICATION

Un pipeline de publication qui sait dire non

Trois gates bloquants, trois états au lieu de deux, un panel adversarial avant la mise en ligne. Et le soir où un relecteur a recompté un « 17 » annoncé pour trouver 15.

Gates & panels
15 min
Le refus comme fonctionnalité

Une chaîne qui publie toujours ne contrôle rien

Une chaîne de publication automatisée a un biais natif : elle est faite pour produire. Chaque étape est écrite pour aboutir, chaque erreur récupérable est récupérée, et l'absence d'obstacle se lit comme une réussite. Ce biais est confortable jusqu'au jour où le contenu qui sort est faux. Une page web se corrige. Un courriel parti chez de vrais abonnés, non.

La question d'ingénierie n'est donc pas « comment publier plus vite ». C'est combien de manières distinctes cette chaîne a-t-elle de refuser, et est-ce que chacune de ces manières fonctionne vraiment. Notre pipeline en compte trois de nature déterministe, plus une de nature adversariale. Voici ce que chacune arrête, ce qu'elle a laissé passer, et pourquoi la plus dangereuse des pannes est un gate qui répond vert sans avoir rien vérifié.

3 + 1
Trois gates déterministes bloquants, puis un panel adversarial avant mise en ligne
3 états
Passe / échoue / n'a pas pu vérifier, le troisième aussi bloquant que le deuxième
17 → 15
Un compte affirmé par le rédacteur, recompté aux sources par un relecteur, corrigé avant publication
~30 min
Ce que coûte le panel sur un cycle complet, arbitré et accepté

Trois gates déterministes

Un gate déterministe est un script qui rend un code de sortie. Il ne discute pas, il ne nuance pas, il n'a pas d'avis. Sa valeur vient précisément de là : il produit le même verdict sur la même entrée, toujours, pour un coût nul.

1 · Le gate de fraîcheur, ou le contrat de date

Notre règle interne interdit de publier sur des données périmées. Elle a longtemps existé en prose, dans un document que tout le monde était censé lire. Une règle en prose ne bloque rien : un article pouvait sortir avec des cotations de l'avant-veille présentées comme fraîches, et personne ne le voyait.

Le gate transforme la règle en code de sortie. Pendant la collecte, le producteur écrit un manifeste à côté de l'artefact : chaque source de données y est déclarée avec son horodatage réel, celui renvoyé par l'appel, jamais l'heure courante. Le gate ne récupère rien et n'estime rien. Il compare des horodatages, et il bloque dans cinq cas : manifeste absent, source obligatoire manquante, horodatage illisible, source plus vieille que son âge maximal déclaré, ou source datée du futur de plus de quinze minutes. Ce dernier cas mérite d'exister : un horodatage en avance signale soit une horloge fausse, soit un timestamp inventé.

// Manifeste écrit pendant la collecte, lu par le gate
{
  "contenu": "briefing/20260814",
  "sources": [
    { "nom": "cloture_us", "as_of": "2026-08-13T20:00:00Z", "age_max_h": 24, "requis": true },
    { "nom": "regime",     "as_of": "2026-08-14T10:14:00Z", "age_max_h": 6,  "requis": true },
    { "nom": "calendrier", "as_of": "2026-08-14T10:16:00Z", "age_max_h": 24, "requis": true }
  ]
}

2 · La validation quantitative

Le second gate lit la sortie chiffrée du producteur et la confronte aux règles dures de la maison : arithmétique des niveaux, rapport risque/récompense minimal calculé depuis une entrée réellement atteignable, plafonds de concentration, exclusions réglementaires, cohérence entre ce qui est annoncé et ce qui est publié. Une sortie non conforme ne part pas. Ce gate tourne avant l'indexation, donc avant qu'un lecteur puisse voir quoi que ce soit.

3 · Le détecteur de tics

Le troisième gate ne regarde ni les données ni les niveaux : il regarde la langue. Il balaie la prose visible, tags retirés, et signale 77 formules toutes faites (les tournures de transition mécaniques, les clichés marketing, les définitions réflexes), 8 connecteurs formels dont l'accumulation trahit une cadence de machine, et une densité de tirets cadratins au-delà de six pour cinq cents mots. Il attrape aussi les termes d'infrastructure interne qui n'ont rien à faire dans un texte publié.

Zéro signalement ne prouve pas qu'un humain a écrit. Un signalement, en revanche, impose de réécrire. Le gate ne corrige rien : il refuse, et rend la main.

Pourquoi trois gates séparés

Chacun mesure une chose que les autres ne voient pas. Un texte peut être parfaitement écrit sur des données mortes, arithmétiquement juste dans une langue de robot, ou frais et bien tourné avec un rapport risque/récompense fabriqué. Un gate unique qui tenterait de tout couvrir échouerait mal : on ne saurait pas ce qui a cassé. Trois codes de sortie distincts donnent trois diagnostics distincts.

Le piège : un gate vert sur rien

Le 8 août, un audit a passé au crible trois de nos gates sur une production bloquée : le connecteur de données répondait en erreur, aucune donnée n'avait été collectée, aucun titre n'avait été retenu. Les trois défauts ont survécu entièrement à la panne.

Le gate de fraîcheur a rendu « 4 sources vérifiées, 0 bloquante », code de sortie 0. Vert. Or les neuf fichiers de rôle produits pendant la collecte portaient tous un statut bloquant. Le gate faisait exactement ce qu'il annonçait, comparer des horodatages, mais un manifeste décrit une intention de collecte, il ne prouve pas qu'elle a abouti. Détail plus embarrassant encore : les statuts d'échec existaient bel et bien, écrits proprement sur disque, et aucun outil du dépôt ne les lisait. Les producteurs consignaient consciencieusement leur échec dans le vide.

Le deuxième gate, lui, avalait son argument de chemin. On lui demandait d'auditer la production du jour ; il ignorait silencieusement l'argument positionnel et auditait le dernier jour ouvré, puis sortait 0. La cible visée n'a reçu aucune couverture tout en affichant un feu vert.

Le troisième cas est le plus instructif. Une métrique de corrélation était publiée en métadonnée du panier. Elle avait été calculée sur le crible initial, pas sur le panier final : la moitié des lignes publiées n'avait jamais été mesurée. Les chiffres affichés décrivaient un portefeuille qui n'existait pas, et les deux règles de dé-concentration qui s'appuyaient dessus ne pouvaient rien mordre.

Pire que l'absence de contrôle

Un gate qui rend 0 est lu comme « vérifié ». Quand il rend 0 parce qu'il n'a rien pu vérifier, ou parce qu'il a vérifié autre chose, il ne protège plus : il certifie. C'est strictement pire que son absence. Sans gate, on doute et on relit. Avec un gate vert, on publie.

Le correctif tient en une phrase : un gate doit distinguer trois états, jamais deux.

Passe

Le contrôle s'est exécuté et la condition est remplie. Le seul état qui autorise la suite.

Échoue

Le contrôle s'est exécuté et la condition est violée. Blocage, avec le détail de la violation.

N'a pas pu vérifier

Source absente, argument ignoré, exception avalée. Aussi bloquant que l'échec en publication.

Quatre règles en découlent, et elles sont devenues des invariants de revue de code chez nous. Un fichier de rôle sans déclaration explicite de statut est traité comme bloquant : l'absence de déclaration ne vaut pas feu vert. Un bloc de rattrapage d'exception à l'intérieur d'un contrôle n'est jamais muet, il remonte au minimum « contrôle non exécuté ». Un outil qui reçoit un argument qu'il ne sait pas traiter le refuse au lieu de l'ignorer, parce qu'ignorer revient à répondre à côté avec assurance. Enfin, une métadonnée d'échec n'a de valeur que si un consommateur la lit : la vérification se fait en cherchant, dans le dépôt, quel outil la consulte. Si personne ne la lit, ce n'est pas un contrôle, c'est de la documentation.

Après correction, le gate de fraîcheur lit les fichiers de rôle et échoue sur tout statut bloquant. Cinq productions saines passées en régression sont restées identiques au bit près ; seule la production cassée est passée de « 0 bloquante » à neuf.

Une leçon sur soi-même

La première version de ce troisième contrôle lisait une variable hors de sa portée, et son bloc de rattrapage muet avalait l'erreur de référence. Le contrôle ne s'exécutait jamais, et ne le disait pas. Autrement dit : un échec silencieux écrit en corrigeant des échecs silencieux. Le motif est assez fort pour se reproduire jusque dans son propre correctif.

Le panel adversarial, avant la mise en ligne

Les gates déterministes couvrent la forme, les seuils et la fraîcheur. Ils ne savent pas dire si un chiffre est vrai, ni si une thèse tient debout. C'est le travail du panel : plusieurs relecteurs spécialisés, chacun avec un mandat étroit, qui passent sur l'artefact avant qu'il ne soit indexé, avec pouvoir de blocage.

Relecteur Mandat Ce qu'il bloque
Données Chaque chiffre publié est re-vérifié à la source, chaque ratio recalculé Chiffre fabriqué, chiffre périmé, statistique qui ne recoupe pas son propre tableau
Exécution Le contenu est-il jouable aux niveaux annoncés, aujourd'hui Cible atteignable seulement sur un repli fictif, entrée trop éloignée du cours
Risque Dilution, concentration, plafonds de taille, avertissements obligatoires Risque de dilution non divulgué, dépassement de plafond, avertissement manquant
Cohérence de portefeuille Le panier exprime-t-il la thèse qu'il déclare Posture défensive annoncée avec un panier haut bêta, « diversification » qui est un seul pari
Édition Titre exact, structure, sources citées, absence de remplissage Titre plus fort que le contenu, section vide, affirmation sans source

Le panel a été explicitement arbitré le 11 août, face à un objectif de latence de cinq minutes sur la production quotidienne. La décision a été de le garder, en connaissance du coût : le budget de cinq minutes porte désormais sur la collecte et la publication scriptées, pas sur le cycle complet. Un cycle complet dure une trentaine de minutes, et c'est accepté. Le raisonnement ne se comprime pas comme du transport de données.

Calibrer plutôt que supprimer

La bonne variable d'ajustement n'est pas l'existence du panel, c'est sa taille, et elle se calibre sur l'enjeu de diffusion : sept relecteurs pour un contenu qui part par courriel chez des abonnés, trois pour un produit quotidien déjà couvert par des gates déterministes, zéro pour une page web sans notification. Le score de matérialité calculé au moment de la publication fournit déjà cette mesure.

Le soir où « 17 » valait 15

Le cas le plus utile n'est pas une erreur de calcul. C'est un chiffre inventé par confort.

Le rédacteur produit un article qui s'appuie sur un décompte : le nombre d'éléments retenus après filtrage. Il écrit « 17 » dans le corps du texte et dans le résumé. Le chiffre est plausible, il est cohérent avec le reste du paragraphe, et il donne au propos une précision agréable. Aucun gate déterministe ne peut l'attraper : la structure est bonne, la langue est propre, les données déclarées sont fraîches, le décompte n'est pas un ratio soumis à une règle dure. Le texte passe les trois gates en vert.

Relecteur données
Le corps du texte annonce 17 éléments retenus. J'ai recompté depuis les fichiers sources : j'en trouve 15. Le résumé reprend 17. Écart non expliqué par un filtrage postérieur.
Rédacteur
Le compte incluait deux lignes écartées plus tard dans la chaîne.
Arbitre
Vérification aux sources : 15. Les deux lignes invoquées ne figurent dans aucun fichier intermédiaire. Le chiffre publié doit être 15, dans le corps et dans le résumé. Blocage levé après correction.

Trois choses méritent d'être notées. D'abord, la fabrication n'était pas un mensonge délibéré : c'est le mode de défaillance ordinaire d'un modèle de langage, qui produit le token le plus vraisemblable quand il n'a pas recompté. Ensuite, la justification apportée après coup était elle aussi fabriquée, ce qui est le vrai danger : un rédacteur interrogé sur un chiffre faux produira volontiers une explication plausible. C'est pourquoi l'arbitre ne tranche jamais sur l'argument, il tranche sur la source.

Enfin, ce défaut est structurellement invisible aux contrôles automatiques. Il faut quelqu'un dont le mandat est de recompter, et qui ne partage pas le contexte de celui qui a écrit. Un relecteur qui hérite du raisonnement de l'auteur hérite aussi de ses raccourcis.

La règle qui en découle

Tout compte, tout total, tout « sur N » présent dans un texte publié est un chiffre vérifiable, donc un chiffre à vérifier. Le relecteur données ne relit pas le paragraphe : il recompte le fichier et compare. La différence entre relire et recompter est exactement la différence entre passer et attraper.

Ce que le refus achète, en une journée

La valeur d'un gate se mesure mal en absolu. Elle se mesure à ce qu'il arrête. Relevé factuel sur une seule journée de production, du 10 au 11 août.

Artefact Ce que le panel a trouvé Issue
Revue hebdomadaire Environ 19 cotations fausses, dont un indice présenté comme la plus forte hausse mondiale alors qu'il baissait, 4 inversions de signe, une mesure de volatilité relevée en séance étiquetée clôture de la veille Bloqué, réécrit
Revue hebdomadaire (taille de position) Lignes dimensionnées entre 31 % et 62 % de l'actif net, contre un plafond maison de 18,4 % Bloqué
Analyse d'une valeur Risque de dilution de 32,5 millions d'actions, soit environ 10 % du capital, absent du texte : onze fois ce qui était déclaré Bloqué
Article de rotation sectorielle Le panel a trouvé le catalyseur que l'auteur affirmait inexistant. Thèse entière invalidée, prête à partir Bloqué
Sélection mensuelle Contrat de date violé, libellé de rapport risque/récompense faux, une ligne annoncée exécutable au marché sous le plancher maison Bloqué
Revue hebdomadaire, deuxième passe Gonflée à 13 391 mots pour une vingtaine de faits, puis amputée de 6 sections obligatoires à la réécriture Bloqué deux fois, pour des raisons opposées

Deux blocages sur le même artefact pour des raisons contradictoires méritent d'être affichés plutôt que cachés : la première réécriture a sur-corrigé. Un panel qui ne bloquerait qu'une fois par artefact, par convention, laisserait passer la seconde version. Le nombre de passes n'est pas une métrique de qualité du panel, c'est une métrique de difficulté du sujet.

Refuser est une fonctionnalité

Dans une chaîne de production classique, un blocage est un incident : quelque chose a cassé, il faut réparer pour que ça reparte. Dans une chaîne qui publie des chiffres, le blocage est le produit. Il est ce qu'on achète en construisant les gates, et le taux de blocage n'est pas un indicateur de mauvaise santé.

Le renversement mental est là. Nos indicateurs de pipeline ne mesurent plus seulement le nombre de publications réussies, ils mesurent le nombre de refus et leurs motifs. Une semaine à zéro refus n'est pas une bonne semaine : c'est une semaine où il faut aller vérifier que les gates s'exécutent encore.

Les six invariants

  • Chaque règle éditoriale importante existe en code de sortie, pas seulement en prose.
  • Trois états, jamais deux. « N'a pas pu vérifier » bloque comme « échoue ».
  • Aucun bloc de rattrapage muet dans un contrôle.
  • Un outil refuse un argument qu'il ne sait pas traiter au lieu de l'ignorer.
  • Une métadonnée d'échec doit avoir un lecteur identifié dans le dépôt.
  • Tout compte publié est recompté à la source par quelqu'un qui n'a pas écrit le texte.

Portée

Les incidents et relevés cités proviennent de notre propre chaîne de publication, à des dates identifiées. Ils décrivent une architecture logicielle et des pratiques de contrôle qualité. Cet article ne constitue pas un conseil financier, et les artefacts mentionnés le sont à titre d'illustration technique.

Intro Les gates Trois états Le panel Le « 17 » Relevé Synthèse