Skip to content

Deux groupes par ecosysteme, et un garde-fou qui avait perdu sa marge - #22

Merged
lostmind84 merged 3 commits into
mainfrom
chore/dependabot-groupes-et-budget-du-banc
Jul 30, 2026
Merged

lostmind84 merged 3 commits into
mainfrom
chore/dependabot-groupes-et-budget-du-banc

Conversation

@lostmind84

Copy link
Copy Markdown
Owner

Suite des trois demandes Dependabot. Deux étaient bonnes et sont fusionnées (#19, #20) ; la troisième était ininstallable et a été fermée (#21). Cette branche corrige la cause de la troisième, et referme au passage l'observation que la passe de sécurité avait laissée ouverte.

ci(deps) — une majeure incompatible retenait cinq montées saines

Mon dependabot.yml groupait tout en patterns: ["*"] par écosystème. La première demande npm portait six montées, dont TypeScript 7 — que svelte-check refuse encore :

npm error ERESOLVE
  Found: typescript@7.0.2
  peer typescript@"^5.0.0 || ^6.0.0" from svelte-check@4.7.4

npm ci échouait avant le premier test, et cinq montées parfaitement saines (@types/node, svelte-check, jsdom…) étaient retenues par la sixième, sans autre issue que de tout fermer.

Majeures et mineures voyagent désormais séparément, dans les trois écosystèmes. Coût : une demande de plus par écosystème et par mois. La cadence mensuelle et le groupement restent — une coopérative sans mainteneur à temps plein cesse de regarder un dépôt qui ouvre une demande par dépendance et par semaine.

test(station) — le garde-fou anti-blocage n'avait plus de marge

hang valait 5 s et son commentaire promettait « it never elapses in a passing run : it is a guard, not a delay ». La CI a démenti la promesse, sur la demande qui ne changeait que deux empreintes d'actions dans deux fichiers YAML — donc sur un diff qui ne pouvait pas causer un échec de test Go :

--- FAIL: TestAnAmputatedCatalogIsRefusedAgainstTheRealGuard (5.54s)
    failures_catalog_test.go:1619: la grille n'a jamais compté 331 tuiles

Ce n'est pas une course entre goroutines. Mesuré sur ce test, le plus lourd du paquet parce qu'il décode les 181 images du flv.csv réel deux fois :

Condition Durée
isolé, sans -race 0,52 s (cinq exécutions, stable)
isolé, sous -race 1,07 s
budget hang 5 s
observé en CI à l'échec 5,54 s

L'écart vient du runner : go test ./... joue les paquets en parallèle, donc internal/web et cmd/openscale — 25 s et 21 s à eux seuls — concourent avec celui-ci sur quatre vCPU sous le détecteur de courses. Une seconde de travail en devient cinq, et un garde-fou avec un facteur cinq de marge n'en a plus.

hang passe à 30 s. Le changement ne coûte rien sur une exécution verte : awaitCondition rend la main dès que sa condition tient, aucun test qui passe ne ralentit d'une microseconde. Il coûte trente secondes au lieu de cinq pour déclarer un vrai blocage, une fois, sur une exécution qui échoue déjà — l'arbitrage exact que le commentaire revendiquait.

Les mesures sont écrites à côté de la constante, pour que la prochaine personne tentée de la redescendre à une valeur ronde les trouve sur place.

docs — et la piste que j'avais donnée était fausse

SUIVI.md renvoyait vers la famille skipUnderShort que ci.yml documente. Ce n'était pas ça. Une piste fausse laissée dans le suivi coûte plus qu'une observation sans piste : elle envoie chercher au mauvais endroit. L'entrée porte maintenant le nom du test, les quatre chiffres, et ce que le groupement de dependabot.yml a coûté.

Vérification

go vet ./...                      vert
gofmt -l .                        rien
go test -race -short (CGO=1)      31 paquets, 0 échec
go test -short (CGO=0)            31 paquets, 0 échec
boundary                          les coupes sont respectées
deps                              6 dépendances directes, conformes à §17.1
dependabot.yml                    YAML valide, 2 groupes par écosystème

Le groupement etait `patterns: ["*"]` par ecosysteme, donc une seule demande par
mois et par ecosysteme. La premiere demande npm qui en est sortie portait six
montees, dont TypeScript 7 -- que svelte-check refuse encore, il declare
`peer typescript@"^5.0.0 || ^6.0.0"`. npm ci echouait AVANT le premier test :

    npm error ERESOLVE
      Found: typescript@7.0.2
      peer typescript@"^5.0.0 || ^6.0.0" from svelte-check@4.7.4

Cinq montees parfaitement saines -- @types/node, svelte-check, jsdom et deux
autres -- etaient donc retenues par la sixieme, sans autre issue que de fermer la
demande entiere et de tout perdre. C'est le defaut du groupement, pas celui de la
demande.

Majeures et mineures voyagent desormais separement, dans les trois ecosystemes.
Les mineures deviennent independantes : elles passent seules, et une majeure qui
casse attend dans son propre lot aussi longtemps qu'il faut sans rien bloquer.

Le cout est une demande de plus par ecosysteme et par mois. C'est peu au regard de
ce qu'on achete : la difference entre une montee qu'on relit et une montee qu'on
subit. La cadence mensuelle et le groupement restent, pour la raison ecrite en
tete du fichier -- une cooperative sans mainteneur a temps plein cesse de regarder
un depot qui ouvre une demande par dependance et par semaine.

C'est sur le front que la separation compte le plus, et le commentaire le dit :
les dependances y sont epinglees a la version EXACTE (§14.1), donc chacune de
leurs majeures est une rupture potentielle de peer dependency.
… runner

hang valait 5 s, et son commentaire promettait « it never elapses in a passing
run : it is a guard, not a delay ». La CI a dementi la promesse :

    --- FAIL: TestAnAmputatedCatalogIsRefusedAgainstTheRealGuard (5.54s)
        failures_catalog_test.go:1619: la grille n'a jamais compte 331 tuiles

L'echec est tombe sur une demande qui ne change QUE deux empreintes d'actions dans
deux fichiers YAML. Il ne pouvait donc pas venir du code teste, et c'est ce qui
permet de le nommer sans hesiter : ce n'est pas une regression, c'est le budget.

Ce n'est pas non plus une course entre goroutines, et la premiere piste ecrite
dans SUIVI.md -- la famille skipUnderShort que ci.yml documente -- etait fausse.
MESURE sur ce test, le plus lourd du paquet parce qu'il decode les 181 images du
flv.csv REEL deux fois :

    isole, sans -race    0,52 s   (cinq executions, stable)
    isole, sous -race    1,07 s
    budget               5 s
    observe en CI        5,54 s

L'ecart vient du runner. `go test ./...` joue les paquets EN PARALLELE, si bien
qu'internal/web et cmd/openscale -- 25 s et 21 s a eux seuls -- concourent avec
celui-ci sur quatre vCPU, sous le detecteur de courses. Une seconde de travail en
devient cinq, et un garde-fou qui n'avait qu'un facteur cinq de marge n'en a plus.

Trente secondes, et le choix ne coute RIEN sur une execution verte : awaitCondition
rend la main des que sa condition tient, donc aucun test qui passe ne ralentit
d'une microseconde. Ce qu'on paye, c'est trente secondes au lieu de cinq pour
declarer un vrai blocage, une fois, sur une execution qui echoue deja. C'est
exactement l'arbitrage que le commentaire revendiquait, et que la valeur 5 ne
tenait pas.

Les mesures sont ecrites a cote de la constante et non ici : la prochaine personne
tentee de la redescendre a « une valeur ronde » les trouvera sur place.
…ee etait fausse

L'entree de la passe de securite laissait une observation ouverte : une execution
de la suite sur douze signalait un echec dans un paquet, jamais reproduit, et la
commande de comptage n'en avait pas garde le nom. Elle renvoyait vers la famille de
tests sensibles au planificateur que ci.yml documente, skipUnderShort. Ce n'etait
pas ca, et une piste fausse laissee dans le suivi coute plus qu'une observation sans
piste : elle envoie chercher au mauvais endroit.

Le test est nomme, la cause est mesuree, et le correctif est dans le commit
precedent. Le suivi porte desormais les quatre chiffres qui la montrent -- 0,52 s
isole, 1,07 s sous -race, 5 s de budget, 5,54 s observe -- et l'explication de
l'ecart : les paquets tournent en parallele, donc les trois plus lourds concourent
sur quatre vCPU sous le detecteur de courses.

L'entree dit aussi ce que le groupement de dependabot.yml a coute, pour la meme
raison qu'on ecrit les echecs plutot que de les corriger en silence : la prochaine
personne tentee de regrouper tout en une demande y trouvera pourquoi cela avait
ete essaye, et ce que cela a bloque.

Rien d'autre ne change : ni un compteur, ni un chiffre de la passe de securite.
@lostmind84
lostmind84 merged commit 5819abe into main Jul 30, 2026
6 checks passed
@lostmind84
lostmind84 deleted the chore/dependabot-groupes-et-budget-du-banc branch July 30, 2026 11:45
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