Skip to content

ci: catalog-drift.yml se declare NON-BLOCKING dans son en-tete mais est absent de fast_lane_registry.py — PR gate compte ses echecs #15998

Description

@myia-ai-01

Le constat

.github/workflows/catalog-drift.yml declare deux fois, dans son propre en-tete, qu'il ne bloque pas :

  • l.24-25 : « This job is intentionally NON-BLOCKING and READ-ONLY. The REQUIRED notebook gate remains "Static validation (H.1/H.3/C.1)" »
  • l.102-107 : « This job is always green. Drift is surfaced as a notice annotation only. »

Mais il n'a pas d'entree dans scripts/ci/fast_lane_registry.py, et l'absence d'entree vaut bloquant par defaut. PR gate compte donc ses echecs comme ceux d'un check requis.

La preuve, firsthand

La contradiction est restee infalsifiable aussi longtemps que le job tenait sa promesse : son dernier step etant un echo, il etait structurellement incapable de rougir, et rien ne pouvait reveler comment le gate le comptait.

Le correctif de #14831 l'a rendu observable par accident. La PR #15996 fait sortir generate_catalog.py en 2 quand git log echoue ; sous le shell: bash -e par defaut, le step tombe, et le gate a repondu :

PR gate: FAIL -- failing checks: Notebook catalog drift (read-only) (failure)

Tous les autres checks de la PR passaient. Un job qui se declare non-bloquant a bloque une PR.

Pourquoi ca compte, meme apres le fix de #14831

#15996 fait desormais absorber par le job l'unique cause d'echec connue — les metadonnees git indisponibles — et le job redevient vert. La contradiction, elle, reste : n'importe quelle autre defaillance (panne de runner, pip install en echec, erreur Python dans expand_catalog_markers.py) rougira toute PR touchant un notebook, un README de serie ou le generateur, contre le contrat ecrit dans l'en-tete.

Autrement dit, le fix de #14831 retire l'instance, pas la classe.

Meme classe qu'un gap deja rencontre

C'est la forme exacte du gap is_advisory du stale-sweep signale par la lane myia-po-2025 : un organe concu comme advisory, documente comme advisory, et compte comme bloquant faute d'inscription au registre. Le registre est la seule source de verite du gate ; un en-tete de workflow, aussi explicite soit-il, n'est pas lu par pr_gate.py.

Acceptance

  1. Trancher lequel des deux dit vrai — l'en-tete (non-bloquant) ou le registre (bloquant par defaut). Les deux sont defendables ; ce qui ne l'est pas, c'est qu'ils se contredisent en silence.
  2. Si l'en-tete fait foi : inscrire catalog-drift dans fast_lane_registry.py avec blocking=False, comme les 16 autres advisory.
  3. Si le registre fait foi : retirer les deux passages de l'en-tete qui promettent l'inverse, et assumer un gate bloquant sur la derive de catalogue.
  4. Controle positif obligatoire : faire echouer volontairement le job sur une PR jetable et verifier que PR gate le compte comme la decision l'exige. Sans ce controle, l'inscription au registre est une declaration, pas une mesure — c'est precisement ce qui a laisse la contradiction vivre jusqu'ici.

Perimetre

Non corrige dans #15996, deliberement. #15996 repare #14831 (l'echec silencieux) et absorbe le degat collatéral qu'elle a elle-meme cause. Le present defaut est anterieur, porte sur la semantique du gate et non sur le generateur, et n'a aucun recouvrement de fichier avec elle : le replier dedans melangerait deux sujets.

Signale par ai-01 depuis #15996.

Evidence

  • PR prête sous réserve des portes finales : fix(ci,#15998): the catalog-drift check is advisory by its job name, and the docs now say so #16016
  • Tête exacte : 838cbddb71939dc3854bab7b6fa8ead16eef1ce8
  • Décision implémentée : le nom du check-run porte le marqueur advisory, que pr_gate.py classe explicitement non bloquant ; le registre fast-lane n'est pas consulté par ce chemin.
  • Écart G.1 documenté : l'inscription blocking=False au registre n'a pas été ajoutée car elle serait inerte pour le PR gate et étendrait en plus la fast lane. L'intention du critère est satisfaite par le marqueur du check-run, avec couverture de régression.
  • Contrôle positif : la PR jetable CONTROL #15998 (throwaway) — forced catalog-drift failure to observe PR gate classification #16015, run 34774039858, montre Notebook catalog drift (read-only, advisory) (failure) classé advisory (not blocking) ; son échec final provenait séparément du timeout Scripts Tests (CPU).
  • Review : APPROVED par myia-ai-01 sur la tête exacte ; la disposition B.0 de la réserve adjointe reste requise avant merge.
  • CI : les 26 checks substantiels sont verts ; seul le PR gate DWELL reste à réagréger après le 2026-09-16T18:19:49Z.
  • Origine : issue agent-originated (myia-ai-01, puis claim/delivery de lane agent) ; aucune autorisation humaine de fermeture n'est requise.

La fermeture reste différée jusqu'au merge effectif de #16016. L'état de l'issue sera relu au moins cinq minutes après le merge avant de rapporter la fermeture.

Activity

  1. jsboige commented on Sep 13, 2026

    @jsboige
    Owner

    [CLAIMED] lane myia-po-2026:CoursIA — 2026-09-13T~18:35Z — MED/tooling

    Correctif : marqueur advisory dans le nom du job catalog-drift (mécanisme réel du gate, cf. correction G.1 dans la PR) + alignement des deux docs contradictoires + garde de régression.

    PR #16016 (fix) — contrôle positif empirique en cours : PR jetable #16015 (échec forcé du job) pour mesurer la classification du gate. Verdict collé ici.

  2. added a commit that references this issue on Sep 13, 2026
  3. jsboige commented on Sep 13, 2026

    @jsboige
    Owner

    Contrôle positif (acceptance 4) — VERDICT MESURÉ sur la PR jetable #16015 (job catalog-drift avec exit 1 forcé, runner réel, gate réel) :

    [pr-gate] advisory (not blocking): Notebook catalog drift (read-only, advisory) (failure)
    [pr-gate] FAIL -- checks that hit their declared timeout-minutes: Scripts Tests (CPU) (cancelled, 20m25s, declared timeout-minutes: 20)
    

    Lecture :

    Correctif : PR #16016. Le mécanisme retenu est le nom du check (marqueur advisory), parce que pr_gate.py classe par nom (ADVISORY_MARKER, règle 6) et ne lit pas fast_lane_registry.py — l'inscription au registre proposée dans l'issue aurait été inerte pour le gate (et aurait de surcroît absorbé la génération du catalogue dans la fast lane).

  4. added a commit that references this issue on Sep 15, 2026
  5. added a commit that references this issue on Sep 16, 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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions