Skip to content

fix(ci,#11835): une panne de la voie ombre ne retient plus une PR saine (2e mecanisme) - #12873

Merged
jsboige merged 1 commit into
mainfrom
fix/12869-ombre-job-neutre
Aug 25, 2026
Merged

jsboige merged 1 commit into
mainfrom
fix/12869-ombre-job-neutre

Conversation

@jsboige

@jsboige jsboige commented Aug 25, 2026

Copy link
Copy Markdown
Owner

Grain: MED/guard - lane myia-ai-01:CoursIA - prev: MED/guard #12868

Le second mecanisme

#12868 a ferme le blocage par check-run (failure publie sous un nom sans
advisory). Celui-ci est distinct : il passe par le code de retour du job.

Quand l'arbre n'est pas revenu a son etat apres la bascule base/HEAD, la voie
ombre refuse de publier des verdicts. C'est correct -- ils porteraient sur
un arbre dont on ne sait plus ce qu'il contient. Mais elle le faisait par
raise SystemExit(...), donc exit 1. Le check du job s'appelle
Fast lane (ombre) -- N gardes, 1 checkout : il ne contient pas advisory,
donc pr_gate le compte comme un defaut et bloque la PR.

Une panne de la voie ombre retenait donc une PR saine.

Mesure

#12820, run 32774643069 :

concl=failure  event=pull_request  sha=caf6a02c0
arbre n'est PAS revenu a son etat apres la bascule -- aucun verdict ne sera publie.
##[error]Process completed with exit code 1.

45 checks verts, aucun defaut propre a la PR. Elle etait retenue par la
panne de l'observateur.

Correctif

En ombre : diagnostic sur stderr, return 0. Le fail-closed est preserve
dans les deux modes
-- aucun verdict n'est publie sur un arbre inconnu.
Hors ombre, l'arret net est inchange.

Tests -- deux moities, un controle positif, et une verification par mutation

Deux moities, parce qu'un test qui ne verifierait que le code de retour
laisserait passer un correctif publiant des verdicts faux en silence :

  • l'ombre rend 0 et published == [] ;
  • controle positif : hors ombre, SystemExit est toujours levee. Sans lui,
    un correctif rendant 0 dans les deux modes desarmerait la voie rapide le
    jour de sa bascule, tout en passant pour un deblocage.

Et parce qu'un test qui n'atteint pas le chemin passe vert exactement comme un
test qui le couvre, les deux sont verifies par mutation :

mutation appliquee resultat attendu mesure
retirer le court-circuit ombre (if args.shadow -> if False) rouge FAILED
garder return 0 mais publier quand meme les verdicts rouge FAILED
aucune (code livre) vert 41 passed

Le test porte aussi une assertion sur le registre : si plus aucun garde n'a de
delta_argv, il echoue en disant qu'il n'exerce plus rien -- plutot que de
devenir vert par vacuite.

Portee

Ne touche ni la parite de declencheurs (P1) ni la bascule elle-meme : cette PR
retire a la voie ombre sa capacite a bloquer, y compris quand elle tombe en
panne. Elle ne lui retire pas sa capacite a signaler -- le diagnostic reste
imprime, et l'absence de verdicts reste visible sur la PR.

Adjacence de genre, declaree

prev: MED/guard #12868 -- deux guard consecutifs sur ma lane. Substances
distinctes (conclusion de check-run vs code de retour du job), diagnostiquees
chacune depuis un log de run precis : le litmus LIGHT ne s'applique pas, on
n'en genere pas une douzaine en scannant l'instance suivante. Je le declare
plutot que de le maquiller en deux genres.

See #11835

Second mecanisme de blocage par la phase ombre, distinct de celui ferme par
#12868. Celui-la ne passe pas par les check-runs mais par le CODE DE RETOUR
du job.

Quand l'arbre n'est pas revenu a son etat apres la bascule base/HEAD, la voie
ombre refuse de publier des verdicts -- c'est correct, ils porteraient sur un
arbre dont on ne sait plus ce qu'il contient. Mais elle le faisait par
`raise SystemExit(...)`, donc exit 1. Or le check du job s'appelle
`Fast lane (ombre) -- N gardes, 1 checkout`, qui ne contient pas `advisory` :
`pr_gate` le compte comme un defaut et BLOQUE la PR.

Une panne de la voie ombre bloquait donc une PR saine -- exactement ce que la
phase pilote promet de ne pas faire.

Mesure : #12820 etait retenue par ce seul chemin (run 32774643069, 45 checks
verts, aucun defaut propre), en plus de son `PR gate` perime.

Correctif : en mode ombre, imprimer le diagnostic sur stderr et rendre 0.
Le fail-closed est PRESERVE dans les deux modes -- aucun verdict n'est publie.
Hors ombre, l'arret net est inchange.

Tests, deux moities et un controle positif :
  - l'ombre rend 0 ET ne publie rien (un test qui ne verifierait que le code
    de retour laisserait passer un correctif publiant des verdicts faux) ;
  - hors ombre, `SystemExit` est toujours levee -- sans quoi un correctif
    rendant 0 dans les deux modes desarmerait la voie rapide le jour de sa
    bascule, en passant pour un deblocage.

Les deux tests sont verifies par MUTATION : retirer le court-circuit ombre,
puis le faire publier quand meme, font rougir le test dans les deux cas. Un
test qui n'atteindrait pas le chemin passerait vert tout aussi bien.

  python -m pytest scripts/tests/test_fast_lane.py -q  ->  41 passed

Grain: MED/guard - lane myia-ai-01:CoursIA - prev: MED/guard #12868

See #11835
Co-Authored-By: Claude-Code <noreply@anthropic.com>
@jsboige
jsboige merged commit 4822270 into main Aug 25, 2026
23 of 26 checks passed
@github-actions github-actions Bot added variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) variation-genre-run >= 2 grains consecutifs du meme genre LIGHT pour la lane (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) labels Aug 25, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-ai-01:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-08-25) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=0 genre=2 cap=1)
  • GENRE-RUN : run consecutif d'un genre LIGHT (voir signals.runs dans le log du job)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=0 genre=2 cap=1)

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions github-actions Bot added the variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Aug 25, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-3 : deux grains LIGHT du meme genre consecutifs -- bloquant (#11170).

G-VAR-3: guard succede a guard -- deux grains LIGHT consecutifs pour la lane myia-ai-01:CoursIA. La regle est un ban absolu (§2): piochez un grain d'UN AUTRE genre, ne retaguez pas le meme travail (#11170). Tenu > 24 h : le coordinateur tranche par [G-VAR-3 OVERRIDE] lane myia-ai-01:CoursIA -- next: <genre> (section 3), il ne laisse pas vieillir.

variation-protocol.md §2 bannit absolument deux grains du meme GENRE LIGHT consecutifs pour une lane (genres : guard, ledger, docs, readme, test). Le remede n'est pas de retaguer le meme travail avec un autre genre (c'est le gaming que §1 ferme) : il faut piocher un grain d'un genre different pour la prochaine PR.

Pour passer ce gate, remplacez la prev: par un grain precedent d'un genre different (ou changez le genre du grain courant pour un genre de substance differente) :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<genre-different> #<PR>

@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-ai-01:CoursIA a deja consomme son budget LIGHT du jour (#? (merge a ?)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@jsboige
jsboige deleted the fix/12869-ombre-job-neutre branch September 2, 2026 13:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) variation-genre-run >= 2 grains consecutifs du meme genre LIGHT pour la lane (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant