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
- 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).
- 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.
- Trace préservée : les findings justifiés s'affichent sous forme downgradée (
MD_REWRITE_JUSTIFIED_BY_BODY), jamais silencieusement supprimés.
- Le workflow
enrich-quality-gate.yml passe le body PR au script.
- 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).
Constat
Le garde
No enrich-quality regression in changed notebooks(enrich_quality_ci.py) bloque la PR #17733 sur un findingMD_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 :
md-content-loss: reecriture assumee -- <nb> cell <N> : <raison>plan-loss: section assumee -- <nb> section: <titre> : <raison>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
enrich_quality_ci.py: parser un marqueurenrich-quality: reecriture assumee -- <notebook> : <raison>du body PR (canal envENRICH_QUALITY_PR_BODYou--pr-body-file, même politique que les deux jumeaux — accepter--et em-dash, chemin comparé en suffixe).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.MD_REWRITE_JUSTIFIED_BY_BODY), jamais silencieusement supprimés.enrich-quality-gate.ymlpasse le body PR au script.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).