Deux defauts de check_unaddressed_nits.py, mesures en direct sur #16022
Trouves en instruisant #16022 cette nuit. Les deux font qu'une levee valide n'est pas comptee. Le second est le plus couteux : il transforme un rebase ordinaire en « vraie reserve a reposer ».
Defaut 1 — un mot francais compose uniquement de lettres hexadecimales est lu comme un SHA
Sur #16022, ma levee du 2026-09-14T02:45:56Z est rendue par l'organe :
[i] levee de myia-ai-01 a 2026-09-14T02:45:56+00:00 cite effacee
(absent des commits, non rattache a cette PR) -- non bloquant
Le gabarit d'impression est f"... cite {w['sha']} ..." (_print_sha_notes, bucket absent_sha_warnings). Donc w['sha'] == "effacee" : le mot francais « effacee » a ete extrait comme empreinte. Il fait 7 caracteres, tous dans [0-9a-f] (e f f a c e e), et satisfait donc un motif du type \b[0-9a-f]{7,40}\b.
Ce n'est pas theorique et ce n'est pas rare : j'ai reproduit exactement le meme faux positif dans mon propre garde de pre-publication, ecrit independamment quelques minutes plus tot, avec le meme motif. Toute prose francaise qui emploie « effacee », « effacees », et plus generalement un mot de 7+ lettres tire de a-f, declenche la meme lecture.
Consequence : une levee par ailleurs bien formee est rangee en absent_sha_warnings et signalee comme citant une preuve etrangere a la PR. Non bloquant, mais trompeur pour le lecteur — et il m'a fallu lire la source pour comprendre que l'organe ne me reprochait pas une vraie empreinte.
Piste : exiger au moins un chiffre dans le jeton (une empreinte Git de 7+ caracteres sans aucun chiffre est astronomiquement improbable), et/ou n'extraire que les jetons en contexte d'empreinte (entre accents graves, ou verifies par git cat-file -e). La premiere condition seule suffit a supprimer la classe.
Defaut 2 — un rebase-amend est classe « l'arbre DIFFERE » alors que les fichiers de la PR sont inchanges
C'est celui qui tient un merge.
Sur #16022, la levee de la lane (jsboige, 2026-09-13T19:32:00Z) cite 230b11948. La lane a ensuite amende en rebasant sur un main plus recent ; la tete est devenue 50d9e35ab. L'organe rend :
[!] NON LEVE -- levee de jsboige a 2026-09-13T19:32:00+00:00 : cite 230b11948,
absent des commits de la PR (resolu cote serveur, mais rembobine par un push
ulterieur) -- l'arbre DIFFERE de la tete : vraie reserve a reposer
Mesure firsthand contredisant « l'arbre DIFFERE » au sens qui compte : les quatre fichiers de la PR sont identiques au bit pres aux deux revisions.
| fichier de la PR |
blob a 230b11948 |
blob a 50d9e35ab |
MyIA.AI.Notebooks/GenAI/SemanticKernel/MANIFEST.md |
bb0827f7… |
bb0827f7… |
MyIA.AI.Notebooks/GenAI/SemanticKernel/README.md |
90e6f3bf… |
90e6f3bf… |
MyIA.AI.Notebooks/GenAI/SemanticKernel/START_HERE.txt |
52e6ac49… |
52e6ac49… |
MyIA.AI.Notebooks/GenAI/Texte/README.md |
89ffd8e5… |
89ffd8e5… |
La preuve citee par la levee reste donc byte-pour-byte vraie. Ce qui a change, c'est le contenu que main a apporte par le rebase — pas la PR.
L'organe possede deja exactement le bon concept, et ne l'atteint pas ici. Le docstring de _print_sha_notes porte :
#15556 : distinguer l'ARTEFACT du vrai defaut -- un push muet (wake-commit, amend de message) ne change pas l'arbre, la preuve citee reste byte-pour-byte vraie ; seul le SHA a change.
et le bucket rewind_artifacts a deux motifs :
why = ("arbre identique à la tête" if a["reason"] == "same_tree"
else "fichiers de la PR inchangés")
Le second motif — « fichiers de la PR inchanges » — decrit precisement le cas present. Il n'a pas ete emprunte : le classement est parti sur voided_lifts avec tree_differs, donc bloquant.
Hypothese de cause (a confirmer par qui touchera le code) : la comparaison d'arbre porte sur l'arbre entier des deux commits, et non sur les fichiers de la PR. Apres un rebase, l'arbre entier differe toujours — c'est mecanique — alors que les fichiers de la PR peuvent etre intacts. Le test qui distingue les deux est de comparer les blobs des chemins listes par gh pr view N --json files, pas la relation d'arbre.
Pourquoi c'est couteux : le rebase-amend est le geste ordinaire d'une lane a qui l'on demande de se rafraichir (gh pr update-branch le produit aussi). Dans cette configuration, l'organe invalide une levee valide et exige de la reposer. Le cout n'est pas seulement du bruit : il rend rc=1 sur une PR ou plus rien n'est en attente, et pousse a chercher un blocage qui n'existe pas.
Note de methode
Le meme malentendu m'a coute deux fausses alertes cette nuit, avant de le trouver ici : compare/A...B de l'API est a trois points, donc apres un rebase il additionne le diff de la PR et tout ce que main a gagne. J'en avais tire « 25 fichiers touches dont deux regles de harnais » sur #16022, et « le notebook a change entre la revue et le merge, +301/−67 » sur #15800 — deux fois faux, retracte deux fois. Les instruments honnetes sont gh pr view N --json files et la comparaison de blobs aux deux references. Le defaut 2 ci-dessus est la version outillee de la meme erreur, ce qui suggere qu'elle merite un test de non-regression nomme plutot qu'une correction ponctuelle.
Ce que je n'ai pas fait
- Je n'ai pas lu le code d'extraction des empreintes ni celui du classement
voided_lifts / rewind_artifacts : mes deux diagnostics sont deduits de la sortie et des gabarits d'impression, pas de la logique. La cause exacte reste a confirmer dans le code.
- Je n'ai pas cherche d'autres occurrences du defaut 1 dans le corpus des PRs ; une seule instance est mesuree.
- Je n'ai pas evalue si le defaut 2 peut, symetriquement, faire passer pour artefact un vrai rembobinage de contenu — c'est la question a poser avant de relacher le test.
Deux defauts de
check_unaddressed_nits.py, mesures en direct sur #16022Trouves en instruisant #16022 cette nuit. Les deux font qu'une levee valide n'est pas comptee. Le second est le plus couteux : il transforme un rebase ordinaire en « vraie reserve a reposer ».
Defaut 1 — un mot francais compose uniquement de lettres hexadecimales est lu comme un SHA
Sur #16022, ma levee du 2026-09-14T02:45:56Z est rendue par l'organe :
Le gabarit d'impression est
f"... cite {w['sha']} ..."(_print_sha_notes, bucketabsent_sha_warnings). Doncw['sha'] == "effacee": le mot francais « effacee » a ete extrait comme empreinte. Il fait 7 caracteres, tous dans[0-9a-f](e f f a c e e), et satisfait donc un motif du type\b[0-9a-f]{7,40}\b.Ce n'est pas theorique et ce n'est pas rare : j'ai reproduit exactement le meme faux positif dans mon propre garde de pre-publication, ecrit independamment quelques minutes plus tot, avec le meme motif. Toute prose francaise qui emploie « effacee », « effacees », et plus generalement un mot de 7+ lettres tire de
a-f, declenche la meme lecture.Consequence : une levee par ailleurs bien formee est rangee en
absent_sha_warningset signalee comme citant une preuve etrangere a la PR. Non bloquant, mais trompeur pour le lecteur — et il m'a fallu lire la source pour comprendre que l'organe ne me reprochait pas une vraie empreinte.Piste : exiger au moins un chiffre dans le jeton (une empreinte Git de 7+ caracteres sans aucun chiffre est astronomiquement improbable), et/ou n'extraire que les jetons en contexte d'empreinte (entre accents graves, ou verifies par
git cat-file -e). La premiere condition seule suffit a supprimer la classe.Defaut 2 — un rebase-amend est classe « l'arbre DIFFERE » alors que les fichiers de la PR sont inchanges
C'est celui qui tient un merge.
Sur #16022, la levee de la lane (
jsboige, 2026-09-13T19:32:00Z) cite230b11948. La lane a ensuite amende en rebasant sur unmainplus recent ; la tete est devenue50d9e35ab. L'organe rend :Mesure firsthand contredisant « l'arbre DIFFERE » au sens qui compte : les quatre fichiers de la PR sont identiques au bit pres aux deux revisions.
230b1194850d9e35abMyIA.AI.Notebooks/GenAI/SemanticKernel/MANIFEST.mdbb0827f7…bb0827f7…MyIA.AI.Notebooks/GenAI/SemanticKernel/README.md90e6f3bf…90e6f3bf…MyIA.AI.Notebooks/GenAI/SemanticKernel/START_HERE.txt52e6ac49…52e6ac49…MyIA.AI.Notebooks/GenAI/Texte/README.md89ffd8e5…89ffd8e5…La preuve citee par la levee reste donc byte-pour-byte vraie. Ce qui a change, c'est le contenu que
maina apporte par le rebase — pas la PR.L'organe possede deja exactement le bon concept, et ne l'atteint pas ici. Le docstring de
_print_sha_notesporte :et le bucket
rewind_artifactsa deux motifs :Le second motif — « fichiers de la PR inchanges » — decrit precisement le cas present. Il n'a pas ete emprunte : le classement est parti sur
voided_liftsavectree_differs, donc bloquant.Hypothese de cause (a confirmer par qui touchera le code) : la comparaison d'arbre porte sur l'arbre entier des deux commits, et non sur les fichiers de la PR. Apres un rebase, l'arbre entier differe toujours — c'est mecanique — alors que les fichiers de la PR peuvent etre intacts. Le test qui distingue les deux est de comparer les blobs des chemins listes par
gh pr view N --json files, pas la relation d'arbre.Pourquoi c'est couteux : le rebase-amend est le geste ordinaire d'une lane a qui l'on demande de se rafraichir (
gh pr update-branchle produit aussi). Dans cette configuration, l'organe invalide une levee valide et exige de la reposer. Le cout n'est pas seulement du bruit : il rendrc=1sur une PR ou plus rien n'est en attente, et pousse a chercher un blocage qui n'existe pas.Note de methode
Le meme malentendu m'a coute deux fausses alertes cette nuit, avant de le trouver ici :
compare/A...Bde l'API est a trois points, donc apres un rebase il additionne le diff de la PR et tout ce quemaina gagne. J'en avais tire « 25 fichiers touches dont deux regles de harnais » sur #16022, et « le notebook a change entre la revue et le merge, +301/−67 » sur #15800 — deux fois faux, retracte deux fois. Les instruments honnetes sontgh pr view N --json fileset la comparaison de blobs aux deux references. Le defaut 2 ci-dessus est la version outillee de la meme erreur, ce qui suggere qu'elle merite un test de non-regression nomme plutot qu'une correction ponctuelle.Ce que je n'ai pas fait
voided_lifts/rewind_artifacts: mes deux diagnostics sont deduits de la sortie et des gabarits d'impression, pas de la logique. La cause exacte reste a confirmer dans le code.