Skip to content

chore(garde-fous): le verdict séparé de ce qu'il mesure, et un contrôle mort retiré - #16

Merged
stephrobert merged 1 commit into
mainfrom
chore/garde-fou-des-verdicts
Oct 23, 2026
Merged

stephrobert merged 1 commit into
mainfrom
chore/garde-fou-des-verdicts

Conversation

@stephrobert

Copy link
Copy Markdown
Owner

Deux corrections venues des catalogues Bases de données et GitLab CI, où elles ont été trouvées et éprouvées le 2026-10-22. Elles sont posées à l'identique dans tous les catalogues.

1. Un verdict ne se commite pas avec ce qu'il mesure

La péremption d'un verdict se jugeait en comparant des dates : un lab était « à réattester » dès qu'un commit postérieur touchait ses fichiers. Cette comparaison répond à une autre question que celle qu'on pose, et elle s'est trompée dans les deux sens le même jour.

Faux négatif, le sens dangereux. Une correction du code partagé et les verdicts qu'elle rendait caducs ont été commités ensemble. Aucun verdict n'était postérieur à quoi que ce soit, le contrôle a conclu que tout allait bien, et vingt et un verdicts VALIDE ne valaient plus rien.

Faux positif. Des labs réattestés sur une branche sont ressortis « à réattester » après leur fusion, parce que le squash écrase la branche en un commit daté de la fusion. Contenu inchangé. Systématique dans tout dépôt qui fusionne ainsi.

Le contrôle qui fait foi compare désormais deux arbres git côté site, ce qui ne dépend plus de la façon de fusionner. Mais un cas échappe à toute mesure a posteriori : une pull request squashée qui retouche un test après sa campagne. Le commit unique porte les deux et le squash a détruit ce qui les distinguait — ni une date, ni un diff entre deux arbres, ni une empreinte inscrite ensuite ne peuvent dire lequel est venu avant.

Il ne se constate donc pas, il s'empêche. Le hook refuse un commit portant validation-labs.json à côté de ce que le cycle joue : challenge/tests/, setup.yaml, cleanup.yaml, lab.yaml d'un lab, et l'outillage partagé. L'énoncé reste autorisé : il n'est pas joué par le cycle, et l'interdire obligerait à une campagne pour une coquille d'orthographe.

2. Un contrôle Plumber qui ne contrôle plus rien

pipelineMustNotLeakSecretsInConfig a été retiré de Plumber, qui répond désormais « was removed and is now ignored: secret detection is no longer part of Plumber; remove this block ». Il était déclaré deux fois, dans les sections gitlab et github. Le garder laissait croire que la détection de secrets est couverte ici. Elle ne l'est pas, et c'est detect-private-key qui s'en approche, en hook.

Contrôles joués

  • 14 tests sur le garde-fou, les deux sens couverts : ce qu'il doit refuser (relevé + commun, + outillage, + test, + setup, + cleanup, + lab.yaml) et ce qu'il doit laisser passer (chacun seul, relevé + énoncé, rien du tout).
  • Éprouvé en le forçant à tout refuser : les cas légitimes tombent alors. Un contrôle qu'on n'a pas vu échouer ne mesure rien.
  • Le test est lancé par son propre hook, et pas seulement présent : plusieurs catalogues ont refusé le premier jet pour cette raison exacte, et ils avaient raison — un vérificateur débranché ne protège rien en silence.
  • .plumber.yaml et .pre-commit-config.yaml rechargés après modification : les deux se parsent, et le hook n'est déclaré qu'une fois.
  • La chaîne de hooks de ce dépôt est passée en entier au commit, sans quoi il aurait été refusé.
  • N/A Aucun lab, test de lab ni solution touché : validation-labs.json est inchangé et les verdicts restent valides.
  • N/A Pas de bump : ce commit ne change rien de ce qu'un lab prouve.

…le mort retire

Deux corrections venues des catalogues Bases de donnees et GitLab CI, ou elles
ont ete trouvees et eprouvees le 2026-10-22.

UN VERDICT NE SE COMMITE PAS AVEC CE QU'IL MESURE

La peremption d'un verdict se jugeait en comparant des DATES : un lab etait « a
reattester » des qu'un commit posterieur touchait ses fichiers. Cette
comparaison repond a une autre question que celle qu'on pose, et elle s'est
trompee dans les DEUX SENS le meme jour.

Faux negatif, le sens dangereux : une correction du code partage et les
verdicts qu'elle rendait caducs ont ete commites ENSEMBLE. Aucun verdict
n'etait posterieur a quoi que ce soit, le controle a conclu que tout allait
bien, et vingt et un verdicts VALIDE ne valaient plus rien.

Faux positif : des labs reattestes sur une branche sont ressortis « a
reattester » apres leur fusion, parce que le SQUASH ecrase la branche en un
commit date de la fusion. Contenu inchange. Systematique, dans tout depot qui
fusionne ainsi.

Le controle qui fait foi compare desormais deux arbres git cote site, ce qui ne
depend plus de la facon de fusionner. Mais un cas echappe a toute mesure a
posteriori : une pull request squashee qui retouche un test APRES sa campagne.
Le commit unique porte les deux et le squash a detruit ce qui les distinguait.
Ni une date, ni un diff entre deux arbres, ni une empreinte inscrite ensuite ne
peuvent dire lequel est venu avant.

Il ne se constate donc pas, il s'empeche. Le hook refuse un commit portant
`validation-labs.json` a cote de ce que le cycle joue : `challenge/tests/`,
`setup.yaml`, `cleanup.yaml`, `lab.yaml` d'un lab, et l'outillage partage.
L'enonce reste autorise, il n'est pas joue par le cycle et l'interdire
obligerait a une campagne pour une coquille.

Quatorze tests l'accompagnent, les deux sens couverts, et il a ete eprouve en
le forcant a tout refuser : les cas legitimes tombent alors, ce qui est bien ce
qu'on veut lire.

UN CONTROLE PLUMBER QUI NE CONTROLE PLUS RIEN

`pipelineMustNotLeakSecretsInConfig` a ete RETIRE de Plumber, qui repond
desormais « was removed and is now ignored: secret detection is no longer part
of Plumber; remove this block ». Il etait declare DEUX fois ici, dans les
sections gitlab et github. Le garder, c'etait laisser croire que la detection
de secrets est couverte. Elle ne l'est pas, et c'est `detect-private-key` qui
s'en approche, en hook.
@stephrobert
stephrobert merged commit abf7903 into main Oct 23, 2026
8 checks passed
@stephrobert
stephrobert deleted the chore/garde-fou-des-verdicts branch October 23, 2026 06:33
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