You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
fix(slides): scan_slidev_composition rapporte des chevauchements fantomes sur toute liste portant des puces <code> inline #15695
scan_slidev_composition.py rapporte des chevauchements texte×texte inexistants à l'écran dès qu'une liste porte des puces <code> inline — c'est-à-dire sur n'importe quel slide de formule. Trois lanes ont mesuré indépendamment la même chose sur #15661 et les trois ont conclu qu'il n'y avait rien à voir :
Coût mesuré : trois lanes mobilisées sur une QA visuelle d'un défaut qui n'existe pas, et une PR (#15661) retenue le temps de le démontrer. L'organe est par ailleurs utile — ce n'est pas une demande de le désarmer.
Cause — le seuil est juste en dessous de l'inflation qu'il doit absorber
Les deux gardes existantes ne sont pas en cause et ne doivent pas être touchées :
scripts/notebook_tools/scan_slidev_composition.py:318 filtre déjà l'ancêtre/descendant (a.el.contains(b.el)) — « FP structurel v1 ». Ici la paire n'est pas en relation de containment : c'est un <li> de niveau 2 (x=76, imbriqué dans le <li>précédent) contre le <li> de premier niveau suivant (x=56). contains() rend false, à raison.
:321 exige overlapX > 1 && overlapY > 1.
Le défaut est que overlapYvaut 1.23 px, donc passe > 1 — puis Math.round() (:326) le rend comme le 1 des paires [170, 1]. Ces 1.23 px ne sont pas un chevauchement : ils viennent de
La puce de code inline est plus haute que sa line-box, et Range.getClientRects() (:290) absorbe padding + bordure : l'union des rects du <li> dépasse sa line-box d'environ 1.2 px et effleure le rect du voisin. Ce qui ne laisse que ~1.5 px de marge réelle à absorber vient de deux réglages légitimes — slides/theme-ia101/layouts/dense.vue (.dense ul > li { margin-bottom: 1px }) et slides/05-theorie-des-jeux/style.css (line-height: 1.3; margin: 0.1em 0).
Le tell décisif : sur les trois paires, les rects de Range se chevauchent de 1.23 px pendant que les getBoundingClientRect() des éléments sont séparés de +1.57 px. Les deux instruments se contredisent, et c'est le second qui dit la vérité du rendu.
Correctif demandé — une passe de confirmation, pas un seuil relevé
Relever le seuil overlapY à 2 ou 3 px ferait taire ces trois cas et rendrait l'organe aveugle aux vrais chevauchements fins. Le correctif qui tient est une seconde lecture :
quand une paire franchit le test Range de :321, la confirmer contre les getBoundingClientRect() des deux éléments ; si ceux-ci ne se chevauchent pas, ne pas rapporter la paire.
C'est déterministe, ça ne change aucun seuil, et ça élimine par construction toute inflation de padding/bordure d'un enfant inline — <code>, mais aussi <sup>, <kbd>, un badge, n'importe quel inline à boîte propre.
Acceptance — un contrôle positif et un contrôle négatif
Les deux sont exigés. Un correctif qui ne livre que le premier est indiscernable d'un organe muet.
Négatif — obligatoire : un cas de chevauchement réel (fixture dédiée, deux blocs en position:absolute qui se recouvrent de ≥3 px) reste rapporté après correctif. Coller la sortie. Sans ce contrôle, le correctif n'est pas recevable.
Le filtre :318 (FP v1) et les seuils :321 restent inchangés — le correctif ajoute une confirmation, il ne relâche rien.
La paire rapportée expose les deux mesures (graze Range et séparation élément) dans son détail, pour qu'un futur lecteur n'ait pas à refaire les captures @5× que ce dossier a coûtées.
Hors périmètre
Ne pas toucher au CSS du thème : code { padding … } est un choix de rendu légitime et le slide est correct à l'écran.
Ne pas désarmer ni rendre advisory le volet texte×texte de l'organe.
Note de routage
Ce défaut est dans mon instrument : c'est moi qui ai posé le gate visuel que trois lanes ont dû satisfaire. Le grain est de genre guard, donc META — il ne tient pas le plancher G-VAR-1 de la lane qui le prend, et ne doit pas être pris comme plat principal.
[CLAIMED] lane myia-po-2023:CoursIA -- scan_slidev_composition: passe de confirmation getBoundingClientRect sur les paires franchissant le test Range (pas de relèvement de seuil) + contrôles positif (slides 15/27/29 @ 5f58dd9) et négatif (vrai chevauchement toujours rapporté) -- 2026-09-13T07:2xZ
Défaut
scan_slidev_composition.pyrapporte des chevauchements texte×texte inexistants à l'écran dès qu'une liste porte des puces<code>inline — c'est-à-dire sur n'importe quel slide de formule. Trois lanes ont mesuré indépendamment la même chose sur #15661 et les trois ont conclu qu'il n'y avait rien à voir :myia-ai-01(captures @5× DPI)myia-po-2026(QA vision)myia-po-2025:CoursIA-2[170, 1]VISUAL-OK[348, 1]VISUAL-OK[189, 1]VISUAL-OKCoût mesuré : trois lanes mobilisées sur une QA visuelle d'un défaut qui n'existe pas, et une PR (#15661) retenue le temps de le démontrer. L'organe est par ailleurs utile — ce n'est pas une demande de le désarmer.
Cause — le seuil est juste en dessous de l'inflation qu'il doit absorber
Les deux gardes existantes ne sont pas en cause et ne doivent pas être touchées :
scripts/notebook_tools/scan_slidev_composition.py:318filtre déjà l'ancêtre/descendant (a.el.contains(b.el)) — « FP structurel v1 ». Ici la paire n'est pas en relation de containment : c'est un<li>de niveau 2 (x=76, imbriqué dans le<li>précédent) contre le<li>de premier niveau suivant (x=56).contains()rendfalse, à raison.:321exigeoverlapX > 1 && overlapY > 1.Le défaut est que
overlapYvaut 1.23 px, donc passe> 1— puisMath.round()(:326) le rend comme le1des paires[170, 1]. Ces 1.23 px ne sont pas un chevauchement : ils viennent deLa puce de code inline est plus haute que sa line-box, et
Range.getClientRects()(:290) absorbe padding + bordure : l'union des rects du<li>dépasse sa line-box d'environ 1.2 px et effleure le rect du voisin. Ce qui ne laisse que ~1.5 px de marge réelle à absorber vient de deux réglages légitimes —slides/theme-ia101/layouts/dense.vue(.dense ul > li { margin-bottom: 1px }) etslides/05-theorie-des-jeux/style.css(line-height: 1.3; margin: 0.1em 0).Le tell décisif : sur les trois paires, les rects de
Rangese chevauchent de 1.23 px pendant que lesgetBoundingClientRect()des éléments sont séparés de +1.57 px. Les deux instruments se contredisent, et c'est le second qui dit la vérité du rendu.Correctif demandé — une passe de confirmation, pas un seuil relevé
Relever le seuil
overlapYà 2 ou 3 px ferait taire ces trois cas et rendrait l'organe aveugle aux vrais chevauchements fins. Le correctif qui tient est une seconde lecture :C'est déterministe, ça ne change aucun seuil, et ça élimine par construction toute inflation de padding/bordure d'un enfant inline —
<code>, mais aussi<sup>,<kbd>, un badge, n'importe quel inline à boîte propre.Acceptance — un contrôle positif et un contrôle négatif
Les deux sont exigés. Un correctif qui ne livre que le premier est indiscernable d'un organe muet.
slides/05-theorie-des-jeux/slides.mdau merge de Fix: deck 05-theorie-des-jeux — 16 -> 0 slide hors canvas (#14888) #15661 (5f58dd9d9f), les slides 15, 27 et 29 rapportent 0 chevauchement texte×texte. Coller la sortie avant (3 paires) et après (0).position:absolutequi se recouvrent de ≥3 px) reste rapporté après correctif. Coller la sortie. Sans ce contrôle, le correctif n'est pas recevable.:318(FP v1) et les seuils:321restent inchangés — le correctif ajoute une confirmation, il ne relâche rien.Rangeet séparation élément) dans son détail, pour qu'un futur lecteur n'ait pas à refaire les captures @5× que ce dossier a coûtées.Hors périmètre
code { padding … }est un choix de rendu légitime et le slide est correct à l'écran.slides/05-theorie-des-jeux/— Fix: deck 05-theorie-des-jeux — 16 -> 0 slide hors canvas (#14888) #15661 est mergée, le deck est sain.Note de routage
Ce défaut est dans mon instrument : c'est moi qui ai posé le gate visuel que trois lanes ont dû satisfaire. Le grain est de genre
guard, donc META — il ne tient pas le plancher G-VAR-1 de la lane qui le prend, et ne doit pas être pris comme plat principal.