Un document interne de Google, exporté le 3 juillet 2018, définit le twiddler comme « un objet C++ qui formule des recommandations de classement, à partir d’une réponse de recherche provisoire issue d’un seul corpus » : il agit après le classement, sur une liste déjà ordonnée. Ce même document indique « plus de 65 » twiddlers actifs dans un seul module de production, et un recensement des attributs de la documentation interne fuitée en avril 2024, produit pour cet article, en trouve 84 dont le nom contient l’un des six motifs de boost, de rétrogradation ou de reclassement retenus, sur 14 050 attributs — deux ordres de grandeur, pas un inventaire. Ce qui n’est publié nulle part : la liste actuelle, les pondérations, et l’ordre dans lequel ces retouches s’appliquent.
Un twiddler ne classe pas, il retouche
Le mot ne vient pas du vocabulaire SEO. C’est un terme d’ingénierie interne : to twiddle, en anglais, c’est tripoter un bouton. Un twiddler est une fonction qui reçoit une liste de résultats déjà classée et propose de la modifier.
La distinction avec le classement lui-même est écrite noir sur blanc : « Twiddling differs from Ascorer ranking in that twiddlers act on a ranked sequence of results, rather than results in isolation. » (le twiddling diffère du classement par l’Ascorer en ceci que les twiddlers agissent sur une séquence de résultats déjà classée, et non sur des résultats isolés). L’Ascorer est le composant qui note chaque page indépendamment des autres. Le twiddler, lui, voit la liste — donc il peut raisonner sur le voisinage : trop de résultats du même site, pas assez de contenu récent, une page officielle qui devrait être en tête. C’est la différence entre noter des copies une par une et rendre un classement de promotion.
Le document nomme aussi l’endroit : « The twiddler framework is the part of Superroot responsible for re-ranking of results from a single corpus. » (le cadre applicatif des twiddlers est la partie de Superroot chargée du reclassement des résultats issus d’un seul corpus). Superroot reçoit la liste longue et rend la page de résultats courte ; un corpus est un stock de documents d’un même type — le web, les images, les actualités. Le système NavBoost, qui exploite les signaux de clic, est l’un de ces twiddlers : le plus commenté, mais un cas particulier de la couche décrite ici.
Predoc et lazy : deux moments, deux niveaux d’information
Le document distingue deux familles, et cette distinction explique la plupart des comportements observables. Elles se différencient par ce qu’elles voient : le docinfo, c’est-à-dire les données attachées à chaque page — extrait affiché, titre, signaux de qualité —, coûte cher à charger, donc tout le monde n’y a pas droit.
Les predoc passent tôt : « Predoc twiddlers run on thin responses, which typically have several hundred results that don’t contain any docinfo. » (les twiddlers predoc s’exécutent sur des réponses « maigres », qui contiennent typiquement plusieurs centaines de résultats dépourvus de toute information de document). Beaucoup de résultats, presque rien sur chacun.
Les lazy passent tard : « lazy twiddlers run on monotonically increasing ranges of fat results (which have snippets and other docinfo data). » (les twiddlers « paresseux » s’exécutent sur des plages croissantes de résultats « gras », qui disposent d’extraits et d’autres données de document). Peu de résultats, mais en détail.
Conséquence écrite dans le document : une contrainte qui remonte un résultat « may only be applied by predoc twiddlers, otherwise we would run into pagination bugs » (ne peut être appliquée que par des twiddlers predoc, faute de quoi nous aurions des bugs de pagination). Remonter une page après avoir découpé la liste en pages casse la pagination.
Les actions : multiplier un score, déplacer, filtrer, annoter
Le document liste onze méthodes. Cinq suffisent à comprendre la mécanique.
- Boost : « The call instructs the framework to multiply the IR score of the result by boost. » (l’appel demande au cadre applicatif de multiplier le score IR du résultat par le facteur de boost). Le score IR — information retrieval, recherche d’information — est la note de pertinence calculée en amont. Le twiddler ne la recalcule pas : il la multiplie.
- BoostAboveResult : faire en sorte qu’un résultat A se classe au-dessus d’un résultat B. Une position relative, pas une note.
- Filter : « Filter logically removes a result from the response. » (le filtre retire logiquement un résultat de la réponse).
- Hide : décrite comme « a specialized method mostly used to implement legal removals » (une méthode spécialisée, surtout utilisée pour les retraits d’ordre légal).
- AnnotateResult : ajouter des messages au résultat sans toucher au classement — donc modifier l’affichage, pas l’ordre.
S’y ajoute SetRelativeOrder, qui impose l’ordre de deux résultats et que le document réserve à des circonstances exceptionnelles.
Les contraintes de catégorie : la mécanique la moins connue
C’est la partie que la vulgarisation saute presque toujours, et la plus explicative. Un twiddler peut ranger des résultats dans une catégorie, puis poser une contrainte sur cette catégorie. Le verbe employé par le document est to pack : « placer » un résultat, c’est le retenir dans la page finale.
| Contrainte | Ce que dit le document | Exemple nommé dans le document |
|---|---|---|
max_total = N |
« Prevents more than N results in a category being packed. » (empêche que plus de N résultats d’une catégorie soient retenus) | BlogCategorizer, pour limiter les résultats issus d’un même blog |
min_position = N |
« Prevents results being packed earlier than the Nth rank. » (empêche qu’un résultat soit retenu avant le rang N) | BadURLsCategorizer, sur les résultats marqués pour rétrogradation |
max_position = N |
« Prevents results from being packed later than the Nth rank. » (empêche qu’un résultat soit retenu après le rang N) | OfficialPageTwiddler, avec max_position = 0 sur la page officielle |
stride_step, stride_factor |
un espacement minimal entre résultats consécutifs ; le document nomme les deux paramètres sans donner de valeurs | ImageHostCategorizer, « to prevent too many images from the same host being clustered together » (pour éviter que trop d’images du même hôte se retrouvent groupées) |
Un avertissement figure dans le texte source : « max_position constraints should be used with care, since they will override any demotions that another twiddler may wish to apply. » (les contraintes de position maximale sont à manier avec précaution, car elles annulent toute rétrogradation qu’un autre twiddler voudrait appliquer). Et à propos d’un cas particulier — les catégories de fusion utilisées pour les méga-liens de site —, le document lâche : « If you think you understand how they work, trust us: you don’t. We’re not sure that we do either. » (si vous pensez comprendre comment elles fonctionnent, croyez-nous : ce n’est pas le cas. Nous n’en sommes pas certains non plus). La phrase ne porte que sur ce cas-là, mais elle est écrite par des ingénieurs de Google, pour des ingénieurs de Google.
Ce que Google en dit publiquement, sans employer le mot
Le mot « twiddler » n’apparaît pas dans le guide officiel des systèmes de classement, dans sa version du 10 décembre 2025. Les effets, eux, y sont décrits : « Our site diversity system works so that we generally won’t show more than two web page listings from the same site in our top results, so that no single site tends to dominate all the top results. » (notre système de diversité de sites fait que nous n’affichons généralement pas plus de deux pages d’un même site dans nos premiers résultats, afin qu’aucun site ne domine à lui seul les premières places). Tout se passe comme si une contrainte max_total était posée sur une catégorie « site » — le rapprochement est une déduction, la page publique ne nomme aucun mécanisme. Même chose pour les systèmes de fraîcheur et les rétrogradations liées aux retraits de contenu : des effets documentés, un mécanisme jamais nommé — le même écart que celui relevé sur les contradictions d’AI Overviews.
Et la mesure ne suit pas tout à fait la documentation. Une analyse de Searchmetrics de juin 2019, sur le top 10 organique avant et après le déploiement du « site diversity update », relevait que trois URL d’un même domaine apparaissaient encore pour « 3.5% of keywords » (3,5 % des mots-clés), contre 6,7 % avant. La limite de deux est donc une règle générale avec des exceptions mesurables — ce que l’adverbe « generally » autorise. Réserves : un seul prestataire, son propre jeu de mots-clés, le top 10 seulement, et une mise à jour déployée en même temps qu’une core update, ce qui interdit d’attribuer toute la baisse à la seule diversité.
D’où vient ce qu’on sait : trois documents, trois fiabilités
| Source | Date | Ce qu’elle prouve | Limite |
|---|---|---|---|
| Guide interne « Twiddler Quick Start Guide — Superroot » | exporté le 3 juillet 2018 | Le vocabulaire, les familles, les actions, les contraintes | Son propre bandeau indique « Review outdated · Reviewed by smunteanu on 2017-11-30 · Updated 2018-01-26 » : le contenu était déjà signalé comme périmé à l’export |
| Pièces du procès United States v. Google | 2023-2025 | L’existence et le poids de systèmes de reclassement, sous serment | Les auditions de Pandu Nayak (31 janvier 2025) et HJ Kim (18 février 2025) confirment l’usage de twiddlers sans décrire le cadre applicatif |
Documentation de l’API ContentWarehouse |
avril 2024 | Les noms des champs de données et leurs descriptions courtes | Des structures de données, jamais le code ni les pondérations |
Le point de méthode compte plus que la liste : le seul document qui explique la mécanique est aussi le plus ancien des trois, et il se déclarait déjà périmé.
Ce que la fuite laisse voir : 84 attributs sur 14 050
Le décompte ci-dessous a été produit pour cet article, à partir du miroir public de la bibliothèque cliente ContentWarehouse — le code que Google génère automatiquement à partir de ses schémas de données, resté accessible quelques semaines. Chaque instantané est identifié par son empreinte de dépôt, pour être rejouable.
| Instantané | Empreinte | Modules | Attributs | Correspondances |
|---|---|---|---|---|
| 27 mars 2024 | 3bbe9aea |
2 593 | 13 868 | 77 |
| 16 avril 2024 | 30030fba |
2 595 | 14 050 | 84 |
| 7 mai 2024, expurgé | ecfc6bb2 |
174 | 594 | 0 |
Une correspondance est un nom d’attribut contenant, sans distinction de casse, boost, demot, penalt, promot, rerank ou twiddl : 0,598 % des attributs, sur 36 modules. La dernière ligne sert de témoin — l’instantané expurgé, publié après le retrait des fichiers, n’en contient aucun.
Trois des 84 sont des faux positifs (adaboostImageFeaturePorn et ses deux variantes de version, où « boost » désigne l’algorithme d’apprentissage AdaBoost) : le décompte après examen manuel est de 81. Ce tri manuel n’a été appliqué qu’à l’instantané d’avril ; les 77 de mars contiennent vraisemblablement les mêmes faux positifs, et ne doivent donc être comparés qu’au 84 brut.
Deux résultats méritent d’être relevés. Un seul nom d’attribut contient « twiddler », qualityTwiddlerDomainClassification ; le mot apparaît en revanche 20 fois dans les commentaires de la documentation, sur 9 modules — il vit dans les descriptions, pas dans les noms de champs. Et la description du champ boost du module WWWResultInfoMinimalAestheticsAdjusterInfo dit « final boost = (all boosts) » : le boost final y est le produit de tous les boosts. Il s’agit d’un ajusteur d’affichage, pas du cadre applicatif décrit plus haut — mais la composition multiplicative y est la même que dans le « multiply the IR score* » de 2018, ce qui reste un rapprochement, pas une preuve.
Trois idées reçues
« Il y a plusieurs centaines de twiddlers en fonctionnement. » Le document écrit : « the twiddler framework supports hundreds of twiddlers (>65 are currently active in production in WebMixer alone) » (le cadre applicatif prend en charge des centaines de twiddlers ; plus de 65 sont actuellement actifs en production dans le seul WebMixer). WebMixer est le module qui assemble les résultats web. Le cadre en supporte des centaines ; 65 étaient actifs dans ce module, en 2018. La formulation courante confond une capacité et un état.
« La pénalité page 3 plafonne les pages spam au rang 31. » Le document ne donne aucun rang. Il décrit BadURLsCategorizer comme ajoutant « a pseudo random (but deterministic per-query) min_position constraint » (une contrainte de position minimale pseudo-aléatoire, mais déterministe pour une requête donnée), « pushing them off the first couple of pages » (les repoussant au-delà des deux premières pages). Pseudo-aléatoire et déterministe par requête : il n’y a pas de rang fixe à citer.
« Un twiddler peut faire remonter une page absente du classement. » Le document ne l’affirme ni ne l’infirme. Les actions portent sur « a ranked sequence of results », et aucune des onze méthodes listées n’insère un document absent — Filter et Hide ne font que retirer. La réponse prudente est une déduction, pas une citation.
Ce que ça change pour un site
- Une variation de quelques rangs sans modification de la page n’est pas forcément une sanction. Une contrainte de catégorie appliquée à la requête suffit à déplacer une page. Le suivi de position à la journée mesure autant ces retouches que le classement lui-même : ce sont les tendances sur plusieurs semaines qui portent une information.
- Deux pages d’un même site sur une requête sont un plafond par défaut, pas un objectif. Google a annoncé le 6 juin 2019 que ce plafond est révocable : « we may still show more than two in cases where our systems determine it’s especially relevant to do so for a particular search » (nous pouvons encore en afficher plus de deux lorsque nos systèmes jugent que c’est particulièrement pertinent pour une recherche donnée). Multiplier les pages sur une intention proche reste un mauvais pari : l’énergie est mieux placée sur le maillage interne, qui désigne la page à retenir.
- Le levier reste le signal, pas la retouche. Un twiddler lit des signaux calculés en amont — clics, fraîcheur, qualité, correspondance officielle. Aucun n’est réglable directement ; tous dépendent de ce que vaut la page au premier classement, second passage de classement compris. Les contraintes de catégorie font exception : elles s’appuient sur une propriété structurelle — l’hôte, le domaine — et non sur un signal de qualité. C’est exactement ce que dit le point précédent.
Documenté, déduit, non documenté
| Affirmation | Statut | Base |
|---|---|---|
| Un twiddler est « un objet C++ qui formule des recommandations de classement » | Documenté | Guide interne, export du 3 juillet 2018 |
| Le cadre applicatif est « la partie de Superroot chargée du reclassement » | Documenté | Guide interne |
| Les twiddlers agissent sur une séquence déjà classée, pas sur des résultats isolés | Documenté | Guide interne |
| Deux familles existent : predoc et lazy | Documenté | Guide interne |
Boost multiplie le score IR du résultat |
Documenté | Guide interne, méthode Boost |
max_position ne peut être appliqué que par un twiddler predoc |
Documenté | Guide interne |
| Le cadre applicatif « supporte » des centaines de twiddlers | Documenté | Guide interne |
| Plus de 65 twiddlers étaient actifs dans WebMixer | Documenté, daté de 2018 | Guide interne ; chiffre repris par RESONEO, 31 octobre 2024 |
| Le guide interne se déclarait périmé dès son export | Documenté | Bandeau « Review outdated · Updated 2018-01-26 » |
| « Plusieurs centaines de twiddlers sont en fonctionnement » | Faux tel quel | Confusion entre capacité et état ; le document distingue les deux |
| Les pages rétrogradées sont plafonnées au rang 31 | Faux | Le document décrit une contrainte pseudo-aléatoire, sans rang |
| Google n’affiche « généralement pas plus de deux » pages d’un même site | Documenté | Guide officiel des systèmes de classement, 10 décembre 2025 |
| Ce plafond est levé « when our systems determine it’s especially relevant » (quand nos systèmes jugent que c’est particulièrement pertinent) | Documenté | Annonce Google du 6 juin 2019 |
La diversité de sites est mise en œuvre par une contrainte max_total |
Déduit | Le guide public ne nomme aucun mécanisme |
| Trois URL d’un même domaine apparaissaient encore pour 3,5 % des mots-clés | Observé, non documenté par l’éditeur | Searchmetrics, juin 2019, top 10, jeu de mots-clés propriétaire |
| Le mot « twiddler » est absent du guide public des systèmes de classement | Non documenté | Vérifié sur cette page ; le reste du site n’a pas été passé en revue |
| 84 attributs sur 14 050 portent l’un des six motifs retenus | Mesuré ici | Instantané 30030fba du 16 avril 2024 |
81 après retrait des trois faux positifs adaboost |
Mesuré ici | Examen manuel, appliqué au seul instantané d’avril |
| Un seul nom d’attribut contient « twiddler » ; le mot apparaît 20 fois en commentaire | Mesuré ici | Même instantané, 9 modules concernés |
Le champ boost d’un ajusteur d’affichage est le produit de tous les boosts |
Documenté pour ce champ | Description du champ dans WWWResultInfoMinimalAestheticsAdjusterInfo |
Ce champ et la méthode Boost relèvent de la même mécanique |
Déduit | Deux sous-systèmes distincts ; seule la composition est analogue |
| Un twiddler ne peut pas ajouter un document absent de la réponse | Déduit | Aucune des onze méthodes listées n’insère un document |
| La liste actuelle des twiddlers, leurs pondérations, leur ordre d’application | Non documenté | Aucune source publique |
| L’application de ces mécanismes aux réponses d’AI Overviews et d’AI Mode | Non documenté | Aucune source publique n’établit le lien |
À retenir
- Un twiddler retouche, il ne classe pas. Il reçoit une liste déjà ordonnée et propose de la modifier.
Boostmultiplie un score existant. Une page sans score de départ n’a rien à multiplier.- Predoc voit large et flou, lazy voit étroit et net. Cette asymétrie interdit de remonter une page au dernier moment.
- Les contraintes de catégorie expliquent plus de résultats que les boosts. Diversité de site, espacement par hôte, rétrogradations : des règles de placement, pas des notes.
- Le vocabulaire est interne, les effets sont publics. Google décrit la diversité de sites et la fraîcheur sans jamais écrire « twiddler ».
- La source principale se déclarait périmée en 2018. Tout ce qui en est tiré se lit avec cette date en tête.
Questions fréquentes
Un twiddler, est-ce la même chose qu’un facteur de classement ? Non. Un facteur de classement est un signal qui entre dans le calcul d’un score ; un twiddler est une fonction qui s’exécute après ce calcul et retouche le résultat. Le twiddler consomme des facteurs, il n’en est pas un.
Peut-on savoir quel twiddler a fait bouger une page ? Non, et rien ne permet de le déduire depuis l’extérieur. Plusieurs retouches s’appliquent en série, et quand deux d’entre elles veulent promouvoir le même résultat, le document précise que « the strongest promotion is chosen » (la promotion la plus forte l’emporte) — les contributions individuelles disparaissent donc du résultat observable, qui n’est qu’une position finale.
Ces mécanismes s’appliquent-ils aux réponses générées par IA ? Aucune source publique ne l’établit. Le guide de 2018 décrit la recherche web classique ; étendre le raisonnement aux AI Overviews serait une déduction sans appui, et elle est classée comme telle dans le tableau ci-dessus.
Sources
- Guide interne « Twiddler Quick Start Guide — Superroot », export du 3 juillet 2018, document divulgué — copie publique sur zachvorhies.com
- Google, « A Guide to Google Search Ranking Systems », mise à jour du 10 décembre 2025 — developers.google.com
- Barry Schwartz, « Google search update aims to show more diverse results from different domain names », 6 juin 2019 — searchengineland.com
- Mario Fischer, « How Google Search ranking works », 13 août 2024 — searchengineland.com
- Danny Goodwin, « The ABCs of Google ranking signals: What top search engineers revealed », 13 mai 2025 — searchengineland.com
- Olivier de Segonzac, « Google leak — Part 2: Understanding the Twiddler Framework », 31 octobre 2024 — resoneo.com
- Malte Landwehr, « Site Diversity Update Analysis », juin 2019 — searchmetrics.com
- Documentation de l’API
ContentWarehouse, miroir public de la bibliothèque cliente Elixir, instantanés3bbe9aea,30030fbaetecfc6bb2— github.com



