Skip to content

Le relevé d'ordre 3D pariait sur une durée au lieu d'attendre - #5

Merged
pymenvert merged 3 commits into
mainfrom
fix/ordre-3d-fenetre-trop-juste
Aug 17, 2026
Merged

Le relevé d'ordre 3D pariait sur une durée au lieu d'attendre#5
pymenvert merged 3 commits into
mainfrom
fix/ordre-3d-fenetre-trop-juste

Conversation

@pymenvert

Copy link
Copy Markdown
Owner

Objectif

La CI Windows a fait tomber main sur un test d'ordre 3D. Le logiciel n'est
pas en cause
: c'est le test qui pariait sur une durée au lieu d'attendre.

Relevé obtenu : ["bar1","bar2","bar3"] — attendu ["bar1","bar2","bar3","bar0"].
L'ordre n'était pas faux, il était tronqué. Un ordre réellement cassé aurait
rendu l'ordre de la liste (bar0, bar1, bar2), donc une réponse différente,
pas une réponse plus courte.

Le changement

ordreVu() attendait sleep(560) pour quatre pas de 120 ms — 80 ms de
marge
. Sur un runner qui fait tourner une dizaine de serveurs en parallèle, le
quatrième pas n'arrive pas à temps.

Le relevé attend désormais la condition (les quatre barres), plafonnée à 3 s
pour rester borné. Il devient indépendant de la vitesse de la machine et ne
ralentit rien sur une machine rapide : 59,2 s contre 59,5 s avant, mesuré.

Pourquoi cet élargissement est sûr

Le CLAUDE.md prévient qu'élargir une fenêtre au hasard a déjà fait passer une
suite de 1 à 19 échecs. Ici c'est démontrable : chaque barre n'est retenue qu'à
son premier allumage, donc les cycles suivants du chase sont ignorés.
Attendre plus longtemps ne peut rien ajouter de faux.

Vérifications

Check Résultat
npm test ✅ 346 tests, 0 échec, 0 ignoré
node sync-dist.js --check dist/ synchrone
durée du fichier 59,2 s (contre 59,5 s avant)
le test mord toujours ✅ ordre 3D cassé pour de bon dans un clone (list = [...list]) → la suite tombe

Aucun changement dans le code livré : un seul fichier de test.

Suite

Cette correction débloque la publication de la 2.1.1, dont tout le reste est
déjà fusionné dans main.

La CI Windows du 2026-08-17, sur main, a fait tomber « ordre = axe 3D fait
suivre au chase la scéno, pas la liste ». Le relevé rendait
["bar1","bar2","bar3"] au lieu de ["bar1","bar2","bar3","bar0"].

L'ordre n'était pas faux : il était TRONQUÉ. Les trois barres relevées sont les
trois premières de l'ordre géométrique attendu — un ordre cassé aurait rendu
l'ordre de la liste (bar0, bar1, bar2), c'est-à-dire une réponse différente, pas
une réponse plus courte. Le quatrième pas n'était simplement pas encore arrivé.

`ordreVu()` attendait 560 ms pour quatre pas de 120 ms, soit 80 ms de marge. Sur
un runner chargé qui fait tourner une dizaine de serveurs en parallèle, ça ne
tient pas. C'est le piège écrit dans le CLAUDE.md : un test qui mesure une
grandeur qui évolue doit être long devant le bruit de charge.

Le relevé attend désormais la CONDITION — les quatre barres — au lieu de parier
sur une durée, avec un plafond de 3 s pour rester borné si le chase ne démarre
pas. Il est donc indépendant de la vitesse de la machine, et il ne ralentit rien
sur une machine rapide : il sort dès que le compte y est. Mesuré, le fichier met
59,2 s contre 59,5 s avant.

⚠ Le CLAUDE.md prévient qu'élargir une fenêtre au hasard a déjà fait passer une
suite de 1 à 19 échecs. Ici l'élargissement est sûr, et c'est démontrable :
chaque barre n'est retenue qu'à son PREMIER allumage, donc les cycles suivants
du chase sont ignorés. Attendre plus longtemps ne peut rien ajouter de faux.

Et le test n'a pas été rendu complaisant : vérifié en cassant l'ordre 3D pour de
bon dans un clone (`list = [...list]`, le tri géométrique supprimé) — la suite
tombe. Il mord toujours.

346 tests, 0 ignoré. dist/ synchrone. Aucun changement dans le code livré.
Second échec de la CI Windows sur main, le même jour, et pour une raison
différente du premier — celui-ci ne fait tomber aucun test :

  # tests 346   # pass 300   # fail 0   # cancelled 46   # skipped 0

Zéro échec, mais les 46 tests d'interface ANNULÉS, et le job rouge. La cause
réelle était noyée sous 46 lignes « did not finish before its parent » : le
`before` de ui.test.js avait levé « le navigateur n'a pas démarré ».

`attendreDevTools` accordait 20 s à Edge pour répondre sur son point d'entrée
DevTools. Le même runner avait fait passer ces 46 tests deux fois le jour même :
ce n'est donc pas un refus de démarrer, c'est la charge de la machine. Le délai
passe à 60 s.

Attendre plus longtemps ne coûte rien quand tout va bien : la boucle sort dès que
DevTools répond, en général sous la seconde. Ça ne coûte que dans le cas déjà
perdu, où le navigateur ne démarrera jamais — et là, échouer 40 s plus tard ne
change rien à personne.

⚠ À savoir pour la prochaine fois : quand ce `before` lève, les 46 tests
s'annoncent « cancelled » SANS dire pourquoi, et le compte reste à 346. Ni le
nombre de tests ni le nombre d'échecs ne signalent quoi que ce soit — seul
`cancelled` le fait. Le message d'erreur dit désormais le délai attendu, pour
qu'on ne recherche plus la cause à l'aveugle.

346 tests, 0 annulé, 0 ignoré. Aucun changement dans le code livré.
Troisième échec de la CI Windows, encore une autre cause — et celle-ci accusait
le produit à tort :

  « la statistique du bruit ne devrait pas dependre de l axe :
    0.1087 contre 0.2149 »

Or 0,2149 est la valeur NOMINALE des deux azimuts, celle que le commentaire du
test cite lui-même. Ce n'est donc pas l'axe qui a bougé : c'est le premier
relevé qui s'est effondré de moitié. Un écart-type ne s'effondre que d'une
façon — des valeurs plates. Les tout premiers `state()` arrivaient avant le
premier tick du champ, sur une machine chargée, et un relevé plat sur dix suffit
à diviser la dispersion par deux.

La mesure laisse maintenant le champ s'établir (150 ms) et prend 20 relevés au
lieu de 10, pour que la statistique converge.

⚠ Le seuil de 15 % n'est PAS touché. Il avait été resserré depuis 50 % sur
mesure, parce que 50 % laissait passer une dépendance à l'axe de 40 % — soit
précisément le défaut que ce test interdit. Face à un test qui tombe, élargir la
tolérance est la correction tentante et la mauvaise : c'est la mesure qu'on
fiabilise, jamais l'exigence qu'on relâche.

Et le test n'a pas été rendu complaisant : les deux mutations qui le visent —
« etalement du bruit revenu a la version rejetee » et « normalisation par
l'etendue de l'axe remplacee par une constante » — sont toujours détectées,
vérifié dans un clone.

Coût : 61 s au lieu de 59 s sur ce fichier. 346 tests, 0 ignoré.
@pymenvert
pymenvert merged commit b4ed0c3 into main Aug 17, 2026
2 checks passed
@pymenvert
pymenvert deleted the fix/ordre-3d-fenetre-trop-juste branch August 17, 2026 17:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant