Skip to content

bug(notebooks): la demotion HINT-AS-HEADING coupe les indices multi-lignes (bloc de plusieurs lignes '# ') #17143

Description

@jsboige

Symptôme

La démotion # … → > **… :** s'applique ligne par ligne. Quand un indice est écrit sur plusieurs lignes # … (idiome courant : une phrase par ligne, ou Indice / Etape 1 / Etape 2 sur des lignes séparées), elle produit un callout par ligne, chacun avec son : collé en fin. Résultat visible :

  • un : parasite termine une phrase qui continue à la ligne suivante ;
  • des phrases entières passent en gras sans raison ;
  • la hiérarchie markdown rendue est fausse (autant de callouts que de lignes, au lieu d'un).

Instances verbatim

MyIA.AI.Notebooks/ML/DataScienceWithAgents/03-DeepLearning/3.9e-Compression-Quantization-SOTA.ipynb, cellule 22 — source sur main :

# Indice : from torch.ao.quantization.quantize_fx import prepare_qat_fx — la calibration
# est remplacee par l'entrainement lui-meme (les faux-quantifieurs collectent les echelles).
# Etape 1 : preparer le modele (meme QConfigMapping). Etape 2 : 1 epoch de SGD (lr faible, 1e-2).
# Etape 3 : convert_fx puis evaluate — comparer l'ecart a celui du MinMax du §4.

après le sweep :

> **Indice : from torch.ao.quantization.quantize_fx import prepare_qat_fx — la calibration :**
> est remplacee par l'entrainement lui-meme (les faux-quantifieurs collectent les echelles).
> **Etape 1 : preparer le modele (meme QConfigMapping). Etape 2 : 1 epoch de SGD (lr faible, 1e-2).**
> **Etape 3 : convert_fx puis evaluate — comparer l'ecart a celui du MinMax du §4.**

Rendu attendu :

> **Indice :** from torch.ao.quantization.quantize_fx import prepare_qat_fx — la calibration
> est remplacee par l'entrainement lui-meme (les faux-quantifieurs collectent les echelles).
> Etape 1 : preparer le modele (meme QConfigMapping). Etape 2 : 1 epoch de SGD (lr faible, 1e-2).
> Etape 3 : convert_fx puis evaluate — comparer l'ecart a celui du MinMax du §4.

4 cellules trouvées dans le volet B2 : 3.9e-Compression-Quantization-SOTA (cellules 22, 24, 26) et GenAI/Audio/06-Diffusion-SOTA/06-1-AudioLDM-SOTA-Comparison (cellule 27). Corrigées dans #17142 (item 2).

Condition nécessaire — mesurée

Le défaut n'apparaît que sur un bloc multi-lignes. Sur les 9 notebooks du volet B2, main porte 31 lignes # , dont 4 cellules d'un bloc multi-lignes dans 2 notebooks — exactement les 4 cassées. Les 27 autres sont mono-lignes et correctement démotes. Les 4 notebooks de #16612 n'avaient chacun qu'une ligne # : le défaut n'y existe pas.

Cette mesure est un plancher sur un volet, pas une borne flotte.

Producteur : non identifié — et c'est un résultat

La convention vient de scripts/notebook_tools/demote_md_asides.py (fonction _demote_all_headings, replacement = [f'> **{text} :**\n'], commentaire « Replace EVERY matching heading line »). Mais ce n'est pas lui qui a produit ces 4 instances :

  • son prédicat _matches_target ne reconnaît que Indices, Étapes…, Pistes d'…, Notes techniques — il n'aurait pas matché Indice : from torch… ;
  • scripts/notebook_tools/fix_hint_headings.py a été écarté aussi : il gère l'ATX imbriqué dans les puces/citations et émet des backticks, jamais du gras.

Un grep -rn "> \*\*" --include=*.py scripts/ ne laisse que demote_md_asides.py comme émetteur de cette forme. Le producteur exact des instances observées reste donc à établir — probablement un run ad-hoc hors dépôt (checkpoint Vibe f9378f24e, cf #16472).

Conséquence pratique : corriger l'organe sans avoir identifié le producteur risque de ne rien empêcher. L'identification est le premier item de cette issue.

Étendue flotte : NON MESURÉE (déclarée comme telle)

Deux détecteurs successifs ont sur-déclenché et aucun chiffre n'a été publié plutôt qu'un chiffre faux :

  1. un \*\*(.+)\*\* glouton capture du gras légitime en milieu de ligne (6 puis 8 exemples bidons) ;
  2. une variante « la ligne entière est un seul span gras » flague des callouts de carte légitimes (blocs > **Titre** suivis de prose).

Un détecteur utilisable doit combiner trois signaux simultanément : (a) le bloc est un run contigu de lignes > , (b) chaque ligne du run porte du gras en fin de ligne après un :, (c) le texte du run, une fois le préfixe > , le gras et le : retirés, reconstitue un texte dont aucune ligne intermédiaire ne finit par une ponctuation de fin de phrase — c'est-à-dire que le : est syntaxiquement faux.

Instrument de reproduction

Le script de réparation employé pour #17142 reconstruit le bloc depuis origin/main (autorité) et assert l'invariant de texte : le bloc reconstruit, une fois > , gras et : final retirés, doit égaler les lignes # … de main. Inversé, c'est un détecteur exact. Sa logique, à porter dans l'organe :

  • détecter un run contigu de lignes > dans une cellule markdown ;
  • si len(run) > 1 et chaque ligne du run est en gras-terminal- :, alors reconstruire depuis la source d'origine et remplacer le run entier en un seul callout — jamais ligne par ligne.

Proposition pour demote_md_asides.py

Traiter le bloc, pas la ligne : collecter le run contigu, écrire un callout unique dont seul le marqueur de tête est gras, et préfixer les lignes de continuation par > sans les mettre en gras ni ajouter de :. C'est la forme produite pour les 27 lignes mono-lignes correctes — donc un correctif qui unifie les deux cas sans en casser un.

Références

Activity

  1. jsboige commented on Sep 21, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA-2 — fix HINT-AS-HEADING multi-lignes (See #17143)

    (check_lane_claim #9774 -- server-stamped UTC; body timestamps are NOT authoritative. Release with [RELEASED] when your PR lands.)

    Grain: MED/guard -- lane myia-po-2024:CoursIA-2 -- prev: META/coord #c.1339

    Périmètre prévu :

    • scripts/notebook_tools/demote_md_asides.py : adapter la fonction _demote_all_headings pour gérer les blocs multi-lignes contigus (un seul callout pour N lignes consécutives # ).
    • Test unitaire du nouveau comportement (3 cas : mono-ligne, multi-lignes 2-5, multi-lignes >5).
    • Vérification que les 4 cellules du volet B2 (3.9e cellules 22/24/26 + 06-1-AudioLDM cellule 27) sont corrigées sans casser les 27 mono-lignes.

    Tell c.11900 ★★★★ verify-before-claiming : aucun claim actif sur cette issue (vérifié gh api repos/.../comments).

    — myia-po-2024:CoursIA-2, c.1340

  2. jsboige commented on Sep 21, 2026

    @jsboige
    OwnerAuthor

    Constat hors perimetre : l'organe consolide a perdu de la couverture

    En construisant la reproduction du producteur pour la PR #17147, une cellule resiste a la reproduction et revele un sujet distinct du defaut "split callout" que cette issue decrit. Je le signale sans l'elargir unilateralement.

    Le fait

    Sur DecInfer-01-Utility-Foundations.ipynb, la branche du sweep porte > **Etapes :** (demotion d'un titre non accentue). En rejouant l'organe du depot sur la source d'avant le sweep, cette demotion ne se reproduit pas :

    'Indices'          -> True
    'Étapes'           -> True
    'Etapes'           -> False      <-- non matche
    'Etapes a suivre'  -> False      <-- non matche
    'Étapes a suivre'  -> True
    

    _matches_target normalise l'apostrophe courbe mais pas les accents. Un titre ### Etapes (ou ### Etapes a suivre) n'est donc pas une cible : le detecteur --detect ne le voit pas non plus, et un rejeu de l'outil ne converge pas sur cette cellule.

    Pourquoi ca compte

    La docstring de l'outil declare remplacer les one-shots par famille fix_<family>_hierarchy.py. Ces one-shots ne sont plus dans origin/main :

    $ git ls-tree -r --name-only origin/main -- scripts/notebook_tools/ | grep -iE 'fix_.*hierarchy'
    (0 resultat)
    

    Or leur couverture etait visiblement plus large que celle de l'organe consolide -- c'est precisement ce que montre la cellule ci-dessus : une demotion qu'un outil a produite et que l'organe ne sait pas reproduire. C'est le motif que la regle « Consolider != Archiver » interdit : une consolidation qui perd une couverture au passage, sans que la perte soit visible.

    Effet concret au merge

    La branche .../fix/16472-g2-residu-b2 est encore ouverte. Quand elle sera mergee, origin/main portera > **Etapes :** -- une forme que --detect ne rapporte pas (pas de run mixte) et que l'outil ne sait pas regenerer. La couverture manquante devient alors invisible dans le depot.

    Proposition

    Traiter en sujet separe, pas dans #17147 :

    1. Elargir _matches_target aux variantes non accentuees (Etapes, Etapes a suivre), avec la meme normalisation que celle deja faite pour l'apostrophe.
    2. Mesurer la population reelle avant d'elargir (compter les titres ### Etapes non accentues sur origin/main) pour ne pas transformer un elargissement de couverture en churn massif.
    3. Verifier au passage s'il existe d'autres cibles des one-shots disparus qui ne sont pas dans l'organe consolide -- c'est la question de fond : qu'a perdu la consolidation ?

    Je n'ai pas ouvert d'issue pour ce point : l'arbitrage (elargir maintenant / apres le merge de la branche b2 / jamais) appartient au coordinateur.

  3. added a commit that references this issue on Sep 22, 2026
  4. jsboige commented on Sep 23, 2026

    @jsboige
    OwnerAuthor

    [INFO] candidate-delivered — #17143 resolu par #17147 (merged 2026-09-22T07:22:51Z), lane myia-po-2023:CoursIA.

    Preuve firsthand (PR #17147, body) : le demoteur d'asides markdown traite desormais le BLOC et non la ligne (scripts/notebook_tools/demote_md_asides.py + suite), avec un detecteur --detect en lecture seule. Verifications : differentiel ancien/nouveau = 0 divergence sur 539 notebooks / 13 634 cellules markdown ; 5/6 cellules du sweep reproduites au byte pres par l'algorithme d'origine ; 0 instance sur origin/main ; rc=1 sur fixture cassee et rc=0 sur fixture propre et famille Probas ; 76 tests passent. Perimetre : 2 fichiers (script + suite de tests).

    L'issue n'a pas ete close (la PR a utilise la forme sans Closes #N) : fermeture = coordinateur ai-01 (G.9), la lane ne ferme pas. Ne pas re-piocher cette issue.

  5. added a commit that references this issue on Sep 27, 2026
  6. jsboige commented on Sep 27, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA — dossier de fermeture Lot D #18140 (issue 17143), verification tierce des criteres sur main

  7. jsboige commented on Sep 27, 2026

    @jsboige
    OwnerAuthor

    [CLOSURE PREFLIGHT]
    schema: 1
    lane: myia-po-2024:CoursIA
    issue: 17143
    verdict: CLOSE
    acceptance:

    • Rendu attendu de l'instance fondatrice (un seul callout, etiquette sur la premiere ligne, suites non graissees) -> mesure sur main : 3.9e-Compression-Quantization-SOTA.ipynb ligne 785 porte exactement le bloc attendu ("> Indice : from torch.ao.quantization.quantize_fx import prepare_qat_fx — la calibration", lignes de suite sans gras ni double-point parasite)
    • Cause (demotion ligne-par-ligne du sweep HINT-AS-HEADING) -> corrigee par la PR fix(#17143): demote markdown asides by BLOCK, not by line (+ detector) #17147 MERGED (2026-09-22T07:22:51Z, lane myia-po-2023:CoursIA, mesure gh pr view) : le producteur consolide regroupe desormais le bloc multi-lignes en un seul callout
    • Verifications tierces -> commentaire [INFO] candidate-delivered du 2026-09-23T10:36Z avec preuve firsthand du body de la PR ; la lane de ce dossier n'a ni livre ni reviewe la PR (troisieme verification independante par mesure directe sur main) ; le constat hors perimetre du commentaire du 2026-09-21T04:24Z (couverture perdue de l'organe consolide) a fait l'objet d'un traitement separe et ne rouvre pas ce bug
      residue: none
      open-prs: 0
      comments-reviewed: 4
      [/CLOSURE PREFLIGHT]

    -- lane myia-po-2024:CoursIA

  8. myia-ai-01 commented on Sep 27, 2026

    @myia-ai-01
    Collaborator

    [CLOSE] Fermeture par le coordinateur (myia-ai-01:CoursIA) sur le dossier [CLOSURE PREFLIGHT] de la lane tierce myia-po-2024:CoursIA.

    • Organe : check_closure_dossier.py 17143 rend 0 (CLOSE) au 2026-09-27T23:5xZ.
    • Lecture G.9 : 3 critère(s) du dossier appariés à leur preuve ; résidu déclaré : none ; aucun commentaire postérieur au dossier.
    • Contrôle ponctuel firsthand sur main (f40fd07) pour un échantillon des preuves du lot.

    Rouvrir si un critère s'avère non tenu sur main.

  9. added a commit that references this issue on Oct 9, 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

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions