Contradicted by the source
“Un repost vaut 20 fois un like.”
RetweetWeight est de 1,0 et FavoriteWeight est de 0,5, donc un repost a deux fois le poids d'un like — pas vingt fois.
D'où cela vient : Aucune version publiée de l'algorithme n'a jamais utilisé 20. Le ranker lourd de 2023 a également pondéré le retweet à 1,0 contre le favori à 0,5.
Was true, of an older version
“Une réponse vaut 27 fois un like (ou 13,5 fois).”
ReplyWeight est de 5,0 contre FavoriteWeight de 0,5, soit dix fois — et quarante fois entre les suivis mutuels, car BidirectionalFollowReplyWeightBoost ajoute 15,0 au poids de la réponse pour les publications originales entre les comptes qui se suivent.
D'où cela vient : Les deux chiffres étaient réels, pour un modèle qui n'existe plus : le ranker lourd de 2023 a publié 27 le 31/03/2023, puis 13,5 le 05/04/2023. Ils décrivent un pipeline Scala remplacé par l'actuel en Rust.
Was true, of an older version
“Les clics sur votre profil valent 12 fois un like.”
ProfileClickWeight est de 0,0. Un clic sur le profil ne contribue en rien au score pondéré.
D'où cela vient : 12,0 était le poids en 2023 pour `good_profile_click` — un signal composé différent (ouvrir un profil ET ensuite aimer ou répondre). Le modèle actuel a une tête de clic de profil simple, pondérée à zéro.
No such parameter exists
“Un signet vaut 10 likes — les signets sont le signal le plus fort.”
Il n'y a pas de poids de signet dans param.rs, donc les signets n'entrent pas du tout dans le score pondéré. Ils ne sont cependant pas invisibles : bookmark_count est hydraté sur chaque candidat comme une caractéristique du modèle, et ClientTweetBookmark compte comme un engagement positif dans l'historique du spectateur. Lu, mais non pondéré.
D'où cela vient : Le rafraîchissement Scala de 2025 a bien déclaré un paramètre home_mixer_model_weight_bookmark — avec une valeur par défaut de 0,0. Aucune version publiée ne l'a jamais pondéré à 10.
Ce que nous avons recherché, au commit épinglé
Il n'y a pas de poids de signet dans param.rs
bookmark · 2 fichiers · 0 correspondances
bookmark_count est hydraté sur chaque candidat en tant que caractéristique du modèle
bookmark_count · 1 fichier · 5 correspondances
ClientTweetBookmark compte comme un engagement positif dans l'historique du spectateur
ClientTweetBookmark · 1 fichier · 1 correspondance
Right numbers, wrong reading
“Un signalement annule 468 likes (−234,0 ÷ 0,5).”
L'arithmétique est juste et la conclusion est toujours fausse. Les poids multiplient une PROBABILITÉ PRÉDITE, pas un nombre d'actions. X indique que la probabilité de base d'un signalement est plus de mille fois inférieure à celle d'un like, donc diviser un poids par un autre ne donne pas un taux de change entre les actions.
D'où cela vient : Celui-ci n'est pas obsolète — c'est une mauvaise interprétation de chiffres corrects, et il apparaît même sur des pages qui publient le bon tableau. X a ajouté un avertissement explicite à ce sujet dans son propre README le 14/08/2026.
No such parameter exists
“La vélocité d'engagement compte 1000×, l'autorité de l'auteur 50×, la récence 22×.”
Aucun paramètre nommé pour la vélocité, l'autorité ou la récence n'existe dans param.rs. L'âge n'est pas du tout un poids — c'est une coupure nette : AgeFilter supprime toute publication plus ancienne que MAX_POST_AGE, une constante compilée de 48 heures. Rien ne multiplie le score d'une publication par sa fraîcheur.
Ce que nous avons recherché, au commit épinglé
Aucun paramètre nommé pour la vélocité, l'autorité ou la récence n'existe dans param.rs
velocity|authority|recency · 1 fichier · 0 correspondances
AgeFilter supprime toute publication plus ancienne que MAX_POST_AGE
AgeFilter::new\(.*MAX_POST_AGE · 1 fichier · 1 correspondance
Contradicted by the source
“Un groupe coordonné peut enterrer votre publication en la signalant ou en la bloquant massivement.”
X aborde ce point directement dans les commentaires de param.rs, et le mécanisme qu'il décrit est vérifiable : le modèle prédit VOTRE probabilité d'une action, donc les recommandations sont personnalisées — les signalements d'une brigade affectent principalement ce qui est recommandé aux personnes similaires à cette brigade. Et un engagement ne compte que s'il se produit sur une publication servie dans le fil d'actualité principal : naviguer directement vers une publication, par exemple depuis un chat de groupe, n'a aucun impact sur le classement.
D'où cela vient : Une inférence raisonnable à partir des poids négatifs très importants, que les poids seuls ne supportent pas.
Ce que nous avons recherché, au commit épinglé
Was true, of an older version
“X a publié le code mais a retenu les poids de classement pour des raisons de sécurité.”
Vrai pour la version de janvier 2026, faux depuis le 13/08/2026. Les valeurs numériques par défaut sont maintenant dans param.rs, et X déclare que les scripts cron les maintiennent égales aux valeurs de production primaires.
D'où cela vient : Rapportage précis de la publication de janvier 2026, jamais mis à jour après août.
Ce que nous avons recherché, au commit épinglé
Contradicted by the source
“Les publications contenant des liens externes sont déclassées.”
Dans le code de classement publié, OpenLinkWeight est POSITIF à 0.2 et appliqué inconditionnellement — l'ouverture d'un lien est récompensée. Les liens ne sont pénalisés que par des étiquettes de sécurité telles que MALICIOUS_URL et DO_NOT_AMPLIFY, qui concernent la destination, et non le fait de créer un lien externe.
Ce que nous avons recherché, au commit épinglé
Les liens ne sont pénalisés que par des étiquettes de sécurité telles que MALICIOUS_URL
MALICIOUS_URL · 7 fichiers · 1 correspondance
… et DO_NOT_AMPLIFY
DO_NOT_AMPLIFY · 7 fichiers · 1 correspondance
Contradicted by the source
“Une coche payante offre un boost de classement.”
Aucun multiplicateur premium, vérifié ou d'abonnement n'existe dans param.rs, et aucun rescaleur de ce type n'apparaît dans les scoreurs publiés. Le code de 2023 en contenait un — des multiplicateurs de 4.0 en réseau et 2.0 hors réseau pour les auteurs vérifiés Bleus — et il a disparu de l'arbre actuel. Limite honnête : Phoenix est un modèle appris dont les poids ne sont pas publiés, donc une corrélation apprise ne peut être exclue par la lecture du code.
D'où cela vient : Le pipeline Scala de 2023 appliquait réellement un multiplicateur de 4.0 / 2.0 pour les vérifiés Bleus.
Ce que nous avons recherché, au commit épinglé
Aucun multiplicateur premium, vérifié ou d'abonnement n'existe dans param.rs
premium|verified|subscription · 1 fichier · 0 correspondances
aucun tel rescoteur n'apparaît dans les scoreurs publiés
premium|verified|subscription · 8 fichiers · 0 correspondances
Contradicted by the source
“X publie désormais les demandes de retrait gouvernementales dans son dépôt open-source, et le Brésil est le seul pays listé.”
Le dépôt publie le MÉCANISME d'application, jamais une requête. Les règles qui suppriment une publication pour les spectateurs dans un pays restreint — LegalTakedown et LocalLawsTakedown — lisent une raison qui contient le code pays, mais cette raison est récupérée à l'exécution depuis un service non publié, et le type qui la contient (TakedownReason) est défini dans un "crate" absent du dépôt. X publie également l'infrastructure autour de ce type, en Scala : un filtre de lecture gizmoduck qui supprime les retraits non appliqués avant qu'une lecture ne soit renvoyée, une colonne et une transformation du service d'entités de tweets qui récupèrent les raisons de retrait d'une publication, et les tâches internes qui transforment ces raisons en étiquettes affichées à un compte sur lui-même. Ainsi, les structures Thrift qui le contiennent — Takedowns { country_codes, takedown_country_reasons } — sont lues par le code publié, dans 3 fichiers : `takedowns/gizmoduck/RedactUnenforcedTakedownsFilter.scala`, `takedowns/tweet-entity-service/TakedownReasonsTransform.scala`, `under-the-hood/scalding/UthPctdAccountTakedownEventsJob.scala`. Ce que cela ajoute est plus de MÉCANISME, pas une seule requête : au commit épinglé, aucun code pays n'est écrit à côté d'une raison de retrait en dehors des "fixtures" de test — les seuls codes à deux lettres que le code de retrait contient sont `xx`, `xy`, les sentinelles mondiales que la source nomme elle-même, qui signifient partout et sont l'opposé d'un pays. Et la méthode qui demanderait au service d'entités de tweets ces codes sous son propre nom, get_takedown_country_codes, n'apparaît nulle part dans le dépôt. Le Brésil est une chose entièrement différente : une liste codée en dur de 2795 comptes signalés à la Cour électorale, provenant de l'ensemble de données publiques des candidats, supprimés de "Pour vous" pour chaque spectateur dans le monde entier, à moins qu'il ne suive le compte — sans aucune condition de pays, ce qui est l'opposé du fonctionnement d'un retrait légal ici. Limite honnête : un dépôt sans pays codé en dur n'est pas une plateforme sans retraits par pays. Les requêtes existent ; elles vivent en dehors du dépôt, agrégées, dans le Centre de Transparence et le rapport DSA.
D'où cela vient : Le propre message de X du 14 août a annoncé deux choses : les poids de classement et le filtre électoral brésilien. Musk l'a cité le lendemain en 61 caractères — "Toute censure exigée par les gouvernements est désormais clairement visible" — sans nommer ni le dépôt, ni les demandes, ni les pays ; la presse l'a lié à une notification destinée aux utilisateurs qui avait été annoncée, mais non déployée. Les mots "demandes" et "dans l'algorithme open-source" apparaissent pour la première fois ensemble sur un compte agrégateur.
Ce que nous avons recherché, au commit épinglé
L'infrastructure Scala publiée lit les structures de retrait Thrift — Takedowns { country_codes, takedown_country_reasons }
\bTakedowns\b|\btakedownCountryReasons\b · 43 fichiers · 15 correspondances
Contradicted by the source
“Masquer un mot-clé masque chaque publication qui le contient.”
Un mot-clé masqué n'est pas une seule règle. Le service de chronologie publié l'applique avec 2 filtres qui ne lisent pas le même texte : ViewerMutedKeywordFilter, enregistré dans phoenix_candidate_pipeline.rs, le compare à tweet_text ; FollowingViewerMutedKeywordFilter, enregistré dans reverse_chron_posts_pipeline.rs, le compare à ancestor_texts, quoted_tweet_text et tweet_text. Les champs que seuls certains d'entre eux lisent — ancestor_texts et quoted_tweet_text — sont écrits par conversation_gap_ancestor_hydrator.rs, quote_hydrator.rs et quoted_post_text_hydrator.rs, enregistrés dans phoenix_candidate_pipeline.rs, phoenix_scores_pipeline.rs et reverse_chron_posts_pipeline.rs. Un pipeline qui n'exécute pas ces "hydrators" ne les remplit jamais : là, le texte d'une publication citée ou ancestrale n'est pas seulement non lu, il est absent. Au-delà de la chronologie, le moteur de règles de filtrage de visibilité — la couche qui peut masquer une publication où qu'elle apparaisse — contient ViewerMutesAuthor (Mutes) et ViewerMutesRetweets (MuteRetweets), et aucune règle dont la décision lit un mot-clé. Le seul résultat de mot-clé masqué que ce dépôt nomme, MatchesMutedKeyword, apparaît exactement 1 fois — dans graphql_results.rs — et seulement à gauche d'une branche de correspondance le mappant à une étiquette interstitielle. Rien ici ne le décide ; ce qui le fait n'est pas publié. Deux limites honnêtes. Ce dépôt est le service qui construit une chronologie : ce que le masquage fait dans les notifications ou dans la recherche est décidé ailleurs, dans un code que X ne publie pas, et une absence ici est une absence du dépôt, pas du produit. Et nous ne vous disons pas quel onglet chaque pipeline sert — ce câblage traverse plusieurs couches, et un mappage que nous ne pouvons pas extraire proprement est un mappage que nous ne publions pas.
D'où cela vient : Le masquage est un paramètre unique dans le produit, il est donc perçu comme une règle unique qui s'applique partout. Le code publié montre quelque chose de plus restreint : un mot-clé masqué est appliqué pendant qu'une chronologie est assemblée, et les filtres qui l'appliquent ne lisent pas tous le même texte — ainsi, une publication peut contenir le mot dans un endroit qu'aucun filtre sur ce chemin ne regarde jamais.