Add CE2 homophones chapter (a/à, et/est, son/sont, on/ont)

Same directives as the CE1 chapter: 4 rules with a substitution test
each, 8 multiple-choice + 4 sentence corrections + 3 dictées per rule
(draft), 3 missions per rule, Piper audio for the 12 dictées.

21 missions don't fit on one map, so the world map now shows the
missions of the profile's school level (derived from the rule's level,
no data-format change), with a button letting a CE2 profile revisit the
CE1 map. Mission-position guard test now checks each level separately.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Denis Defolie
2026-10-11 21:58:16 +02:00
parent 233cc26452
commit aad229ef7b
113 changed files with 2814 additions and 31 deletions
+10
View File
@@ -244,3 +244,13 @@ Ajouts à l'arborescence proposée :
**Correction** : les 9 missions sont replacées sur une grille régulière 3x3 (x, y ∈ {0.15, 0.5, 0.85}), avec un écart de 0.35 entre positions adjacentes — largement supérieur à la largeur/hauteur des marqueurs rapportée à la fenêtre par défaut. Les trois missions historiques (`mission_01` à `_03`) sont déplacées elles aussi, pas seulement les nouvelles, pour que la grille soit cohérente partout plutôt que patchée au cas par cas.
**Garde-fou** : nouveau test headless (`tests/data/test_mission_positions.gd`) qui échoue si deux missions ont un écart fractionnel inférieur à 0.3 sur les deux axes — ne remplace pas une vérification visuelle (l'écart réel en pixels dépend de la taille de fenêtre réelle, non fixée), mais attrape la classe d'erreur qui vient de se produire avant qu'elle ne soit signalée à la main.
## 27. Chapitre CE2 « homophones grammaticaux » et carte par niveau
**Décision** : le chapitre CE2 est traité avec les mêmes directives que le CE1 (point 25), sans question préalable (autorisation explicite de ne s'arrêter que sur une contradiction de la spécification ou un changement du format des données/sauvegardes — aucun des deux ici : `school_level` existait déjà dans la sauvegarde, `skills` accepte tout identifiant de compétence, aucun schéma modifié).
**Contenu** (tout en `review_status: draft`, accents corrects, un seul niveau d'orthographe `orthographe`) : quatre règles `regle_homophone_a_a` (a/à), `regle_homophone_et_est` (et/est), `regle_homophone_son_sont` (son/sont), `regle_homophone_on_ont` (on/ont), chacune avec son test de substitution dans l'énoncé, l'indice et l'explication (« avait », « était », « étaient »/« mon », « avaient »/« il »). Compétence commune `homophones_grammaticaux` (même granularité que `accord_groupe_nominal` au CE1). Par règle : 8 choix multiples, 4 corrections de phrase, 3 dictées (3 par règle et non 3 par chapitre, comme au CE1, pour que chaque mission de dictée ait de quoi varier) ; 3 missions par règle (12 au total, `mission_10` à `mission_21`). Audio des 12 dictées généré avec Piper (point 20). `data/curriculum/ce2_homophones_grammaticaux.json` ajouté (région `marais_des_homophones`, toujours non consommé par le moteur).
**Carte par niveau** : 21 missions sur une seule carte ne tiennent pas (marqueurs de 160 px sur 1152 px). `ExerciseEngine.get_missions_for_level()` filtre sur le niveau de la règle de la mission (pas de champ supplémentaire dans les missions), `ProgressManager.school_level()` expose le niveau du profil, et `world_map` n'affiche que les missions du niveau du profil. Le cahier des charges (« un enfant de CE2 qui rencontre une difficulté sur une notion de CE1 pourra revenir à un entraînement adapté ») est respecté par un bouton « Revoir le CE1 » / « Retour au CE2 » visible uniquement pour un profil CE2. Un profil CE1 ne voit pas le CE2. Disposition CE2 : grille 4 colonnes (une par règle) × 3 lignes (QCM, correction, dictée) ; le test d'écart (point 26) vérifie maintenant chaque niveau séparément.
**Non vérifié** : rendu de la carte CE2 (12 marqueurs), du bouton de bascule, et écoute des 12 voix — voir `docs/testing/manual-checklist.md`. Les textes plus anciens du CE1 (indices/explications) n'ont pas d'accents ; non corrigé ici, à traiter à part.