# Méthodologie — Mise en conformité des pages de compétences SkillQuest Ce document capitalise les règles établies au fil des corrections, pour permettre de reproduire la même logique sur le reste des compétences. Mis à jour à chaque nouveau cas rencontré. Dernière mise à jour : 27 juillet 2026 — cas traités : Cybersécurité, Protection des données, Piles et Files, Graphes, Cryptographie, Classes, Récursivité, Encodage, Systèmes de numération, Artefact, Esthétique du code, Jeu Vidéo Java, Modélisation Jeu Vidéo, Programmation I - Python, Programmation I - C, Programmation I - Java, Programmation II - Java, Programmation I - JavaScript, Programmation II - Python (19 compétences). ## 1. Référence Le template cible est la page **Lecture de Code - Python** (`Code et Développement/Programmation/Lecture de Code - Python/Lecture de code - Python.md`). Toute page d'accueil doit suivre sa structure. Le référentiel de vérité pour les données (xp, domaine/sous-domaine, type de compétence, modalité d'évaluation, responsable, nom exact) est l'**export Kumu**, pas le contenu actuel des pages. En cas d'écart entre la page et Kumu (ex. xp différent entre le frontmatter et le corps du texte), Kumu tranche. ## 2. Structure cible d'une page d'accueil ``` # 🎯 {Nom de la compétence} > {Phrase courte à la première personne, ce que je sais faire} > [!info] 🎯 Objectif > {Description de l'objectif, 1 à 3 phrases} ## 📚 Contenu pédagogique [voir §4 — peut être absent si la compétence n'a pas de cours par nature] ## 🧩 Activités pédagogiques [voir §5 — peut être absent si l'évaluation EST l'unique activité] ## ✅ Modalités d'évaluation [voir §6 — présent seulement si l'évaluation n'est pas un Test Surveillé lié à une page d'entraînement] --- 🗓️ Historique Dernière mise à jour : `{date du jour}` Rédigé par : {Rédacteur(s)} ``` **À supprimer systématiquement** (marqueurs de l'ancien template) : section "👥 Encadrement", section "🔗 Connexions" avec diagramme ```mermaid```, lignes "Responsable :" en bullet. Ces infos vivent dans le frontmatter, pas dans le corps. **Ligne "Rédigé par" (27/07/2026) :** toujours un lien wiki vers la page de l'auteur dans `Equipe pédagogique/`, jamais du texte brut. `Rédigé par : [[Julien DUQUENNOY]]`, pas `Rédigé par : Julien Duquennoy`. C'est déjà la convention utilisée sur toutes les pages des autres enseignants du coffre — 49 pages de Julien retouchées pour s'aligner. **Note de formatage** : la section Historique finale n'a pas de `##` (texte simple, pas un titre), contrairement à toutes les autres sections. ## 3. Frontmatter **Règle depuis le 27/07/2026 : le frontmatter (bloc YAML `---` en en-tête) est supprimé sur toutes les pages retravaillées.** Ces métadonnées (responsable, xp, prérequis, tags, date de mise à jour...) sont désormais gérées dans l'app SkillQuest et n'ont plus besoin d'être dupliquées dans Obsidian. C'est aussi ce que fait la page de référence Lecture de Code - Python, qui n'a jamais eu de frontmatter. Concrètement : toute page d'accueil retravaillée commence directement par `# 🎯 {Nom de la compétence}`, sans bloc `---` avant. Ceci a été appliqué rétroactivement aux 11 pages déjà traitées qui avaient un frontmatter (Encodage et Systèmes de numération n'en avaient déjà pas). ## 4. Section "Contenu pédagogique" — arbre de décision 1. **Plusieurs pages de cours internes existent déjà** (fichiers `.md` séparés dans le dossier, type `00_...`, `01_...`) → tableau `| # | Page | Notions clés |` avec des liens wiki internes `[[fichier|Titre]]` vers chacune. C'est le cas Lecture de Code lui-même. 2. **Le contenu est une liste de liens vers des ressources externes** (notebooks GitHub, PDF, etc.) avec une courte description à côté de chaque lien, mais SANS page interne dédiée → tableau `| # | Page | Notions clés |` où la colonne "Page" est un lien markdown classique vers l'URL externe (`[Titre](https://...)`), **pas** une page interne à créer. Cas : Piles et Files, Graphes, Cryptographie. 3. **Le contenu est rédigé en markdown directement dans la page d'accueil** (texte explicatif, pas de lien externe ni de page séparée) → extraire ce contenu dans **une** page dédiée `Cours - {Compétence}.md`, puis un tableau à une ligne sur l'accueil pointant vers cette page. 4. **Aucun cours n'est nécessaire par nature** (l'activité couvre tout le contenu pédagogique) → pas de section du tout. À valider explicitement avec Julien avant de l'appliquer, puis enregistrer le nom de la compétence dans `sans_page_de_cours_validee` (voir §8). Cas : Cybersécurité, Protection des données. Un tableau peut être précédé d'un sous-titre `###` si plusieurs groupes thématiques existent (ex. Graphes : "Fondements" / "Parcours et algorithmes" ; Cryptographie : "Chiffrement symétrique" / "Chiffrement asymétrique (pour aller plus loin)"). ## 5. Section "Activités pédagogiques" — règles - Une entrée par activité réelle : `### Titre`, puis `[[lien vers la page]]`, puis un paragraphe descriptif (1 à 3 phrases, à la manière de l'exemple Lecture de Code). - **Ne jamais inventer un lien vers une page qui n'existe pas.** Avant de garder une référence à une activité mentionnée dans l'ancien contenu, vérifier qu'un fichier correspondant existe réellement dans le dossier (`ls` du dossier). Si non : soit on retire la mention, soit on la garde en texte simple sans lien (voir cas Récursivité, où 3 des 4 activités mentionnées n'avaient pas de fichier). - **Contenu d'activité rédigé en dur dans l'accueil** (description complète sans lien `[[...]]` ni lien `(https://...)`) → extraire dans une page dédiée `Atelier - {Compétence}.md` ou `Autonomie - {Compétence}.md` selon le type, puis lier depuis l'accueil. Cas : Esthétique du code (2 activités extraites). - **Pas d'activité distincte par nature** (le projet/évaluation autonome EST l'unique activité, pas de page d'atelier séparée) → pas de section. À valider explicitement avec Julien, puis enregistrer dans `sans_activite_dediee_validee`. Cas : Classes. - **Une page d'atelier existante ne contient qu'une URL** (pas de contenu propre substantiel : pas d'énoncé, pas de corrigé, juste un titre + un lien + l'historique) → même logique que pour le Contenu pédagogique (§4.2) : ne pas garder de page dédiée, mettre l'URL directement dans le tableau des activités sur l'accueil, et supprimer la page devenue redondante. Cas : Jeu Vidéo Java (7 pages d'atelier ne contenant chacune qu'un lien ArcGIS, supprimées). - **À l'inverse, une évaluation complexe** (livrables multiples, barème détaillé, choix parmi une liste, etc.) justifie pleinement une page `Evaluation - {Compétence}.md` séparée — ne pas chercher à tout rapatrier sur l'accueil. Dans ce cas, toujours accompagner le lien vers cette page d'un court paragraphe descriptif sur l'accueil (jamais un lien nu sans contexte). Cas : Jeu Vidéo Java, Modélisation Jeu Vidéo. - Pour un ensemble d'ateliers séquentiels formant un seul projet guidé (ex. simulateur Wa-Tor, 7 ateliers), un tableau `| # | Atelier | Objectif |` est plus lisible qu'une liste de blocs `###` répétitifs — et permet d'y mettre une URL directe si les ateliers n'ont pas de contenu propre (voir point ci-dessus). ## 6. Section "Modalités d'évaluation" — règle centrale - **Évaluation Kumu = "Test Surveillé"** ET une page d'entraînement (Moodle) est le mécanisme de validation → **pas** de section Modalités d'évaluation sur l'accueil. Tout le détail (type, plateforme, barème, ressources) vit sur la page `Entrainement - {Compétence}.md`. Sur l'accueil, cette page apparaît simplement comme une entrée de plus dans "Activités pédagogiques" (comme le fait Lecture de Code), pas dans une section séparée. - **Toute autre modalité** (Validation en Séance, Devoir à rendre ou Projet, Mixte, Associée à une compétence liée si applicable...) → ajouter `## ✅ Modalités d'évaluation` directement sur l'accueil, avec : - **Type** (repris de Kumu ou de l'ancien contenu) - Description de l'évaluation (préserver le contenu existant : consignes, barème, lien vers une fiche d'évaluation séparée si elle existe) - Le déroulé détaillé de soutenance si présent dans l'ancien contenu (à conserver intégralement, c'est de l'information opérationnelle utile). ### 6bis. Page d'entraînement manquante (Test Surveillé) **Règle (27/07/2026) :** dès qu'une compétence est évaluée par un Test Surveillé et qu'aucune page `Entrainement - {Compétence}.md` n'existe encore, en créer systématiquement une, même minimale — ne jamais laisser la compétence sans cette page en attendant le QCM Moodle. Structure à reprendre (calquée sur `Entrainement - Lecture de Code - Python.md`) : ``` # Entrainement - {Compétence} ## Test d'entraînement > [!warning] 🚧 À compléter par l'enseignant > Ce test d'entraînement n'a pas encore été créé sur Moodle. Une fois le QCM d'entraînement prêt, > remplacer cette section par le lien direct vers le test — voir le modèle sur la page > [[Entrainement - Lecture de Code - Python]]. > ℹ️ **Examen officiel :** sans indice ni feedback pendant la passation. ## Modalités de l'examen surveillé [reprendre ici tout le détail d'évaluation trouvé dans l'ancien contenu : plateforme, durée, barème, ressources autorisées — voir §6] ``` ⚠️ **Ne pas écrire le mot "Moodle" dans un lien factice ou une URL placeholder** — le script QC détecte une page d'entraînement "complète" via un vrai lien contenant "moodle" (regex sur une URL ou un lien markdown). Le mentionner uniquement en texte d'instruction (hors lien) laisse la compétence correctement détectée comme "à compléter", ce qui est le but. Le suivi consolidé de toutes les pages d'entraînement à produire (tous enseignants confondus) est dans **Accueil.md, section "🟣 Tests d'entraînement Moodle à produire"**. ### 6ter. Exceptions "hors Moodle" — Evaluation Kumu = Test Surveillé mais pas de QCM Moodle Certaines compétences ont bien `Evaluation = Test Surveillé` dans Kumu, mais l'examen surveillé réel ne passe **pas** par un QCM Moodle — il n'y a donc ni page d'entraînement Moodle à créer, ni statut "manquant" à afficher pour elles. Validé par Julien le 27/07/2026 : - **Programmation I/II/III/IV, toutes langues** (C, Java, JavaScript, Python — 16 compétences) : examen sur la plateforme **CoderPad**. L'entraînement se fait via les ateliers existants (ex. "Atelier 5 - Préparation au test CoderPad"), pas via une page Entrainement dédiée. - **Word, PowerPoint, Excel** : certification **TOSA**. - **R II** : hors Moodle (mécanisme à documenter au moment de traiter cette compétence). Liste maintenue dans `_corrections_manuelles.json`, clé `evaluation_hors_moodle_validee`. Effet dans `crosswalk3.py` : `entrainement_requis` passe à `Non` pour ces compétences (au lieu du calcul standard TypeCompetence + Evaluation), ce qui les retire automatiquement de la liste "🟣 Tests d'entraînement Moodle à produire" et de l'exigence de page d'entraînement. **Conséquence sur la structure de la page d'accueil pour ces compétences :** puisqu'il n'y a pas de page d'entraînement Moodle, la règle du §6 s'inverse — la section `## ✅ Modalités d'évaluation` **doit** être présente sur l'accueil (type, plateforme, barème, ressources), comme pour n'importe quelle évaluation non liée à un entraînement Moodle. Cas concret : Programmation I - Python avait été construite une première fois avec une page `Entrainement - Programmation I - Python.md` (placeholder Moodle) — corrigé après validation de Julien : page supprimée, contenu de l'examen (plateforme CoderPad, barème) déplacé sur l'accueil dans `## ✅ Modalités d'évaluation`. ## 7. Renommage de dossier Quand `statut_nom` = "À RENOMMER" (nom Kumu différent du nom de dossier actuel, confirmé par le changelog ou une correction manuelle) : 1. Renommer le **dossier** avec le nom exact de la compétence Kumu. 2. Renommer le **fichier de la page d'accueil** à l'intérieur (même nom que le dossier + `.md`). 3. **Chercher les références croisées** vers l'ancien nom ailleurs dans le coffre (`grep -rl "[[Ancien Nom" .`) et les mettre à jour — y compris dans les pages d'évaluation, prérequis d'autres compétences, etc. 4. Réécrire le contenu de la page selon la structure cible (c'est presque toujours nécessaire en même temps, l'ancien nom va généralement de pair avec l'ancien template). ### 7bis. Cas particulier : un dossier "enveloppe" contient plusieurs compétences numérotées Repéré le 27/07/2026 sur **Photographie** (Nicolas PRINIOTAKIS) : le dossier `Communication/Photographie/` n'était pas lui-même une compétence, mais une enveloppe contenant 4 sous-dossiers `Photographie 1` à `4`, chacun une vraie compétence (Kumu : Photographie I à IV, numérotation romaine). Cette double imbrication n'est pas reconnue par le scan du coffre (qui s'arrête à 3 niveaux : domaine/sous-domaine/compétence) — la compétence remonte en orphelin. **Fix :** sortir chaque sous-dossier numéroté de l'enveloppe, le renommer avec la numérotation romaine attendue, et supprimer l'enveloppe désormais vide. Pas besoin d'entrée dans `_corrections_manuelles.json` une fois la structure aplatie — le nom correspond alors exactement au nom Kumu. Renommages simples (via `renommages_hors_changelog`) traités le même jour : **Connaitre son ordinateur** → **Connaître son ordinateur II** (Yazid GUERROUDJ), **Créativité** → **Créativité I** (Nicolas PRINIOTAKIS). ## 8. Exceptions validées — fichier `_corrections_manuelles.json` Fichier : `SkillQuest KB/QC par enseignant 2026-27/_corrections_manuelles.json`. Deux listes permettent de déclarer des exceptions **au cas par cas, après validation explicite de Julien sur chaque compétence** (jamais de manière préventive) : - `sans_page_de_cours_validee` : liste de noms de compétences n'ayant volontairement aucune page/tableau de cours. - `sans_activite_dediee_validee` : liste de noms de compétences n'ayant volontairement aucune section Activités pédagogiques séparée (le projet/évaluation est l'activité). Ces exceptions désactivent la vérification correspondante dans le script QC (`crosswalk3.py`) pour que ces compétences remontent correctement en "conforme" une fois traitées, sans être signalées à tort. ## 9. Compétences "outil" / "associée" — pas de page requise Quand `Evaluation` Kumu = **"Associée à une compétence liée"** (8 compétences au total : Programmation I/II/III/IV, Lecture de code, SIG I, Projet de programmation, Géoréférencement et Numérisation), la compétence de base n'a pas besoin de sa propre page — elle est validée via ses variantes par langage/outil (ex. Programmation I est validée par Programmation I - Python, Programmation I - Java, etc.). Statut affiché : `N/A — évaluation associée (pas de page requise)`. **Cas résolu (27/07/2026) : Programmation II / "Résoudre un problème simple".** Julien a confirmé que "Résoudre un problème simple" est bien l'ancien nom de Programmation II, mais comme Programmation II est une compétence "outil" (pas de page requise), ce dossier ne doit **pas** apparaître dans Obsidian — il doit simplement être archivé, pas renommé. Règle généralisée : quand une compétence "outil"/associée correspond à un dossier existant (ancien nom ou nom exact), ce dossier n'est jamais réclamé comme page de la compétence ; il est automatiquement classé "à archiver" (feuille `orphans.csv` / section "Pages à supprimer ou archiver" d'Accueil.md), avec le motif "ancien dossier d'une compétence devenue outil associée". Implémenté dans `crosswalk3.py`. Cette correction est globale (tout le coffre, pas seulement les compétences de Julien) : en plus de Programmation II, 4 autres dossiers ont été reclassés en "à archiver" par la même règle — Géoréférencement et numérisation, SIG, Mise en page SIG, Résoudre un problème complexe (ancien nom de Projet de programmation). **Archivage physique effectué le 27/07/2026.** Les 5 dossiers avaient déjà une copie identique dans `_Archives cours` (issue de la réorganisation précédente, vérifié par `diff -rq` avant suppression) — ils ont donc simplement été supprimés du coffre actif, sans reperte de contenu : - `Code et Développement/Programmation/Résoudre un problème simple` (copie dans `_Archives cours/Julien DUQUENNOY/Programmation/Programmation II/`) - `Code et Développement/Programmation/Résoudre un problème complexe` (copie dans `_Archives cours/Julien DUQUENNOY/Programmation/Projet de programmation/`) - `Géomatique/SIG/Géoréférencement et numérisation`, `Géomatique/SIG/SIG`, `Géomatique/SIG/Mise en page SIG` (copies dans `_Archives cours/Frédéric REN/SIG/...`) ### 9ter. Règle absolue (27/07/2026) : ne jamais sortir un fichier des archives **On ne déplace plus jamais rien hors de `_Archives cours`.** Quand du contenu archivé sert de base à une nouvelle page vivante, il est **copié**, jamais déplacé — l'original reste intact dans les archives, au cas où il faudrait y revenir. C'est la règle depuis le 27/07/2026 ; avant cette date, 4 dossiers avaient été déplacés (pas copiés) : Python 1, Python 2, Java 3, Python 3. Trois ont pu être restaurés à l'identique dans les archives à partir du texte déjà lu en session (Python 2, Java 3, Python 3). **Python 1 n'a pas pu être restauré** : son contenu original avait été écrasé lors d'une session antérieure à celle-ci, sans copie conservée nulle part — c'est un angle mort connu, pas un oubli silencieux. Optimisation de problème (base : archive "Python 4") a été traitée en respectant la nouvelle règle : contenu copié, dossier archivé `Python 4` intact et inchangé. **Doublons vivants supprimés (27/07/2026), validés par Julien :** deux dossiers vivants faisaient doublon avec un contenu déjà présent en archive et n'avaient plus leur place dans le coffre actif — supprimés du vivant uniquement, archives inchangées : - `Code et Développement/Programmation/Java 3` — ancien dossier resté seul (jamais migré), contenu quasi identique (différences de guillemets typographiques uniquement) à l'archive `_Archives cours/.../Java 3/Java 3/`, lui-même à la source de la page vivante `Projet de programmation - Java`. Supprimé. - `Code et Développement/Programmation/Ateliers - Algorithmique (partagés)` — dossier que j'avais créé pour restaurer 4 ateliers génériques (Variables, Tests, Boucles, Tableaux) au moment de bâtir Programmation I - C/Java/JavaScript, alors que l'original existe déjà dans `_Archives cours/.../Programmation I/Algorithmique (brouillon - archives racine)/`. Obsidian résout les liens wiki `[[...]]` dans tout le coffre, y compris `_Archives cours` — la copie vivante était donc inutile. Supprimée ; les liens des 3 pages Programmation I concernées continuent de résoudre vers l'original archivé. ### 9bis. Convention de nommage dans `_Archives cours` — toujours le nom d'origine **Règle (27/07/2026) :** un dossier archivé garde **toujours son nom d'origine** (celui du dossier avant renommage), jamais le nouveau nom de la compétence Kumu. La structure `_Archives cours/{Référent}/{Sous-domaine}/{Nom d'origine}/` suffit — pas de dossier intermédiaire au nouveau nom. Correction appliquée le 27/07/2026 à 9 dossiers qui avaient été archivés avec le nouveau nom en enveloppe (ex. `Programmation I - C/C 1/`) : renommés pour ne garder que le nom d'origine (`C 1/C 1/` — la duplication interne vient de la convention `{Compétence}/{Ancien Dossier}` déjà en usage pour les cas où ancien = nouveau nom, ex. `Classes/Classes/`). Dossiers concernés : C 1, Java 1, Java 2, Java 3, JavaScript 1, Python 2, Python 3, Résoudre un problème simple, Résoudre un problème complexe. ### 9sexies. Faille corrigée : un squelette avec la bonne structure n'est pas "conforme" (27/07/2026) **Bug détecté par Julien** : juste après la création des 15 squelettes (§9quinquies), Accueil.md affichait 47/48 compétences prêtes pour Julien — faux, puisque ces squelettes n'ont aucun contenu réel. Cause : `crosswalk3.py` ne vérifiait que la **présence structurelle** (en-tête de tableau `| # | Page |`, callout `[!info]`, titre `## Activités pédagogiques`) sans vérifier si le contenu en dessous était réel ou factice — un tableau contenant uniquement `*(à compléter)*` remplissait toutes les conditions de `CONFORME`. **Correctif :** toute page contenant le marqueur `à compléter` (insensible à la casse) reçoit désormais le statut dédié `SQUELETTE — structure en place, contenu à rédiger par l'enseignant`, qui n'est **jamais** `CONFORME`, quelles que soient les sections présentes. `contenu_pedagogique_present` est aussi corrigé pour ignorer un tableau qui ne contient que des lignes placeholder. Nouvel emoji 🟠 dans les légendes/tableaux. `enrich.py` ajoute une action dédiée ("Page squelette... à rédiger") et n'ajoute plus en double "Aucune page de cours détectée" pour ces mêmes pages. Après correctif : Julien repasse à 32/48 (chiffre exact), les 15 squelettes (Programmation III/IV × 4 langues + les 7 pages "Non disponible") réapparaissent bien comme non prêts. **Leçon retenue :** toute vérification de "structure présente" doit aussi vérifier que le contenu n'est pas un placeholder généré automatiquement, sous peine de fausser le taux de complétion. ### 9septies. Alertes structurelles non bloquantes (27/07/2026) Sur demande de Julien : **ne jamais rester silencieux** sur l'absence de cours, d'activité ou de modalité d'évaluation — y compris quand c'est une exception déjà validée (`sans_page_de_cours_validee`, `sans_activite_dediee_validee`), ou pour un cas encore jamais examiné (absence totale de section "Modalités d'évaluation", nouveau check). Mais ce signalement ne doit **pas** forcer une action ni faire perdre le statut "prêt" — c'est un rappel, pas un défaut. Implémenté via 3 nouveaux booléens dans `crosswalk3.py` (`alerte_pas_de_cours`, `alerte_pas_activite`, `alerte_pas_evaluation` — ce dernier détecte l'absence de section "Modalités d'évaluation" ET l'absence de page d'entraînement/évaluation séparée) puis un champ `alertes_info` dans `enrich.py`, complètement **séparé** du champ `action`/`ok_global` qui pilote le statut "prêt". Rendu dans une nouvelle section `## ℹ️ Alertes structure (pas d'action requise à priori)` sur chaque page enseignant, entre la checklist des tâches et le tableau récapitulatif. Limite connue : le calcul de `nb_pages_cours` (simple comptage de fichiers `.md` ni "Atelier..." ni "Entrainement...") compte parfois une page d'autonomie/entraînement (ex. "Autonomie - CodinGame.md") comme une "page de cours", ce qui supprime l'alerte à tort pour certaines compétences comme Programmation II - Python. Comme cette couche est purement informative (jamais bloquante), l'impact est mineur — à corriger si ça devient gênant. ### 9quinquies. Squelettes des pages sans aucun contenu (27/07/2026) **Règle :** pour une compétence "Disponible" sans contenu (Programmation III/IV) ou "Non disponible" avec page à créer, ne pas se contenter d'un simple callout d'avertissement — construire la page avec **toutes les sections de la structure standard**, vides ou en exemple, marquées « à compléter » : callout Objectif, tableau `## 📚 Contenu pédagogique` (une ligne d'exemple `| 01 | *(à compléter)* | *(à compléter)* |`), `## 🧩 Activités pédagogiques` (un bloc `### *(à compléter)*` avec description à rédiger), et `## ✅ Modalités d'évaluation` (type repris de Kumu quand connu, reste à préciser). Ainsi l'enseignant récupère un squelette prêt à remplir plutôt qu'une page vide. Appliqué aux 8 squelettes Programmation III/IV (ajout des sections Contenu pédagogique + Activités pédagogiques, qui n'existaient pas) et aux 7 pages "Non disponible" de Julien (Scénographie, User Interface, MIRO, Réduction de problème, Anti-disciplinarité, Performance, User eXperience — reconstruites en entier, plus qu'un simple avertissement). **Ne plus nommer le template "Lecture de code" dans les textes générés (27/07/2026) :** les libellés d'action et légendes ("harmoniser avec la structure standard", "structure standard des pages de compétence") ne citent plus le nom de la page de référence. Corrigé dans `enrich.py` (actions "Page d'accueil à harmoniser avec la structure standard (...)" / "à réécrire selon la structure standard") et `build_md.py` (légende "conforme à la structure standard"). Le nom "Lecture de code" reste bien sûr affiché quand il s'agit réellement de la compétence de ce nom dans les tableaux récapitulatifs — seule la désignation *du template* en a été retirée. ### 9quater. Format des pages de suivi par enseignant (27/07/2026) Sur demande de Julien, les pages `{Enseignant}.md` sont réorganisées pour que la liste des tâches à produire soit identifiable immédiatement : - La section **« 📝 Tâches à réaliser »** (checklist actionnable) passe en premier, juste après la ligne de stats — avant, elle arrivait après un pavé de légendes et un grand tableau récapitulatif, ce qui la noyait. - Sur chaque ligne de tâche, l'étiquette de statut complète et répétitive ("🟡 Nom OK mais page à revoir (template partiel)") est remplacée par une étiquette courte ("🟡 template partiel") — le détail reste dans les cases à cocher en dessous, pas besoin de le répéter dans le titre. - Le tableau récapitulatif complet (toutes les compétences, y compris celles déjà prêtes) et les légendes qui l'expliquent passent après la checklist, sous **« 📊 Détail par compétence »** — utile comme référence, mais plus la première chose vue. - Implémenté dans `build_md.py` via `issue_reasons(r)` (factorisée, utilisée à la fois par `overall_label` pour le tableau et par `short_tag` pour la checklist). ## 10. Après chaque édition — process technique (pour Claude) 1. Éditer les fichiers du coffre. 2. Si des fichiers ont été ajoutés/supprimés/renommés : régénérer `vault_tree_full.json` (scan du coffre en direct, le script de croisement utilise un instantané et non le disque en direct). 3. Relancer dans l'ordre : `crosswalk3.py` → `enrich.py` → `build_md.py`. 4. Vérifier pour chaque compétence traitée : `statut_nom = OK`, `statut_template = CONFORME`, `action = RAS`. 5. Le compteur "Compétences totalement prêtes" en tête d'`Accueil.md` se met à jour automatiquement à ce moment. ## 11. Journal des cas traités | Compétence | Particularité | Décision | |---|---|---| | Cybersécurité | Aucun cours, activité seule | Exception "sans page de cours" validée | | Protection des données | Aucun cours, activité seule | Exception "sans page de cours" validée | | Piles et Files | Liens externes GitHub (pas de page interne) | Tableau avec liens externes directs | | Graphes | Liens externes GitHub, 2 groupes thématiques | Tableau avec liens externes, 2 sous-tableaux | | Cryptographie | Liens externes GitHub, "pour aller plus loin" | Tableau avec liens externes, 2 sous-tableaux | | Classes | Pas d'activité séparée (projet = activité) | Exception "sans activité dédiée" validée | | Récursivité | 3 des 4 activités mentionnées n'existent pas | Liens retirés, seule l'activité réelle conservée | | Encodage | Déjà quasi conforme | Juste conversion en tableau | | Systèmes de numération | Déjà quasi conforme | Juste conversion en tableau | | Artefact | Longue intro en prose | Condensée dans le callout Objectif | | Esthétique du code | 2 activités rédigées en dur dans l'accueil | Extraites en 2 pages dédiées | | Jeu Vidéo Java | Renommage + xp erroné (20 au lieu de 10) ; 7 pages d'atelier ne contenant qu'une URL ; évaluation complexe séparée | Dossier renommé, xp corrigé, URLs mises en tableau (pages supprimées), paragraphe descriptif ajouté pour l'évaluation | | Modélisation Jeu Vidéo | Renommage ; évaluation complexe séparée sans paragraphe descriptif | Dossier renommé, paragraphe descriptif ajouté pour l'évaluation | | Programmation I - Python | Dossier "Python 1" dans `_Archives cours` (jamais publié) ; anciens prérequis (Algorithmique, Algorigrammes) renommés depuis dans le référentiel ; exception "hors Moodle" (examen CoderPad) | Sorti des archives et renommé ; page d'entraînement Moodle créée puis retirée après clarification (§6ter) ; évaluation détaillée (CoderPad, barème) sur l'accueil | | Programmation I - C | Ancien dossier "C 1" ; 4 ateliers génériques d'entraînement (Variables, Tests, Boucles, Tableaux) partagés avec Java 1/JavaScript 1 mais orphelins dans les archives (rattachés à l'ancien dossier Algorithmique) | Dossier renommé ; les 4 ateliers partagés restaurés en dossier vivant commun `Ateliers - Algorithmique (partagés)` (copie depuis les archives, qui gardent leur propre exemplaire) et liés depuis les 3 pages langage concernées | | Programmation I - Java | Ancien dossier "Java 1" ; atelier "Prise en main de Java" ne contenant qu'une URL ArcGIS | Dossier renommé ; page d'atelier supprimée, URL mise directement dans les activités (même logique que Jeu Vidéo Java, §5) | | Programmation II - Java | Ancien dossier "Java 2" ; aucun contenu de cours propre (pratique intensive de Programmation I - Java) ; lien vers une page "Autonomie - CodinGame" qui n'existe pas dans ce dossier ; xp du frontmatter (3) erroné vs Kumu (4) | Dossier renommé ; exception "sans page de cours" validée (nature : pur entraînement) ; lien mort retiré, remplacé par un lien externe direct vers CodinGame ; xp corrigé à 4 | | Programmation I - JavaScript | Ancien dossier "JavaScript 1" ; aucun contenu de cours créé à ce jour (texte de l'ancienne page : "en cours de préparation") ; copier-coller resté de C 1 (titre "C 1", "langage Java" au lieu de JavaScript) | Dossier renommé, copier-coller corrigé ; **pas** ajoutée à l'exception "sans page de cours" — lacune réelle, la compétence reste "PARTIEL" tant que le cours n'existe pas | | Programmation II - Python | Ancien dossier "Python 2" dans `_Archives cours` ; aucun contenu de cours propre (pratique intensive de Programmation I - Python) | Sorti des archives et renommé ; exception "sans page de cours" validée (même nature que Programmation II - Java) ; 3 activités réelles conservées (2 ateliers + entraînement CodinGame) | | Optimisation de problème | "Non disponible" dans Kumu mais contenu réel trouvé en archive sous "Python 4" ; xp frontmatter (20) très différent du xp Kumu (8, Kumu tranche) ; "je" statement Kumu très différent du contenu réel (réduction NP-complet) | Contenu **copié** (pas déplacé, règle 9ter) dans un nouveau dossier vivant ; tableau de cours (4 ressources externes) + 3 ateliers (sujet/corrigé GitHub) + modalités d'évaluation (Projet, soutenance) | | Scénographie, User Interface, MIRO, Réduction de problème, Anti-disciplinarité, Performance, User eXperience | "Non disponible" dans Kumu, aucun contenu nulle part | Squelettes minimalistes créés sur validation de Julien : phrase "je" (Kumu), callout "🚧 compétence non disponible", pas de section Contenu/Activités tant qu'il n'y a rien à y mettre → statut PARTIEL, cohérent avec leur non-disponibilité | ## 12. Note technique — faux positifs de rapprochement approximatif En créant "Programmation I - Python", un faux rapprochement est apparu : "Projet de programmation - Python" (encore non traité) était rapproché à tort de ce nouveau dossier, les deux noms étant proches une fois normalisés. Corrigé en ajoutant "i" et "projet" à la liste des tokens distinctifs (`DIST`) du script de rapprochement approximatif dans `crosswalk3.py` — à surveiller si d'autres faux positifs apparaissent au fil du chantier Programmation (beaucoup de noms proches : Programmation I/II/III/IV, Projet de programmation, par langage). ## 13. À faire ensuite Chantier Programmation I/II/III/IV × C/Java/JavaScript/Python : **Programmation I et II entièrement traitées** pour les 4 langues (Programmation I - Python déjà faite ; Programmation I - C, Programmation I - Java, Programmation II - Java, Programmation I - JavaScript, Programmation II - Python traitées ensuite). Restent : - **Programmation I - JavaScript** : dossier et page créés, mais **aucun contenu de cours n'existe encore nulle part** (ni vivant, ni en archive) — reste en statut "PARTIEL" jusqu'à ce que le cours soit rédigé. Pas une lacune de méthodologie, une vraie lacune de contenu à signaler. - **Programmation III - C/Java/JavaScript/Python** et **Programmation IV - C/Java/JavaScript/Python** (8 compétences) : marquées "Disponible" dans Kumu mais aucun contenu trouvé nulle part. **Décision de Julien (27/07/2026) : squelettes créés**, à compléter plus tard. Chaque page a : phrase "je", callout Objectif (généré depuis le libellé Kumu), callout `🚧 Page à compléter`, section Modalités d'évaluation (Test Surveillé, CoderPad — barème à préciser). Pas de section Contenu pédagogique ni Activités pédagogiques tant qu'il n'y a rien à y mettre → statut correctement affiché "PARTIEL", pas compté comme prêt. - **Java 3 et Python 3** : confirmés par Julien comme étant l'ancien nom de **Projet de programmation - Java / Python** (et non Programmation III comme supposé un temps) — déjà correctement archivés sous ce nom, hors périmètre du chantier Programmation I-IV. Anomalie Programmation II résolue et tous les dossiers "outil" archivés (§9), convention de nommage des archives corrigée (§9bis). **Chantier Programmation I-IV × 4 langues terminé (16/16 compétences ont désormais une page).** 8 conformes (Programmation I - Python/C/Java, Programmation II - Java/Python/JavaScript/C) ; 9 en squelette/partiel en attente de contenu à rédiger par Julien (Programmation I - JavaScript, Programmation III et IV dans les 4 langues). Java 3/Python 3 restent hors-périmètre (→ Projet de programmation, pas Programmation III). **Projet de programmation - C/Java/JavaScript/Python** (27/07/2026) : évaluation Kumu = *Devoir à rendre ou Projet* (pas Test Surveillé — aucune page d'entraînement CoderPad/Moodle en jeu ici). Java 3 et Python 3 avaient un vrai contenu archivé, sortis des archives et renommés. Sur demande de Julien, C et JavaScript construites **sur le modèle de Java 3** : intro pratique approfondie de Programmation II - {langue}, activité "Puzzle Moyen" avec page `Autonomie - Puzzle Moyen.md` dédiée (traduction de puzzles CodinGame *Moyen* déjà résolus en Python vers le langage cible), modalités d'évaluation identiques (Projet, soutenance individuelle ~15 min, déroulé en 5 étapes, bonus XP vers la compétence associée **Projet de programmation**). Python garde son contenu original et distinct (elle est la langue de référence : progression Facile→Moyen, pas de traduction). Les 4 ajoutées à `sans_page_de_cours_validee` (pas de contenu de cours, seulement pratique). **Programmation II - JavaScript et Programmation II - C** : aucun dossier source ("JavaScript 2" / "C 2") trouvé nulle part, ni vivant ni en archive — contrairement à Programmation II - Java/Python (qui avaient un vrai ancien dossier). Julien a validé (27/07/2026) de les construire malgré tout **sur le modèle générique de Programmation II - Java** : intro "pratique intensive de Programmation I - {langue}", activité CodinGame (texte générique, pas de lien vers une page d'entraînement spécifique puisqu'aucune n'existe), mêmes modalités d'évaluation (CoderPad, 54 min, format Clash of Code). Ajoutées à `sans_page_de_cours_validee` → conformes. Motif : à la différence de Programmation III/IV (dont même la nature exacte du contenu futur est inconnue), le modèle Programmation II est suffisamment stable et répétitif d'une langue à l'autre pour être généré par analogie sans risquer d'inventer du contenu incorrect.