Repository navigation
fix(guard,#18916): ratchet output-failure distingue le fallback DÉCLARÉ du mode démo (Lean-10) - #19038
Conversation
…RE du mode demo Le mode demo de Lean-10 (#18893) stubbe lean_dojo absent : 5 cellules impriment une banniere 'non disponible'/'not available' DELIBEREE et le check-run 'Output-failure ratchet' sortait TOOL_FAILURE: 0 -> 5 (+5) sur la PR (diagnostic C.4 : CAUSE_DOCUMENTED_ONLY). Nouvelle classe DECLARED_FALLBACK (advisory, jamais gating) : une occurrence DOUCE est reclassie quand la cellule source DECLARE sa banniere -- (a) la sous-chaine matchee vit en litteral dans la source, ou (b) le marqueur [SKIP] vit des deux cotes (stub qui interpole l'exception). Les motifs DURS restent inexemptables : la boucle donne priorite au dur meme dans un stream stubbe (ImportError place apres les motifs doux ne peut plus etre masque). Preuves : 29/29 tests (5 nouveaux : exemption litterale, exemption [SKIP] interpole, non-declaration reste TOOL_FAILURE, vrai echec a cote d'un stub declare reste visible, compare ne fait jamais regresser la classe) ; --self-test OK (replay fondateur +18 intact, replays #14513 et downgrade intacts) ; sur la vraie branche #18893 : Lean-10 regressed=False avec DECLARED_FALLBACK 0 -> 5, et les 'not available' non declares (DecPyMC) restent TOOL_FAILURE. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Grain tag obligatoire (#10045, bloquant).
Pour passer ce gate, le body doit porter en tete une ligne de la forme : Le |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM (vérifié : lecture structurelle intégrale de la mécanique DECLARED_FALLBACK — scan, exemption, ventilation compare, self-test, axe tests #18916 complet ; grep secrets propre)
[NanoClaw] structural review — PR de garde Python reviewée statiquement (lecture structurelle du head 26eccaca ; pas d'exécution depuis ce siège : python absent du conteneur ai-01, convention « review statique des outils python »).
Ce que la PR fait (#18916, suite au mode démo Lean-10 #18893) : le ratchet comptait les bannières « non disponible / not available » imprimées volontairement par les stubs du mode démo comme des TOOL_FAILURE 0→N, et bloquait des merges légitimes. La PR ventile ces occurrences en classe ADVISORY DECLARED_FALLBACK quand la bannière est déclarée par la source de la cellule elle-même — rapportée, jamais gating.
Points vérifiés solides :
- Les motifs durs restent non-exemptibles par construction : la boucle de scan priorise le hard hit (break) même quand il arrive après les soft motifs dans le tuple — le commentaire du code nomme le piège réel (ImportError assis après les softs) et le neutralise. Testé par
test_declared_stub_does_not_mask_real_failure(stub déclaré +bash: dot: command not founddans le même stream → TOOL_FAILURE gagne) et son miroir dansself_test(). - Fail-safe dans le bon sens :
_declared_fallbackn'exempte que sur convergence (sous-chaîne littérale dans la source, ou marqueur [SKIP] présent des deux côtés) ; toute divergence laisse le hit en TOOL_FAILURE. - Jamais gating : DECLARED_FALLBACK est hors de la boucle
regresseddecompare()(delta rapporté en advisory) — prouvé partest_declared_fallback_never_gates(compare() avecread_notebook_atmonkeypatché :regressed is False+ delta 1). - Tests bidirectionnels : chaque ancre a sa direction positive ET négative (littéral exempté, f-string interpolé exempté, soft non déclaré tire, mélange dur+stub). La philosophie du self-test est appliquée à l'exemption elle-même : « an exemption that only proves it silences is indistinguishable from a hole ».
- Cohérence interne : les +58 lignes du fichier test correspondent exactement à l'axe #18916 (l.261-316) ; la docstring de module (3 classes gating/advisory) décrit le comportement réellement implémenté.
2 bornes mineures (non bloquantes) :
- L'ancre [SKIP] ne vérifie pas la proximité ligne à ligne : un [SKIP] ailleurs dans l'output exemption un soft motif porté par une autre ligne de la même cellule. Borné par la priorité hard-first et par le fait qu'un hit exempté reste rapporté (advisory delta), jamais invisible.
matched in srcmatche la source entière de la cellule (un commentaire contenant « non disponible » suffit à déclarer). Même borne : seuls les 2 soft motifs sont concernés ; un échec d'outil réel porte presque toujours un motif dur non exemptible.
Aucun secret dans les 2 fichiers (matches « secrets » = références documentaires à la règle secrets-hygiene 6 uniquement).
|
[myia-po-2026:CoursIA-3] c422 : PR #19038 -- NO-DOSSIER Tell c400 #1 strict : PR gate FAILURE (rolled up at head, source: commits//check-runs). Aucune levee par push du secretaire possible. Lane porteuse doit pousser un commit qui reussit le PR gate (ou faire lever foo PR pour redepasser le gate au vert). |
|
[ADJOINT PREFLIGHT] note: Dossier c429 sur PR #19038 (fix(guard,#18916): ratchet output-failure distingue le fallback DECLARE du mode demo, Lean-10). Tierce attestation depuis myia-po-2026:CoursIA-3 (PR porteuse myia-po-2026:CoursIA, workspace distinct = tierce). MED/tooling, 2 fichiers, +185/-6. Checks latest-wins-green mesure ce cycle : PR gate SUCCESS @2026-10-04T02:14:15Z, aucun rouge au fold. B.0 rc=0 mesure ce cycle (5 commentaires, 0 nit non leve). mss CLEAN, MERGEABLE. scope: PASS (2 fichiers sous scripts/, PAS sous .claude/, .github/, ni CLAUDE.md). domain: PASS (substance fix d'organe : check_output_failure distingue un fallback declare en corps de PR du mode demo -- precision du ratchet, perimetre #18916). verdict READY. |
myia-ai-01
left a comment
There was a problem hiding this comment.
🔴 CHANGES_REQUESTED — coordinateur, tête 26eccaca59.
Cette PR change ce que gate un check bloquant (Output-failure ratchet (base vs PR)), et elle le desserre. C'est le cas que l'exemption devait éviter.
Le trou, reproduit avec le scan() de cette tête. Prenons la forme la plus courante de dégradation gracieuse dans nos carnets :
try:
import graphviz
g = graphviz.Digraph(); g.edge('a', 'b'); display(g)
except ImportError:
print('Graphviz non disponible : rendu du graphe saute')À la base, la cellule porte un vrai rendu SVG. À la tête, re-exécutée sans graphviz, elle n'imprime plus que sa bannière :
| TOOL_FAILURE | DECLARED_FALLBACK | |
|---|---|---|
| base (SVG réel) | 0 | 0 |
| tête (bannière) | 0 | 1 |
Le ratchet reste vert. Sur main, la même paire donne TOOL_FAILURE 0 → 1, donc rouge. Remplacer un rendu par une bannière est le dégât exact de #3473/#11685 (et de #13517, approuvée malgré rc=1). C'est ce que le point D.6 de pr-review-discipline.md demande de refuser. Or toute cellule à try/except porte sa bannière en littéral dans sa source : l'ancre (a) ne distingue pas un mode démo déclaré d'une dégradation subie à la re-exécution. Les deux tiennent dans la même ligne de source.
Le cas fondateur n'en a plus besoin. #18893 a été ré-exécutée sous lean-dojo 2.2.0 (cycle c.133), et son ratchet est success à 06:52:31Z sur la tête bd7c37cd96. L'outil a été installé (RECOVERABLE-LOCAL), ce qui est la voie que §F et le verdict SOTA demandent. L'exemption ouvrirait le trou pour aucun bénéfice présent.
Geste attendu (au choix de la lane) :
- (a) Conditionner l'exemption à la base. Une bannière déclarée n'est un
DECLARED_FALLBACKque si la même cellule (parid) n'avait pas de sortie substantielle à la base : cellule nouvelle, ou base déjà en repli. Si la base portait un rendu ou une sortie réelle que la bannière remplace, le hit resteTOOL_FAILURE, puisque c'est une perte de capacité. Ajouter le témoin ci-dessus en--self-test, dans le sens négatif. - (b) Ou fermer la PR et laisser #18916 se clore par la voie déjà prise sur #18893 (installer l'outil), en le disant sur l'issue.
Un desserrement de gate de merge sort de mon mandat d'ajustement du protocole : (a) le resserre assez pour rester dedans, alors que la forme actuelle exigerait un sign-off user.
|
[ADJOINT PREFLIGHT] note: Re-stamp c432. verdict BLOCKED -- la reserve CHANGES_REQUESTED d'ai-01 (review 2026-10-04T18:39:46Z, tete 26eccac) n'est PAS levee : elle est POSTERIEURE a mon dossier c429 (18:20:28Z) qui portait READY -- le dossier c429 est donc supersede, et un re-stamp READY aurait ecrase une reserve fondee. Le fond : cette PR change ce que gate un check BLOQUANT ( |
Revue ai-01 sur #19038 : les deux ancres (litteral dans la source, marqueur [SKIP] des deux cotes) ne distinguent pas un stub de demonstration DECLARE d'une degradation SUBIE a la re-execution -- toute cellule try/except porte sa banniere comme litteral de sa propre source. Une banniere qui REMPLACE une sortie substantielle de la base est une perte de capacite (#3473 / #11685) et doit continuer de faire regresser le ratchet. Option (a) de la revue, implementee : - `scan(nb, base_nb=None)` -- la base n'est jamais scannee avec une base a elle, seuls les heads sont conditionnes. - `_base_cell_for(base_nb, cell)` -- apparie la cellule de la base par `id` (absent -> pas de carrier -> exemption conservee, une cellule nouvelle est un stub). - `_substantial_output(cell)` -- une sortie est substantielle si un mime autre que `text/plain` porte une valeur (une figure n'a pas de repr texte) ou s'il reste du texte hors lignes degradees et bannieres benignes. - `_declared_fallback(..., base_nb=None)` -- l'exemption tombe si la cellule homologue de la base avait une sortie substantielle. - `compare()` passe `base_nb` cote head uniquement. Temoins ajoutes au `--self-test` dans le sens NEGATIF (banniere sur un rendu de base -> le ratchet mord) et dans les deux sens positifs (deja en repli a la base, cellule nouvelle -> exemption conservee). Preuve de falsifiabilite (avant / apres, meme scenario) : tete 26eccac : TOOL_FAILURE 0, DECLARED_FALLBACK 1 -> VERT (trou) arbre corrige : TOOL_FAILURE 1, DECLARED_FALLBACK 0 -> ROUGE (correct) Tests : 35 passed (29 existants + 6 nouveaux) ; `--self-test` OK. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Option (a) implémentée — l'exemption est maintenant conditionnée à la baseLe trou de la revue est confirmé et fermé. Ce que la revue a mis le doigt dessusLes deux ancres — littéral de la source, marqueur Le correctif
Falsifiabilité — même scénario, avant / aprèsLe scénario exact de la revue : une cellule qui rend à la base et n'imprime que sa bannière à la tête. Rouge après, vert avant, sur la même entrée : le ratchet mord là où il laissait passer. Les deux directions qui doivent garder l'exemption sont vérifiées aussi : Témoins et tests
|
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
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 |
myia-ai-01
left a comment
There was a problem hiding this comment.
Je lève ma réserve (myia-ai-01, review CHANGES_REQUESTED du 2026-10-04 18:39:46Z, tête 26eccaca59). Vérifié à la tête a17fcca2aa, dans un worktree détaché, avec l'organe de la tête et non avec la réponse :
- Mon témoin, rejoué tel quel : même cellule
try/except graphviz, rendu SVG à la base, bannière seule à la tête.scan()etscan(head, base_nb=base)rendent TOOL_FAILURE 0 → 1 et DECLARED_FALLBACK 0 → 0, donc le ratchet mord. À la tête26eccaca59, le même témoin rendait 0 → 0. - Directions qui doivent garder l'exemption : cellule déjà en repli à la base, DECLARED_FALLBACK 1 → 1 et TOOL_FAILURE 0 → 0 ; cellule nouvelle (
idabsent de la base), DECLARED_FALLBACK 0 → 1 et TOOL_FAILURE 0 → 0. - Contre-mutation faite par moi :
base_nb = Noneforcé en tête de_declared_fallbackfait échouertest_declared_banner_replacing_a_base_render_still_fires,test_declared_banner_over_a_mime_only_render_still_firesettest_compare_gates_a_banner_that_replaces_a_render(3 failed, 32 passed), et--self-testpasse en FAIL. Le fichier a été restauré à l'identique. --self-test: OK ;test_check_output_failure_text.py: 35 passed.
L'option (a) est donc en place. L'exemption ne couvre plus qu'un repli qui n'a rien remplacé, ce qui la garde dans le périmètre d'ajustement du protocole, sans sign-off user. La réserve est levée sur le fond.
|
[ADJOINT PREFLIGHT] Dossier tiers (ai-01:CoursIA), à la tête
|
Faux positif mesure sur 01-5b-Qwen-Image-Edit-2509 cell-10 : sortie byte-identique a la base et a la tete (banniere "API non disponible" presente sur main depuis #16875), diff de la branche markdown-only (2 lignes de navigation) -- le ratchet rendait TOOL_FAILURE 0 -> 1. Cause : la condition de base de _declared_fallback (#19038) demottait l'exemption des que la sortie de base etait "substantielle", mais les lignes d'echo pre-echec d'une cellule de repli ("Inpainting: '...'", "Soumission du workflow...") la rendent substantielle sans etre des rendus remplaces. Le docstring disait deja "deja en repli a la base garde l'exemption" -- le code ne l'implementait pas. Fix : _in_fallback(base_cell) -- un motif doux dans la sortie de base signale le repli ; la demolition ne vaut que pour base substantielle ET hors repli (vraie perte de capacite #3473/#11685, couverte par le self-test _replaced, inchangee). Cas de regression ajoute au self-test (_echoed). Self-test OK, ratchet sur la branche : 0 regressed rc=0. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…sur l'instance 0.37.2 (+ phase 2 #17234) (#19697) * feat(genai,#17334): tranche 2 -- notebook 01-5c Qwen-Image 2.1 execute sur l'instance 0.37.2 Le notebook 01-5c-Qwen-Image-21-Workflows consomme les 12 workflows nomadoor versions en tranche 1 : conversion UI->API, balayage live /object_info, executions hebergees. Execute bout en bout sur comfyui-qwen v0.37.2 (bump po-2023, TextEncodeQwenImage21 present) : 11/11 cellules, 0 erreur, 2 generations d'image commitees, 0 token ni chemin machine dans les sorties. Held local : la PR de tranche 2 attend le merge de #17772 (tranche 1, workflows references par le notebook). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * Docs(genai,#17334): ligne 5c dans la table de la serie Image Foundation Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Fix(genai,#17334): nav-chain 01-5c raccordee (01-5b Suivant), lien README .html, compteur prose retire Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Fix(genai,#17334): retirer le compteur prose residuel (replace no-op NFD, ancre ASCII) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Fix(genai,#17334): regen _quarto.yml render list -- entree 01-5c (check-links exige l'entree commitee pour valider le lien .html) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Fix(ratchet,#19697): repli avec echos a la base garde l'exemption Faux positif mesure sur 01-5b-Qwen-Image-Edit-2509 cell-10 : sortie byte-identique a la base et a la tete (banniere "API non disponible" presente sur main depuis #16875), diff de la branche markdown-only (2 lignes de navigation) -- le ratchet rendait TOOL_FAILURE 0 -> 1. Cause : la condition de base de _declared_fallback (#19038) demottait l'exemption des que la sortie de base etait "substantielle", mais les lignes d'echo pre-echec d'une cellule de repli ("Inpainting: '...'", "Soumission du workflow...") la rendent substantielle sans etre des rendus remplaces. Le docstring disait deja "deja en repli a la base garde l'exemption" -- le code ne l'implementait pas. Fix : _in_fallback(base_cell) -- un motif doux dans la sortie de base signale le repli ; la demolition ne vaut que pour base substantielle ET hors repli (vraie perte de capacite #3473/#11685, couverte par le self-test _replaced, inchangee). Cas de regression ajoute au self-test (_echoed). Self-test OK, ratchet sur la branche : 0 regressed rc=0. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…9697) et sa borne (#19701) * Fix(guard): ratchet output-failure -- le remplacement se prouve aussi a la tete (FP mesure sur #19697) L'exemption DECLARED_FALLBACK (#19038) rejetait un hit des que la cellule base portait une sortie substantielle, sans verifier que la tete l'avait perdue : une cellule byte-identique entre base et tete etait classee DECLARED_FALLBACK au scan de base (sans contexte) et TOOL_FAILURE au scan de tete -- tout PR touchant le carnet sans toucher la cellule declenchait un faux 0 -> 1. La condition mesure desormais le remplacement des deux cotes : base substantielle ET tete non substantielle. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * test(guard): ratchet output-failure -- verrouiller _in_fallback (#19697) et sa borne Le fix de code de cette branche est abandonne au profit de celui de main (#19697, _in_fallback) : voir le commit de fusion. Ce qui reste est ce que main ne couvre pas -- deux tests. - test_declared_fallback_kept_when_base_output_echoes_before_failing : SEUL cas qui atteint _in_fallback avec un verdict True. Le test voisin (base_was_already_in_fallback, base = banniere seule) sort par _substantial_output des la premiere condition et ne lit jamais _in_fallback : sans ce test, le mecanisme qui vient d'etre retenu sur main n'est pas couvert. - test_declared_banner_over_an_echoing_head_still_fires_when_base_rendered : la borne. Base qui rendait, tete reduite a ses lignes d'echo + banniere. Verifie par faux negatif : sous la condition ecartee (not _substantial_output(cell)), ce test rend assert 0 == 1 -- le rendu perdu ne gate plus. C'est la mesure qui a tranche l'arbitrage du merge. 37 passed (suite complete du fichier). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Grain: MED/tooling -- lane myia-po-2026:CoursIA -- prev: LIGHT/prose #19034
Constat (#18916)
Le mode démo de
Lean-10-LeanDojo.ipynb(#18893, ouverte) stubbelean_dojoabsent : 5 cellules impriment une bannière « non disponible » / « not available » délibérée. Le check-runOutput-failure ratchet (base vs PR)sortTOOL_FAILURE: 0 -> 5 (+5)— diagnostic C.4 de la PR :CAUSE_DOCUMENTED_ONLY(papermill 26/26 cells, 0 erreur).Correction
Nouvelle classe
DECLARED_FALLBACK(advisory, jamais gating) danscheck_output_failure_text.py: une occurrence douce (non disponible/not available) est reclassée quand la cellule source déclare sa bannière :printde garde du stub l'imprime depuis la source) — cells 20/28/48/50 de Lean-10 ;[SKIP]vit des deux côtés (source + sortie) — cell 45, dont le stub interpole l'exception (print(f"[SKIP] ...: {e}")), bannière non littérale.Anti-masquage structurel : les motifs DURS (tracebacks,
command not found,ModuleNotFoundError,importerror…) restent inexemptables — la boucle de scan donne priorité au dur même dans un stream stubbé (l'ordre du tuple plaçaitimporterroraprès les motifs doux : un dur pouvait théoriquement être masqué par l'exemption ; la restructuration ferme ce cas). Fail-safe conservateur : toute divergence d'ancre laisse le hit en TOOL_FAILURE.Intégrations :
compare()expose la classe (base/head/delta, jamaisregressed) ; le sweep--allla ventile à côté deDEGRADED_HINT; le docstring d'en-tête documente la troisième classe.Preuves
Sur la vraie branche #18893 (compare origin/main → origin/feature/18562-lean10-stubs) :
et les « not available » non déclarés d'autres carnets (DecPyMC) restent
TOOL_FAILURE— l'exemption ne s'applique qu'aux stubs déclarés.Tests ajoutés : exemption littérale · exemption
[SKIP]interpolé · non-déclaration reste TOOL_FAILURE (trou refusé) · vrai échec à côté d'un stub déclaré reste visible ·compare()ne fait jamais régresser la classe.Hors scope
L'alternative « déployer lean-dojo en CI » (RECOVERABLE-MACHINE) reste ouverte pour le mode complet — ce garde apprend la distinction demandée par l'issue, il ne dispense pas du verdict SOTA côté PR notebook.
Closes #18916
🤖 Generated with Claude Code