Repository navigation
Fix(ci): enrich-quality-gate -- une PR empilee sur une base en retard audite 287 carnets au lieu de 1 #22298
Description
Fix(ci): enrich-quality-gate -- une PR empilee sur une base en retard audite 287 carnets au lieu de 1
Sans parent : defaut d'organe CI decouvert en reparant #21650 (le gate enrich-quality d'une PR empilee).
Constat mesure (2026-10-24, #21650)
enrich-quality-gate.yml l.62 calcule sa liste de carnets contre la branche de base de la PR :
BASE="origin/${{ github.base_ref }}"
STATUS=$(git diff --name-status -M "$BASE"...HEAD -- 'MyIA.AI.Notebooks/**/*.ipynb')Sur une PR empilee (#7742 : #21636 -> #21650 -> #21663), la base est feature/7742-jonction-tweety, pas main. Mesures sur la tete efcd2e9c1f7 :
| Mesure | Valeur |
|---|---|
commits que main porte et pas la base |
521 |
carnets dans git diff --name-status -M BASE...HEAD |
287 |
carnets dans le diff reel de la PR vs main |
1 |
| findings HIGH denonces | 3, tous sur des carnets hors du diff de la PR |
Les trois carnets denonces sont byte-identiques entre la tete de la PR et origin/main (git diff --numstat origin/main efcd2e9c1f7 -- <path> = 0 ligne) :
GenAI/Plateformes-Conversationnelles/AI-Engine-WordPress/03-Functional/03-4-MCP-Server/consommer-vs-exposer-le-mcp.ipynb--[MD_REWRITE] only 2/396 substantive markdown lines ... survive verbatim (1%)GenAI/Texte/07_Code_Interpreter.ipynb--[MD_REWRITE] only 86/361 (24%)QuantConnect/ML-Training-Pipeline/c1330_xrp_dt_foldwise_research.ipynb--[MD_REWRITE]
Le gate attribue donc a la PR des findings produits par main depuis le point de fork de la base. Les trois ont le meme motif MD_REWRITE : ce sont des reecritures markdown legitimes deja mergees sur main, vues a l'envers (la base ne les a pas).
Pourquoi aucun geste de lane ne peut le lever
gh run rerun rejoue la merge ref figee avec le meme base_ref : l'essai 3 (run 39982197955, job 120775049401, 04:12:58Z) reproduit les trois findings a l'identique. gh pr update-branch sur #21650 fusionnerait la base dans la PR -- elle y est deja, cela ne rajeunit pas la base. Rafraichir la base est un geste sur #21636, donc sur la chaine #7742, qui appartient a ai-01 (consigne : pas de vague d'update-branch). Le rouge est donc structurel du point de vue de la lane.
Defaut propose
Le contrat du gate est « les findings introduits par cette PR ». Un carnet dont le blob a HEAD est identique a celui de main ne peut pas avoir ete introduit par la PR, quelle que soit la base utilisee. Filtre minimal, apres la resolution de renommage existante (l.72-80) :
# Un carnet identique a main n'est pas l'oeuvre de la PR : la base peut etre
# une branche empilee en retard (287 carnets au lieu de 1 sur #21650).
KEPT=""
while IFS=$'\t' read -r st path rest; do
[ -z "${path:-}" ] && continue
if [ "$st" = "R100" ] && [ -n "${rest:-}" ]; then path="$rest"; fi
if git cat-file -e "origin/main:$path" 2>/dev/null \
&& [ "$(git rev-parse "origin/main:$path")" = "$(git rev-parse "HEAD:$path")" ]; then
continue
fi
KEPT="$KEPT$st"$'\t'"$path"$'\n'
done <<< "$STATUS"Variante ecartee : differ contre git merge-base origin/main HEAD. Elle rend le gate aveugle aux carnets que la base modifie et que la PR ne modifie pas -- utile sur un stack ou le parent n'est pas encore merge. Le filtre par egalite de blob garde la semantique exacte (« introduit par cette PR ») sans dependre de la fraicheur de la base.
fetch-depth: 0 est deja en place (l.47) : origin/main est disponible sans cout supplementaire ajoute par ce correctif.
Portee / famille
12 workflows de .github/workflows/ lisent github.base_ref ; la cecite ne mord que la ou le gate attribue un finding a la PR (ici, et probablement les gates de la meme famille : md-content-loss, plan-loss, fabricated-output). Cette issue ne tranche que enrich-quality-gate ; un releve de famille est un sujet distinct, a ouvrir si le meme faux rouge est observe ailleurs.
Acceptance
- Sur feat(iit,#7742): C3 -- le codage AF des deux discours historiques (tranche 3) #21650, le gate nomme un seul carnet (celui de la PR) et passe au vert -- ou reste rouge pour un finding reellement introduit par la PR, en le nommant.
- Controle positif obligatoire : une PR qui reecrit reellement le markdown d'un carnet doit encore rougir en
MD_REWRITE(le filtre ne doit pas eteindre le gate). Test unitaire du filtre avec un carnet modifie vs un carnet identique. - Un carnet absent de
origin/main(creation) reste audite. - Un carnet renomme reste resolu par son nom de base (comportement enrich-quality-gate: git diff --name-only sans -M traite les renames comme nouveaux fichiers #15106 preserve).
Activity
jsboige commentedon Oct 24, 2026
[CLAIMED] lane myia-po-2023:CoursIA -- filtre "introduit par la PR" du gate
enrich-quality: organe Python testable + cablage workflow + tests (controle positif inclus)paths: .github/workflows/enrich-quality-gate.yml, scripts/ci/filter_pr_introduced_notebooks.py, scripts/ci/tests/test_filter_pr_introduced_notebooks.py
Issue ouverte par cette lane apres la mesure sur #21650 (base du stack en retard de 521 commits, 287 carnets audites au lieu de 1).
jsboige commentedon Oct 24, 2026
[DELIVERED] lane myia-po-2023:CoursIA -- PR #22302
Filtre "introduit par la PR" livre : organe
scripts/ci/filter_pr_introduced_notebooks.py+ cablage du gate + 10 tests (dont 5 sur un vrai depot git). Mesure sur le cas reel #21650 : 287 carnets -> 1 (celui de la PR), 286 retires. Review/merge = ai-01.Fix(ci,#22298): filter -- les ecritures de merge comptent pour la PR
Fix(ci,#22298): jambe shell -- un plantage du filtre rougit le gate
Fix(ci,#22298): enrich-quality -- n'audite que les carnets qu'un comm…