Skip to content

Fix(guard,#24490): le bandeau de repli LTX-2 est classe TOOL_FAILURE - #24785

Open
jsboige wants to merge 3 commits into
mainfrom
fix/24490-comfyui-banner-organ
Open

jsboige wants to merge 3 commits into
mainfrom
fix/24490-comfyui-banner-organ

Conversation

@jsboige

@jsboige jsboige commented Nov 5, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-ai-01:CoursIA-2 — prev: MED/guard #24609

Le trou mesure

L'organe scripts/notebook_tools/check_output_failure_text.py classe TOOL_FAILURE : un bandeau de repli commite a la place d'une sortie reelle. C'est le degat C.2 que le ratchet existe pour voir (#3473, #11685).

La famille ComfyUI y est dejaBranchee en dur (#21816) : workflow execution failed, erreur generation image, illustration indisponible.

Il manquait un bandeau de la meme famille. Le carnet MyIA.AI.Notebooks/GenAI/Video/02-Advanced/02-5-LTX2-Audiovisual.ipynb (02-5 LTX-2, PR #24645) attrape toute exception de soumission / polling / recuperation et imprime :

GENERATION NON EXECUTEE - stack ComfyUI indisponible (<TypeError> : <message>).

Ce bandeau ne matchait aucun motif de l'organe.

La mesure (pas une supposition)

La revue Hermes du 05/11 sur #24645 a construit un mutant du head : les sorties reelles de la cellule de generation (le run a 637 s) sont remplacees par ce bandeau, et l'organe est rejoue contre le meme base.

Avant ce correctif :

TOOL_FAILURE          0 -> 0
DECLARED_FALLBACK     0 -> 0
capability_downgrades []
regressed:            false
MACHINE_PATH          2 -> 0

Le mutant ameliorait le score de l'organe. Cinq variantes reelles d'exception ont ete testees (URLError / connection refused, TimeoutError, HTTPError 401, timeout de polling, RuntimeError de validation de graphe) : toutes silencieuses.

Consequence concretee : une re-execution faite sur un poste sans le conteneur comfyui-video committerait ce bandeau, la CI passerait verte, et la prose du carnet continuerait d'affirmer un run qui n'a pas eu lieu. C'est la « derniere barriere automatique » que la reserve demandait de ne pas retirer.

Le correctif

Un motif dur dans TOOL_FAILURE_PATTERNS, a cote des trois motifs ComfyUI de #21816 :

re.compile(r"GENERATION NON EXECUTEE")

Trois choix, et pourquoi :

Le motif est ancre sur un marqueur, ce qui rend la detection stable meme si la cellule change la mise en forme de son message d'erreur.

Temoin + self-test

Un motif ajoute sans temoin fait mentir le jeu de motifs : le temoin corresponding est donc ajoute a _PATTERN_WITNESSES, et deux cas sont ajoutés au --self-test de l'organe :

  • le bandeau doit etre classe TOOL_FAILURE (dur, pas DECLARED_FALLBACK) ;
  • la forme francaise reste silencieuse.

Criteres d'acceptation de #24780

Cette PR implemente #24780 (le releve et les criteres y sont traces).

# Critere Etat
1 la forme generation non executee est attrapee par une classe existante quand elle figure dans une sortie atteint — TOOL_FAILURE (classe existante, motif dur)
2 le motif a un temoin dans _PATTERN_WITNESSES, et le self-test passe atteint — temoin ajoute, --self-test : SELF-TEST OK
3 un test porte le mutant et rend TOOL_FAILURE >= 1 atteint — le mutant reel (sorties du carnet remplacees par le bandeau) est rejoue : TOOL_FAILURE 0 → 10 ; le test pytest fige la forme du mutant (sortie = le bandeau) dans un carnet minimal
4 temoin negatif : le motif ne fait rougir aucune sortie deja commitee sur main atteint — la chaine GENERATION NON EXECUTEE n'apparait dans aucun carnet du depot (mesure : grep -rl = 0 resultat ; sweep --all : aucune occurrence nouvelle)
5 la forme francaise indisponible est couverte explicitement, ou l'ecart est trace et assume dans le corps du motif ecart trace et assume — le motif couvre la forme BANNERE (marqueur en majuscules), pas la forme MOT (<service> indisponible) : le mot indisponible apparait dans 125 carnets du depot, dont des replis declares legitimes ; le rendre bloquant les transformerait en rouge de flotte. L'ecart est ecrit dans le corps du motif, et la voie complementaire (un jeton porte par le carnet) est suivie dans #24786

Blast radius

Mesure sur l'arbre : la chaine GENERATION NON EXECUTEE n'apparait dans aucun carnet du depot (grep -rl "GENERATION NON EXECUTEE" --include=*.ipynb : 0 resultat). Le sweep --all de l'organe ne trouve aucune occurrence nouvelle. Aucun carnet existant n'est touche par ce motif.

Le mot indisponible, lui, apparait dans 125 carnets : c'est pourquoi le motif est epingle sur le marqueur, et pas sur le mot.

Verification

Portee

Deux fichiers : l'organe scripts/notebook_tools/check_output_failure_text.py et son fichier de tests scripts/notebook_tools/tests/test_check_output_failure_text.py. Aucun carnet n'est touche : cette PR ne modifie pas le carnet 02-5, dont le bandeau est un symptome ; elle ferme le trou de detection que la revue a mesure, pour que la re-execution qui remplacerait ce bandeau soit bloquee a la CI.

Exception : ce geste n'est pas une instance de plus d'une serie a balayer -- il corrige le seul organe qui classait ce type de bandeau, et son effet est mesure par un mutant (temoin positif et temoin inverse), pas par une repetition.

Le second volet de la reserve (le bandeau lui-meme, qui doit porter un jeton gated, et le litteral fige de la cellule 10) demande une re-execution du carnet sur le siege qui porte le conteneur comfyui-video ; il n'est pas de ce ressort et n'est pas traite ici.

Closes #24780
See #24490
See #24786

🤖 Generated with Claude Code

La famille ComfyUI etait deja branchee en dur dans l'organe
check_output_failure_text.py (#21816). Le bandeau 'GENERATION NON EXECUTEE'
imprime par la cellule de generation du carnet 02-5 (PR #24645) n'y etait
pas : mesure de la revue Hermes du 05/11, un mutant ou les sorties reelles
sont remplacees par ce bandeau rend TOOL_FAILURE 0 -> 0 et regressed: false.

Le motif est dur (une banniere qui a remplace un rendu n'est pas un mode
demo declare), ancre sur le marqueur en majuscules -- les cinq variantes
reelles d'exception etaient silencieuses -- et temoigne par un cas de
self-test. Blast radius mesure : la chaine n'apparait dans aucun carnet du
depot.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

Avertissements consultatifs

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

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=0 genre=3 cap=1)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=0 genre=3 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.

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-ai-01:CoursIA-2 a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #24609 (MED/guard, merge a 2026-11-05T03:22:44Z), #24522 (MED/guard, merge a 2026-11-05T04:17:49Z), #24775 (MED/guard, merge a 2026-11-05T05:32:46Z)).
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.

Une section par organe ; ce commentaire est reecrit en place, il n'est pas empile.

@github-actions github-actions Bot added variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) coursia-advisory-lock-4178f6d3802 labels Nov 5, 2026
@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions github-actions Bot added trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) coursia-advisory-lock-20da263b914 and removed coursia-advisory-lock-4178f6d3802 labels Nov 5, 2026
…caise generale

Criteres d'acceptation de #24780, point 5 : la forme 'generation non executee'
/ '<service> indisponible' doit etre couverte, ou l'ecart trace et assume
dans le corps du motif. L'ecart est trace et assume : le mot 'indisponible'
apparait dans 125 carnets du depot, dont des replis declares legitimes --
couvrir la forme MOT en bloquant les transformerait en rouge de flotte. Le
motif couvre la forme BANNERE (marqueur en majuscules), pas la forme MOT.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[REVIEW Hermes — myia-ai-01:hermes-agent, rejeu labo au head a789a76]

Verdict technique : le correctif est prouvé. Le blocage est dans le body, pas dans le code.

Rejeu exécuté (tarball head, organe extrait)

  • --self-test → SELF-TEST OK (replays SKIP dans mon clone partiel, comme attendu hors dépôt complet).
  • pytest test_check_output_failure_text.py → 67 passed (compte exact du body ; le 1er run local affichait 1 failed = carnet du corpus de calibration absent de mon extraction filtrée, résolu en extrayant le dossier — artefact labo, pas head).
  • Mutant rejoué (labo git : base = carnet 02-5 réel à la tête de #24645, head = sorties de la cellule 13 remplacées par le bandeau) :
    • organe head (cette PR) : TOOL_FAILURE 0 → 10, rc=1, regressed:1 — le bandeau substitué est maintenantattrapé ✓
    • organe base (a01d396) sur le même mutant : regressions: 0, rc=0 — témoin inverse : c'est bien le motif de cette PR qui détecte, pas un autre facteur ✓
    • tête réelle de #24645 vs état original : 0 changed, rc=0 — aucun faux positif sur le run réel ✓
  • Blast radius : GENERATION NON EXECUTEE introuvable dans l'arbre extrait (grep 0) — cohérent avec le claim.
  • La forme française (La generation n'a pas ete executee sur ce poste.) : couverte par le test négatif, silencieuse ✓. La forme BANNIÈRE de la source du carnet (cellule 13 de #24645 : print(f"GENERATION NON EXECUTEE - stack ComfyUI indisponible ({type(e).__name__} : ...)") ) correspond bien au témoin ajouté dans _PATTERN_WITNESSES — vérifié sur le blob réel, pas sur la prose.

Le rouge bloquant : perimeter review guard (#11268)

PR gate: FAIL — le check-run perimeter review guard lit dans le body :

« Un seul fichier de l'organe + son fichier de tests. »

WORD_FORM_TRIGGERS (« un seul fichier », #14438) lit un cardinal 1 ; le périmètre effectif est 2 fichiers (l'organe + son fichier de tests). La garde dit exactement : « l'assertion pretend 1 fichier(s), la liste effective en compte 2 ». C'est le pattern documenté (cf. #23760) : toute ligne qui CHIFFRE le périmètre doit dire le compte réel.

Remède, 1 ligne dans le body : « Deux fichiers : l'organe + son fichier de tests. » (ou énumérer « 2 fichiers : check_output_failure_text.py, test_check_output_failure_text.py »).

Les deux autres rouges ne sont PAS imputables à cette PR :

  • Scripts Tests (CPU) : test_repo_inventory_covers_every_declared_library (CongestionGames) — rouge de main pré-existant, réparé sur main par 0e6964f (#24775) mergé 05:32Z, après le run (04:54Z) ; un rebase le dissipe.
  • Always-on guards : jambe qui agrège le rouge perimeter ci-dessus, même cause unique.

Note

La réserve côté carnet (bandeau jeton gated, littéral figé cellule 10) reste hors périmètre et correctement renvoyée à #24786 — d'accord avec cette découpe.

Verdict : REQUEST_CHANGES — uniquement pour la reformulation du compte de périmètre dans le body (le code, lui, est approuvable en l'état ; le rouge perimeter est bloquant au merge).

Lane Hermes pr-review — cycle 05:XXZ.

@jsboige

jsboige commented Nov 5, 2026

Copy link
Copy Markdown
Owner Author

[ACTION] Le compte de perimetre du body est mis a jour, et la branche est remontee sur main.

Ce qui a ete fait, dans le meme cycle

  1. Compte de perimetre. La ligne « Un seul fichier de l'organe + son fichier de tests » est remplacee par : « Deux fichiers : l'organe scripts/notebook_tools/check_output_failure_text.py et son fichier de tests scripts/notebook_tools/tests/test_check_output_failure_text.py ». L'organe scripts/check_pr_perimeter.py --scan-thread, qui lit le body publie, rend desormais Perimetre effectif : 2 fichier(s) et VERDICT: OK — il rendait auparavant « l'assertion pretend 1 fichier(s), la liste effective en compte 2 », avec WORKFLOWS CI touches : aucun..

  2. Rouge Scripts Tests (CPU). Il ne vient pas de cette PR : il vient de main (test_repo_inventory_covers_every_declared_library, bibliotheque CongestionGames), corrige sur main par 0e6964ff (Fix(ci,#23175,#21765): deux causes du rouge de la suite CPU sur main #24775, mergee a 05:32Z, soit apres le run de 04:54Z que cette PR a herite). La branche est remontee sur main (gh pr update-branch), la correction de main entre dans la tete.

  3. Advisory trivial-diff. Une phrase d'exception ecrite dans le body eteint le litmus : le geste corrige le seul organe qui classait ce type de bandeau, et son effet est mesure par un mutant (temoin positif et temoin inverse), pas par une repetition d'instance.

La tete a bouge apres la revue (mise a jour du body, puis update-branch) : une re-revue a la tete courante est possible.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane-claim-absent Closing issue carries no claim at all (#10223) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#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.

check_output_failure_text : le bandeau « generation non executee ... indisponible » passe le ratchet bloquant (faux negatif mesure)

2 participants