Part of #13844 (issue fille, suggérée par l'arbitrage #15821 — cf. commentaire myia-ai-01 « Le défaut de classe, qui survit à cet arbitrage »)
Le défaut de classe
docs/curriculum/ mélange deux régimes de propriété indiscernables : cinq pages générées (ids du dict PARCOURS de scripts/notebook_tools/generate_parcours.py, réécrites chaque jour par catalog-cron.yml) et des pages manuelles (_inventory.md, stage5_mamba_ssm.md, et bientôt les pages narratives des pilotes Phase 2). Rien dans le nom ni l'arborescence ne les distingue.
#15821 a traité le symptôme (le pilote 4 visait trading.md, un id généré — cible renommée trading-narratif.md). Le risque de classe survit : toute page manuelle créée sous un nom d'id du dict est écrasée silencieusement au passage du cron suivant — sans PR, sans diff, sans rouge.
Correctif proposé (voie 1 de l'arbitrage, la moins invasive)
Le générateur refuse d'écrire un fichier cible qui ne porte pas déjà son header FICHIER GENERE (fail-closed) : il ne peut plus écraser une page manuelle, quel que soit son nom.
Alternative (voie 2) : descendre les pages générées dans docs/curriculum/_generated/ — frontière visible dans le chemin, mais casse les liens existants (PARCOURS.md, docs/README.md, MyIA.AI.Notebooks/README.md).
Acceptance
generate_parcours.py (ou le chemin d'écriture du cron catalogue) échoue explicitement si le fichier cible existe ET ne porte pas le header FICHIER GENERE.
- Test : un fichier stub sans header sous un id du dict → écriture refusée avec message nommant le fichier ; un fichier absent ou portant le header → régénération normale.
- Le cron
catalog-cron.yml propage l'échec (rouge visible), pas de contournement silencieux.
Genre : MED/guard-tooling.
Part of #13844 (issue fille, suggérée par l'arbitrage #15821 — cf. commentaire myia-ai-01 « Le défaut de classe, qui survit à cet arbitrage »)
Le défaut de classe
docs/curriculum/mélange deux régimes de propriété indiscernables : cinq pages générées (ids du dictPARCOURSdescripts/notebook_tools/generate_parcours.py, réécrites chaque jour parcatalog-cron.yml) et des pages manuelles (_inventory.md,stage5_mamba_ssm.md, et bientôt les pages narratives des pilotes Phase 2). Rien dans le nom ni l'arborescence ne les distingue.#15821 a traité le symptôme (le pilote 4 visait
trading.md, un id généré — cible renomméetrading-narratif.md). Le risque de classe survit : toute page manuelle créée sous un nom d'id du dict est écrasée silencieusement au passage du cron suivant — sans PR, sans diff, sans rouge.Correctif proposé (voie 1 de l'arbitrage, la moins invasive)
Le générateur refuse d'écrire un fichier cible qui ne porte pas déjà son header
FICHIER GENERE(fail-closed) : il ne peut plus écraser une page manuelle, quel que soit son nom.Alternative (voie 2) : descendre les pages générées dans
docs/curriculum/_generated/— frontière visible dans le chemin, mais casse les liens existants (PARCOURS.md,docs/README.md,MyIA.AI.Notebooks/README.md).Acceptance
generate_parcours.py(ou le chemin d'écriture du cron catalogue) échoue explicitement si le fichier cible existe ET ne porte pas le headerFICHIER GENERE.catalog-cron.ymlpropage l'échec (rouge visible), pas de contournement silencieux.Genre : MED/guard-tooling.