Skip to content

fix(ci): enrich-quality MD_REWRITE bloque les reecritures annoncees (Epic #14442) -- marqueur symetrique a #13491/#14532 #17744

Description

@jsboige

Constat

Le garde No enrich-quality regression in changed notebooks (enrich_quality_ci.py) bloque la PR #17733 sur un finding MD_REWRITE : « only 13/83 substantive markdown lines of the base survive verbatim (16%) -- announced extension is a rewrite ».

Le blocage est structurel pour l'Epic #14442 : ses grains D3 (pilot #14442, PR #14865) réécrivent délibérément les introductions pour retirer la chronologie Git — la réécriture EST le livrable. Mesure firsthand sur #17733 : cellules 6/9/26 relues en entier base et tête, les retraits sont exactement les blocs « REPAIR c.NNN », « Tell c.NNN », refs issues et checklists de livraison ; toute la substance pédagogique est réécrite et conservée.

Le gap

Les deux gardes jumeaux de la même famille possèdent déjà un marqueur body pour la réécriture intentionnelle :

Garde Marqueur Origine
md-content-loss md-content-loss: reecriture assumee -- <nb> cell <N> : <raison> #13491
plan-loss plan-loss: section assumee -- <nb> section: <titre> : <raison> #14532
enrich-quality (MD_REWRITE / MD_SURVIVAL_LOW) aucun — « base-vs-head findings always count as new » —

Le docstring du garde le dit lui-même : ces classes sont « inherently relative to [la base], so they always count as new ». Un grain rewrite annoncé ne peut donc jamais passer, quel que soit la qualité de sa réécriture.

Ce qui est attendu

  1. Dans enrich_quality_ci.py : parser un marqueur enrich-quality: reecriture assumee -- <notebook> : <raison> du body PR (canal env ENRICH_QUALITY_PR_BODY ou --pr-body-file, même politique que les deux jumeaux — accepter -- et em-dash, chemin comparé en suffixe).
  2. Portée stricte du downgrade : seules les catégories base-vs-head (MD_REWRITE, MD_SURVIVAL_LOW) du notebook nommé sont exclues du verdict régression. Les findings absolus (anchors, code-into-markdown, hrefs, diacritics) restent bloquants — un marker ne peut jamais masquer un vrai défaut.
  3. Trace préservée : les findings justifiés s'affichent sous forme downgradée (MD_REWRITE_JUSTIFIED_BY_BODY), jamais silencieusement supprimés.
  4. Le workflow enrich-quality-gate.yml passe le body PR au script.
  5. Tests : marker présent + finding base-vs-head → pass ; marker présent + finding absolu (ex MD_ANCHOR) → toujours fail ; marker malade (mauvais notebook) → inert.

Critère de clôture

#17733 passe le garde avec un marker dans son body, sans qu'aucune ligne de chronologie Git ne soit réintroduite dans le notebook. Les prochains grains D3 de l'Epic disposent du mécanisme symétrique aux deux autres gardes.

Provenance

Diagnostic firsthand c.1438-c.1440 (lane myia-po-2024:CoursIA-2) : replay local du garde sur #17733, lecture des parseurs jumeaux _parse_pr_body_markers, vérification du précédent pilote #14865 (vert sur ce garde — sa réécriture était plus étroite, le problème est apparu avec la profondeur D3 de rl_15).

Activity

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