Contrôle de fond QyE : novembre 2025 au 17 octobre 2026
Analyse du programme que Google exécute en tâche de fond sur ses pages de résultats (canal sg_ck=QyE), à partir de réponses récoltées. État au 19 octobre 2026.
En bref
- Quatre nouvelles familles de tests apparaissent entre le 20 août à 12:06 UTC et le 22 août à 20:58 UTC. Notre corpus ne contient aucune capture entre ces deux moments. Les quatre arrivent ensemble : réglages déclarés par le navigateur, rendu et césure du texte, précision du pointeur, WebGPU.
- Le programme décodé grossit d'environ 13 % (+2 648 octets) entre le 12 et le 28 août, alors que le moteur JavaScript qui l'exécute diminue légèrement.
- Le test WebGPU est retiré le 5 octobre, entre 06:53 et 14:07 UTC. Les trois autres familles restent. Notre session en direct du 17 octobre le confirme.
- Une variante avec un module de stockage local coexiste avec le programme normal depuis juillet. 134 captures du 8 juillet au 17 octobre ; elle est servie en même temps que la version normale, pour une même adresse de requête.
- Les données stockées ne sont acceptées que par l'exemplaire de programme qui les a écrites.
Corpus et méthode
| Élément | Valeur |
|---|---|
| Entrées QyE repérées (réponses de plus de 20 000 octets) | 4 780, du 13 novembre 2025 au 17 octobre 2026 |
| Captures sélectionnées | 444 : toutes les grandes réponses, leur voisine normale la plus proche, tout septembre, trois par semaine depuis novembre 2025, bissections de dates |
| Corps récupérés et vérifiés (empreinte et date de capture) | 444 sur 444 |
| Corps exécutés hors ligne | 441 ; 3 réponses liées à Google Flights, de format différent, sont écartées |
| Exécutions à stockage vide | 441, sans erreur |
| Traçages détaillés | 69 |
Le moteur d'origine est exécuté avec son programme dans un navigateur isolé. La page https://www.google.com/search est servie en local ; aucune requête n'est envoyée à Google et aucun token n'est soumis.
La hausse d'août
| Mesure | 12 août | 28 août | Différence |
|---|---|---|---|
| Programme encodé, caractères | 26 275 | 29 807 | +3 532, soit +13,44 % |
| Programme décodé, octets | 19 703 | 22 351 | +2 648, soit +13,44 % |
| Moteur JavaScript, octets | 63 734 | 63 231 | −503 |
| Réponse complète, octets | 120 495 | 123 421 | +2 926, soit +2,43 % |
La configuration auxiliaire est identique. La hausse ne vient ni de l'encodage ni de l'emballage.
Taille du programme normal, mois par mois
Programme décodé, en octets, hors variante avec stockage.
| Période | Captures | Médiane | Minimum | Maximum |
|---|---|---|---|---|
| Novembre 2025 | 3 | 18 872 | 18 838 | 19 523 |
| Décembre 2025 | 8 | 18 915 | 18 575 | 20 158 |
| Janvier 2026 | 13 | 19 136 | 18 788 | 20 150 |
| Février | 11 | 19 099 | 18 830 | 20 138 |
| Mars | 13 | 19 287 | 19 148 | 20 110 |
| Avril | 15 | 19 403 | 19 114 | 20 102 |
| Mai | 11 | 19 863 | 19 759 | 23 213 |
| Juin | 9 | 20 147 | 19 997 | 20 341 |
| Juillet | 88 | 20 097 | 19 861 | 21 196 |
| 1er au 20 août | 53 | 19 734 | 18 638 | 19 950 |
| 22 août au 5 octobre 06:53 | 98 | 22 148 | 21 253 | 22 811 |
| 5 octobre 14:07 au 17 octobre | 27 | 21 829 | 21 439 | 22 663 |
Environ +1 Ko en neuf mois, puis un saut d'environ +2,4 Ko le 22 août, puis −319 octets après le retrait de WebGPU. L'écart entre captures d'une même période atteint 1,5 Ko : la taille seule ne suffit pas à attribuer la baisse d'octobre.
Les nouveaux tests
| Test | Ce que fait le programme |
|---|---|
| Réglages déclarés | Lit navigator.platform, navigator.doNotTrack et window.doNotTrack |
| Rendu du texte | Crée des blocs cachés en police à chasse fixe (16 px, interligne 20 px), compare hyphens: auto et none, lit offsetHeight |
| Pointeur | Appelle matchMedia avec any-pointer: fine et any-pointer: coarse |
| Carte graphique (jusqu'au 5 octobre) | Appelle navigator.gpu.requestAdapter avec powerPreference: low-power, puis lit info.vendor et info.architecture |
| Période (UTC) | Traçages | Réglages, rendu, pointeur | WebGPU |
|---|---|---|---|
| Novembre 2025 au 20 août 12:06 | 10 | absents | absent |
| 22 août 20:58 au 5 octobre 06:53 | 43 | présents | présent |
| 5 octobre 14:07 au 17 octobre | 16 | présents | absent |
Aucune exception dans les 69 traçages. Le retrait de WebGPU coïncide avec le passage à une nouvelle version du moteur JavaScript, entre 06:53 et 14:07 UTC le 5 octobre. Les versions de moteur changent plusieurs fois par semaine : la coïncidence date le changement, sans prouver que le moteur en soit la cause.
Des constantes liées aux nouveaux tests ont été localisées dans le programme (environ 618 octets de reconstruction de littéraux). La répartition exacte des 2 648 octets supplémentaires entre code, données et remplissage n'est pas établie.
La variante avec stockage local
Elle se repère de deux façons concordantes : sa taille et le fait qu'elle laisse un état dans localStorage après exécution. Sur 441 exécutions, les 134 grands programmes laissent tous un état, les 307 autres aucun.
| Mois | Entrées de l'index | Variantes | Part |
|---|---|---|---|
| Novembre 2025 à juin 2026 | 1 641 | 0 | 0 % |
| Juillet | 1 106 | 116 (du 8 au 16 juillet) | 10,5 % |
| Août | 72 | 1 (18 août) | 1,4 % |
| Septembre | 86 | 1 (28 septembre) | 1,2 % |
| 1er au 17 octobre | 1 875 | 16 | 0,9 % |
C'est le programme normal du moment augmenté d'un module de 4,7 à 7,4 Ko (médiane 6 Ko). Elle suit ses évolutions : sans les nouveaux tests en juillet, avec WebGPU le 28 septembre, sans WebGPU en octobre. En octobre, la capture normale de même moteur la plus proche est à 1,2 minute en médiane ; le 15 octobre, une variante et un programme normal sont capturés à 16 secondes d'écart. Rien dans l'adresse de requête ne les distingue : l'attribution se fait côté serveur. Test A/B, échantillonnage ou ciblage restent compatibles avec ces données.
Le module programme aussi un intervalle de 2 000 ms.
Les données stockées sont liées à leur programme
| État réinjecté | Programme qui le lit | Résultat |
|---|---|---|
| Son propre état | le même programme | accepté (6 programmes de juillet sur 6, et la variante du 18 août) |
| État d'un autre programme du 8 juillet, même moteur | programme de juillet | refusé (4 cas sur 4) |
| État d'un autre programme du 8 juillet, moteur différent | programme de juillet | refusé (2 cas sur 2) |
| État d'un programme de juillet | variante du 18 août | refusé |
| État de la variante du 18 août | programme de juillet | refusé |
« Accepté » : même résultat qu'avec l'état du programme lui-même. « Refusé » : même résultat qu'avec un stockage vide. Ces essais de transfert entre programmes ne déterminent ni la règle de validation ni l’exploitation côté serveur.
Structure et contenu du stockage
Le décodage de six programmes (8 et 11 juillet, 18 août, 28 septembre, 6 et 15 octobre) montre une structure commune. Le moteur original et le programme associé sont rejoués hors ligne, sans envoi de token à Google. Le tableau décodé est capturé pendant la relecture du stockage ; les longueurs et le compteur final sont vérifiés.
| Élément | Taille et observation |
|---|---|
| Enveloppe externe | 8 octets |
| Marqueur du contenu décodé | 3 octets : 01 be ef |
| Bloc associé au programme | 12 octets, rôle inconnu, différents entre les six exemplaires |
| Enregistrement | Horodatage 4 octets big-endian, champ 1 octet observé à 1, longueur 2 octets big-endian, charge utile variable |
| Compteur final | 1 octet |
Sans interaction, la charge utile mesure 114 octets, soit 121 octets par enregistrement et un total binaire de 24 + 121 × n. Un enregistrement représente donc 145 octets ; vingt, 2 444 octets, avant encodage base64. Les interactions font varier la longueur : 146 octets de charge utile pour un mouvement ou une frappe, 151 pour un clic isolé dans les scénarios testés.
L’horodatage correspond à la capture du programme à la seconde près dans cinq exemplaires et à une seconde d’écart dans le sixième. Il ne mesure pas la date de visite simulée dans ces replays. Le rôle du champ égal à 1 demeure inconnu.
Historique des vingt derniers passages
Sur le programme du 18 août, 21 contextes neufs reçoivent successivement l’état écrit par le précédent. Chaque passage comporte un clic distinct, de (101,201) à (121,221). L’état final contient exactement les vingt enregistrements de (102,202) à (121,221), dans cet ordre : le premier est supprimé. Cette politique FIFO concerne les passages du programme, pas vingt clics au sein d’une page. Elle n’est pas démontrée pour les cinq autres programmes par la seule similitude de leur format.
Les coordonnées étudiées sont celles du dernier clic : un clic en (123,234), suivi d’un déplacement en (500,400), laisse (123,234). Un mouvement seul laisse la sentinelle (65535,65535).
Un bloc marqué c5 26 01 20 comprend un indicateur, puis 32 compteurs d’un octet lorsqu’il est actif dans les scénarios testés. Une frappe place les compteurs d’indices 27, 28 et 29 à 1 ; trois frappes les portent à 3. Les touches a et b produisent des charges utiles identiques. Il s’agit de compteurs d’événements, sans distinction des caractères saisis dans ce bloc et ces scénarios ; cela ne permet pas de conclure sur une collecte ailleurs.
Un clic JavaScript synthétique incrémente un compteur sans renseigner les coordonnées comme le clic CDP. Les séquences et cibles pouvant différer, ce contraste ne démontre pas un effet de isTrusted seul. Les correspondances exactes entre tous les compteurs et les événements DOM, ainsi que leurs règles de saturation, restent indéterminées.
Clés et encodage : 134 états
| Période | États | Clés observées | Encodage |
|---|---|---|---|
| Juillet | 116 | Base commune avec suffixe de 0 à 9 | Base64 avec remplissage |
| Août | 1 | Base avec suffixe 4 | Base64 avec remplissage |
| Septembre | 1 | Base sans suffixe | Base64 URL-safe sans remplissage |
| Octobre | 16 | Base sans suffixe | Base64 URL-safe sans remplissage |
Le changement est encadré par nos captures du 18 août et du 28 septembre, sans date exacte de déploiement. La fonction des suffixes et leur règle de sélection ne sont pas établies ; le volume cumulé à travers plusieurs clés n’est pas mesuré. La présence d’un historique persistant ne démontre ni identifiant personnel stable, ni suivi intersites, ni utilisation dans le score serveur.
Limites
- Les dates sont des dates de capture, encadrées par nos captures voisines. Le contexte dans lequel chaque requête a été émise n'est pas connu.
- Un test absent signifie que ses chaînes n'ont pas été reconstruites dans ce scénario hors ligne. Pour WebGPU, l'absence d'octobre est recoupée en direct.
- Les comptes de variantes de l'index reposent sur la taille : un seul faux positif parmi les 441 corps vérifiés.
- Aucune conclusion fiable sur le coût d'exécution ni sur l'efficacité de détection.