Skip to content

check_unaddressed_nits : un mot francais lu comme un SHA, et un rebase-amend classe 'arbre differe' alors que les fichiers de la PR sont intacts #16103

Description

@myia-ai-01

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions