# Protocole de laboratoire 1.0.0 — écrit avant les mesures

Question : une image qui arrive après le texte déplace-t-elle le repère lorsque son espace n’est pas réservé ? Intervention unique : `width="1200" height="800"` dans B. A n’a ni dimensions HTML ni réservation CSS. Même HTML autrement, même CSS, même JPEG, même texte français et police système. Cette scène française est identique entre A et B ; l’interface de restitution est FR/EN. Les traductions ne sont pas des répétitions.

Conditions figées dans `experiments/protocol.json` : 390 × 844 et 1440 × 900 pixels CSS, DPR 1, trois répétitions par variante, ordre A1 B1 B2 A2 A3 B3 pour chaque viewport, mobile puis ordinateur. Ce sont des viewports émulés sur ordinateur, pas des téléphones réels. Un nouveau contexte de navigateur et une navigation principale à chaque essai ; aucun clic dans le document mesuré. Cache Chromium désactivé via CDP, service workers bloqués, réponse locale `Cache-Control: no-store`.

Le serveur local attend **2000 ms avant d’envoyer les octets de l’image**, sans la transformer. C’est une condition expérimentale, pas une mesure de lenteur du réseau public. Le `src` de l’image est dans le HTML initial. Aucun compteur ni contrôle ne participe à la mise en page de la scène ; le statut éventuel est fixé hors flux.

La fenêtre est **[0, 6000 ms] depuis la navigation**. Les événements ultérieurs sont exclus ; l’heure effective de l’échantillonnage final est conservée. Le repère est observé après les premières frames, avant l’image, puis en fin de fenêtre. La réponse, les dimensions, la visibilité et le chargement doivent être cohérents. L’image doit avoir chargé pendant la fenêtre. Une entrée utilisateur, un défilement, un redimensionnement, un passage en arrière-plan ou une restauration BFCache invalide l’essai. L’absence de décalage dans A ne l’invalide pas : elle est conservée comme observation inattendue à expliquer. Les captures avant/après sont réalisées à chaque essai.

Le CLS de cette fenêtre est rapporté par **web-vitals 6.2.2** (`onCLS`, `reportAllChanges: true`). Les événements `layout-shift` sont conservés : temps, valeur, `hadRecentInput`, éléments déplacés et rectangles disponibles. La plus grande fenêtre de session est retenue (écart inférieur à 1 s, durée inférieure à 5 s), et les entrées avec `hadRecentInput` sont exclues. Le calcul indépendant des fenêtres dans les tests est rapproché du rapport de web-vitals. L’API absente, un rapport manquant ou une erreur reste une valeur `null`, jamais un zéro inventé. Ce n’est pas le CLS final de toute une visite.

Chaque résultat porte : identifiant/date, variante/répétition, révision SHA-256 des fichiers influents, versions navigateur/Playwright/Node/web-vitals et OS, URL effective, viewport/DPR, cache/délai, image/hash/dimensions, positions et chronologie, événements, visibilité, erreurs et statut. Les éléments déplacés ne sont pas présentés comme la cause : l’interprétation de l’image repose sur l’intervention contrôlée et sa chronologie.

Les fichiers influents sont listés dans `scripts/common.mjs`. Ils incluent le HTML, le CSS, l’observateur, le JPEG, la référence figée, le protocole et les scripts de mesure/serveur. Leurs octets sont archivés dans un ZIP par série ; les fichiers de présentation et les résultats dérivés sont exclus de la révision expérimentale, évitant une boucle de hash. Les relevés utilisent des noms datés exclusifs et ne sont pas écrasés. Tous les essais, erreurs comprises, sont conservés. Aucun ancien chiffre Edikka n’est importé comme résultat.

Interprétation attendue d’après les standards : les dimensions intrinsèques permettent de réserver le ratio avant téléchargement. Les observations réellement mesurées sont générées séparément depuis les JSON. Douze essais vérifient ce scénario borné, sans portée statistique générale, données terrain, promesse SEO/conversion ou conclusion de conformité.

Exploration publique distincte : le même contenu est chargé dans deux iframes de dimensions égales ; le `src` est attribué après 1500 ms de délai pédagogique. Les frames sont recréées à chaque rejeu, les anciennes réponses ignorées. Seul le déplacement réel du repère (pixels CSS) est présenté, aucun CLS d’iframe ni somme attribuée au parent. GitHub Pages sert les pages expérimentales sans ralentissement réseau imposé. La vérification publique ne remplace pas cette série locale.

Sources : [CLS](https://web.dev/articles/cls), [réservation des images](https://web.dev/articles/optimize-cls), [web-vitals 6.2.2](https://github.com/GoogleChrome/web-vitals/tree/v6.2.2). Grille Edikka 1.1 : IMG22 (ratio intrinsèque), IMG23 (espace avant chargement) ; cette expérience n’examine que les deux viewports prévus, pas tous les breakpoints d’un site.

## English summary

The protocol is fixed before collection: identical French scenes differing only by intrinsic width/height attributes, an unchanged JPEG, two CSS viewports at DPR 1, three repetitions per variant, alternating order, fresh contexts, disabled cache, a 2000 ms local image-response delay and a 0–6000 ms observation window. Raw events and all failures are preserved. web-vitals 6.2.2 reports the maximum session window with recent input excluded. Unsupported or missing measurements remain null. These are bounded laboratory observations, not field data or a final whole-visit CLS. Public exploration delays source assignment by 1500 ms and reports only marker displacement in CSS pixels. The static public host is a different environment.
