Skip to content

Fix(ci): enrich-quality-gate -- une PR empilee sur une base en retard audite 287 carnets au lieu de 1 #22298

Closed

Description

@jsboige

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

  1. 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.
  2. 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.
  3. Un carnet absent de origin/main (creation) reste audite.
  4. 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

  1. jsboige commented on Oct 24, 2026

    @jsboige
    OwnerAuthor

    [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).

  2. jsboige commented on Oct 24, 2026

    @jsboige
    OwnerAuthor

    [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.

  3. added 2 commits that reference this issue on Oct 24, 2026
  4. added a commit that references this issue on Oct 25, 2026
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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions