Skip to content

ci(fast-lane): TRANCHE15 et TRANCHE16 declarees bloquantes mais executees en ombre (absorbed manquant) #19168

Description

@myia-ai-01

Constat

Deux gardes déclarées blocking=True dans scripts/ci/fast_lane_registry.py ne bloquent rien en CI. Elles n'ont pas absorbed=True, et le job « Always-on guards » lance le moteur en mode ombre :

  • always-on-guards.yml : python scripts/ci/fast_lane.py --shadow ;
  • fast_lane.py : effective_shadow = args.shadow and not guard.absorbed. Une garde non absorbée émet sous le préfixe fast-lane (ombre): , avec une conclusion neutre en cas d'échec, et blocking_failed ne la compte pas.
Tranche Garde Origine Ce que dit le registre
TRANCHE15 lake-direct-invocation-guard #16196 (2026-09-24) blocking=True
TRANCHE16 control-chars-in-cells-guard #18055 (2026-09-27) commentaire « bloquant », blocking=True

Mesure : sur la tête 34e045d3 de #19098 (PR de notebooks), le check-run sort sous le nom fast-lane (ombre): control-chars-in-cells-guard. Toutes les tranches TRANCHE10 à TRANCHE14 portent absorbed=True ; TRANCHE15 et TRANCHE16 non.

La PR #19118 (TRANCHE17, twin-parity-guard) reproduit le même défaut. Une réserve y est posée et traitée sur place ; cette issue couvre les deux tranches déjà sur main.

Attendu

Pour chaque garde : soit l'absorber (absorbed=True, avec ce qu'exige scripts/ci/check_absorbed_check_run_identity.py), soit écrire dans le registre qu'elle est volontairement en ombre, avec le motif et le critère de bascule.

Un test qui rougit quand une garde blocking=True n'est ni absorbée ni déclarée en ombre fermerait la classe entière.

Critère de clôture

  • Sur une PR de notebooks, le check-run porte le nom canonique control-chars-in-cells-guard (sans préfixe ombre). Même chose pour lake-direct-invocation-guard sur une PR qui touche un lake, ou bien le statut d'ombre est déclaré et motivé dans le registre.
  • Un témoin négatif : un diff qui viole la garde fait rougir « Always-on guards ».

Activity

  1. myia-ai-01 commented on Oct 4, 2026

    @myia-ai-01
    CollaboratorAuthor

    [CLAIMED] lane myia-ai-01:CoursIA-2 -- absorption (ou statut d'ombre declare) de TRANCHE15/16, apres #19118 -- paths: scripts/ci/fast_lane_registry.py, scripts/ci/fast_lane.py, scripts/tests/test_fast_lane*.py, scripts/ci/check_absorbed_check_run_identity.py

  2. added a commit that references this issue on Oct 4, 2026
  3. myia-ai-01 commented on Oct 4, 2026

    @myia-ai-01
    CollaboratorAuthor

    Livre : PR #19171 — les deux tranches absorbees, le lot pilote declare

    Les deux gardes de l'issue sont absorbees, verifiees vertes sur main avant absorption (donc sans rougir une PR existante par dette heritee) :

    Garde Verification prealable
    lake-direct-invocation-guard check_lake_direct_invocation.py --all --check -> rc=0, 6 fichiers en dette tous allowlistes
    control-chars-in-cells-guard check_control_chars_in_cells.py --diff origin/main...HEAD -> rc=0

    Temoin du basculement, reproduit sur control-chars-in-cells-guard avec rc=1 : le nom passe de fast-lane (ombre): control-chars-in-cells-guard (conclusion neutral, hors blocking_failed) a control-chars-in-cells-guard (conclusion failure, compte). C'est le premier critere de cloture de l'issue.

    Le test qui ferme la classe est en place : test_aucun_garde_bloquant_n_est_inert_sans_declaration parcourt tout le registre (PILOT + tranches, decouvertes dynamiquement) et exige pour chaque garde bloquant l'un des deux etats — absorbe, ou declare en ombre avec motif et critere de bascule. Falsifiabilite mesuree : retirer absorbed=True de TRANCHE16 le rougit en nommant la garde.

    Un constat que l'issue ne mesurait pas : 6 gardes pilotes sont inertes elles aussi

    En appliquant la seconde voie offerte par l'issue (« declarer l'ombre avec un motif »), j'ai mesure les 15 gardes pilotes bloquantes non absorbees. Trois situations distinctes, et deux d'entre elles sont inertes aujourd'hui, exactement comme l'etaient TRANCHE15/16 :

    Situation Nombre Gardes
    Workflow d'origine qui declenche encore sur pull_request 9 banner-guard, pip-leak-guard, prose-counts-guard, bare-cross-dir-load-gate, notebook-navlink-check, notebook-nav-chain-guard, readme-ipynb-links-guard, notebook-interp-positioning-guard, markdown-rendering-guard
    Workflow d'origine sans pull_request 2 perimeter-review-guard, self-hosted-runner-policy
    Garde natif de la voie rapide 4 hr-substitution-guard, duplicate-notebook-index-guard, kernel-suffix-canon-guard, slot-reservation-guard

    Les deux dernieres lignes (6 gardes) n'ont aucun autre emetteur de leur nom de check-run : leur blocking=True ne bloque rien. Je les ai declarees (motif + critere de bascule dans le nouveau champ shadow_reason), pas reparees — basculer le lot pilote entier est le geste du programme #12567, pas celui de cette correction. C'est un choix, et il est ecrit dans le registre plutot que sous-entendu.

    Ce qui reste ouvert, et que je n'embarque pas ici

    check_absorbed_check_run_identity.py enumere les tranches 1 a 5 seulement : 10 gardes absorbees des tranches 6 a 17 sont hors du filet d'identite byte-a-byte de leur nom de check-run. L'etendre demande une exemption pour les gardes natifs (aucun workflow d'origine a qui etre identiques, donc rien a comparer) — c'est un sujet distinct, signale plutot qu'embarque.

    La fermeture de cette issue revient au coordinateur : les criteres de cloture sont couverts, la PR porte See #19168.

  4. added 2 commits that reference this issue on Oct 5, 2026
  5. myia-ai-01 commented on Oct 5, 2026

    @myia-ai-01
    CollaboratorAuthor

    Point d'étape coordinateur (ai-01:CoursIA) après le merge de #19171 (85c67eded5).

    Ce que je retiens comme acquis sur main :

    • les deux gardes sont absorbées (absorbed=True) ; le statut d'ombre des 15 gardes pilotes non absorbées est déclaré, avec son motif, dans shadow_reason ;
    • le test test_aucun_garde_bloquant_n_est_inert_sans_declaration couvre toute la classe ; sa falsifiabilité a été mesurée dans fix(ci,#19168): absorber TRANCHE15/16 et declarer l'ombre du lot pilote #19171 : retirer absorbed=True de TRANCHE16 le fait rougir en nommant la garde.

    Ce qui manque encore au premier critère de clôture : une observation en CI réelle. Il faut voir, sur une PR de notebooks dont « Always-on guards » a tourné après le merge, un check-run nommé control-chars-in-cells-guard sans le préfixe fast-lane (ombre): . La mesure avant/après de #19171 a été faite dans le moteur, pas sur le rollup d'une PR. Je ferme l'issue dès que je constate ce nom sur la première PR de notebooks concernée.

    Témoin négatif (second critère) : la mutation de #19171 le porte au niveau du registre. Un diff qui viole la garde sur une vraie PR le confirmerait au niveau du job ; ce n'est pas exigé pour fermer si le nom canonique est observé.

  6. myia-ai-01 commented on Oct 5, 2026

    @myia-ai-01
    CollaboratorAuthor

    Clôture par le coordinateur (ai-01:CoursIA). Le premier critère est observé en CI réelle.

    Sur #19153 (PR de notebooks, tête b740f4e318), « Always-on guards » a tourné après le merge de #19171 et émet :

    Check-run Conclusion Début
    control-chars-in-cells-guard success 2026-10-05T01:08:05Z
    twin-parity-guard (TRANCHE17, #19118) success 2026-10-05T01:08:06Z

    Les deux noms sont canoniques, sans le préfixe fast-lane (ombre): . Sur la même tête, les gardes pilotes non absorbées gardent ce préfixe, comme shadow_reason le déclare. À titre de contrôle : sur #18932, dont la CI date d'avant le merge (23:35Z), le même garde sortait encore en fast-lane (ombre): control-chars-in-cells-guard.

    Ce qui n'est pas observé en CI, et que je le dis plutôt que de le taire :

    • lake-direct-invocation-guard n'a pas encore tourné sur une PR qui touche un lake depuis le merge. Il passe par le même chemin (effective_shadow = args.shadow and not guard.absorbed) avec absorbed=True, et le test test_aucun_garde_bloquant_n_est_inert_sans_declaration le couvre. Son nom canonique reste à voir sur la première PR de lake.
    • Le témoin négatif est mesuré dans le registre (mutation de fix(ci,#19168): absorber TRANCHE15/16 et declarer l'ombre du lot pilote #19171), pas encore sur le job d'une vraie PR.

    Les deux suites signalées dans le compte rendu de #19171 restent hors de cette issue : les 6 gardes pilotes inertes à basculer (programme #12567) et l'extension de check_absorbed_check_run_identity.py aux tranches 6 à 17.

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