Vague 6 : la dernière réponse reste sur son écran de correction ; « Terminer l’exercice » / « Terminer le QCM » ouvre ensuite le carton de fin. La session et ses récompenses sont déjà enregistrées à la dernière validation, le bouton ne modifie que l’affichage. Un repère d’onglet permet de retrouver cette correction au rechargement, sans rejouer l’animation ; voir la livraison et ses limites (../ESPACE_ELEVE_VAGUE6_Q_LIVRAISON.md). Les descriptions antérieures de fin immédiate ci-dessous sont historiques.
Les définitions, métadonnées, tags, présentation et paramètres sont désormais externalisés en JSON : voir le format versionné et les exemples. Le format de session 1.0 reste inchangé.
28 octobre 2026. Développement local sur feature/questionnaires-addition, base c51a79f de integration/espace-eleve-vague2. Pas de publication ni de modification des autres worktrees. Pour intégrer les ajustements simultanés de cohabitation, reprendre les petits raccords de StudentApp après comparaison, sans remplacer ce composant en bloc.
Activités disponibles
Deux sessions de dix additions, entiers tirés indépendamment entre −20 et +20 inclus (répétitions possibles). Niveau 5e, difficulté 1/5, paramètres de test retenus pour ce lot. Un exerciseur à saisie libre d’entier signé et un QCM à quatre propositions distinctes avec une seule bonne réponse. Correction après chaque validation, score final. Une entrée invalide ne valide pas la question ; une réponse incorrecte compte exactement une erreur. Une seule validation par question, sans indice ni nouvelle tentative dans cette version.
Routes : /rubriques/outils-eleves-exerciseurs et /rubriques/outils-eleves-qcm. Chaque catégorie affiche sa propre carte et son activité interactive, dans l’enveloppe du portail. L’espace élève ne contient plus de cartes ni de moteur de questionnaire : il conserve uniquement le suivi/relecture et le transfert. Les anciens fragments /eleve/#exerciseur et #qcm redirigent vers les catégories, avec leurs contrôles habituels. Leurs identifiants, droits et contenus sont conservés ; aucune nouvelle fiche. Seuls les deux blocs standard « À venir » encore exactement identiques sont masqués ; tout bloc personnalisé reste visible. Le message « Aucune ressource » ne s’affiche pas dans ces deux catégories pourvues d’une activité.
Moteur extensible
src/lib/questionnaires/engine.mjs: validation des descripteurs/questions, registre de modalités de confiance et correction pure. Réponse libre entière (integer), choix unique (single-choice), choix multiple (multiple-choice). De 2 à 20 propositions, identifiants et libellés distincts. Choix multiple évalué par égalité exacte d’ensembles, indépendamment de l’ordre ; pas de crédit partiel. La saisie entière accepte espaces autour du nombre et entre signe et chiffres, signe +/−, zéro et une seule paire de parenthèses englobantes (ex.( −4 )). Elle refuse espaces entre chiffres, parenthèses imbriquées/mal fermées, expressions, décimales et notation exponentielle. Limite de saisie 30 caractères et entier JavaScript sûr ; la réponse originale, seulement élaguée aux extrémités, est conservée.addition.mjs: catalogue explicite de deux fichiers JSON versionnés ;definition.mjsles valide etgenerators.mjsmatérialise leurs sources. Choix des distracteurs borné et mélange des quatre positions, y compris zéro et nombres opposés. Niveau est un libellé extensible (6e à terminale, post-bac…), difficulté un entier de 1 à 5. Le catalogue de niveaux n’est pas verrouillé.ResponseInput.svelte: rendu séparé du calcul : champ, radios ou cases à cocher. Ajouter une modalité exige un validateur/correcteur et son rendu de confiance, jamais du code reçu dans un paquet.sessions.mjs: adaptateur des exemples vers le contrat élève existant. Le moteur de réponse est général ; ce raccord et son générateur restent propres aux deux exemples. Les modes fixe/banque sont désormais validés et matérialisables depuis les définitions JSON ; aucun importateur graphique, éditeur de banque ni générateur général sous contraintes pédagogiques n’est livré.
Stockage, reprise et transfert
Réutilisation exclusive de activityAdapter, saveSession, readSession, listSummaries et du contrat 1.0 ; aucune modification du schéma ou des modules student/*. Les dix questions sont figées dès la création dans le détail, avec statut unanswered ; questionCount=10 dès le début et counters.answered, correct, planned indiquent l’avancement. Les paramètres primitifs contiennent questionnaireVersion, prompt, response (JSON inerte borné à 1 000 caractères), level, difficulty. Le prompt lisible inclut les propositions dans leur ordre réel : la relecture générique reste fidèle. La réponse enregistrée conserve le texte saisi ou les libellés choisis.
Chaque réponse attend la fin de la transaction avant progression. Une erreur de quota laisse la réponse à l’écran et ne donne aucune récompense. La dernière réponse termine automatiquement la session, immutable ensuite. Les doublons de validation sont refusés. Une reprise après résultat d’écriture ambigu n’accepte que le paquet strictement identique, avec sa même identité.
L’option « Faire une pause » a été retirée à la demande du propriétaire. La sauvegarde automatique reste active : recharger puis « Reprendre » retrouve les questions initiales et la première non validée. Une saisie non validée peut être perdue à la fermeture. Abandon explicite conserve le résumé, ferme définitivement la session et ne récompense pas. Un détail évincé ne peut plus être repris. Limites communes inchangées : 100 détails / 20 Mio, session 1 Mio ; résumés conservés.
Sur ordinateur : focus initial sur la réponse, Entrée valide le formulaire, le focus passe au bouton « Question suivante », une nouvelle Entrée avance et rend le focus à la réponse. Les répétitions automatiques d’une touche Entrée maintenue sont neutralisées. Après erreur de saisie ou d’écriture, le focus revient à la réponse. Le QCM utilise les contrôles natifs radios/cases (Tab, flèches, Espace, Entrée).
QuestionnaireCategory.svelte ouvre le store personnel avec les règles communes, puis le ferme au démontage. Les catégories et l’espace élève partagent la même base par origine/navigateur. Aucun nouveau stockage ni envoi automatique. Les catégories ne font pas partie de la portée hors connexion /eleve/ : le site nécessite le réseau. La démonstration séparée de l’espace élève ne change pas la base utilisée par les catégories. La réception importe uniquement la session, jamais une récompense reçue.
Récompenses de test
rewards.mjs déclare la règle de succès premier-exerciseur-addition/1, liée à l’identité/version/convention de l’exerciseur. Terminer les dix réponses suffit, même avec dix erreurs. QUESTIONNAIRE_RULES est passé à l’ouverture du store dans les catégories et dans StudentApp. Le succès est inscrit dans le registre commun une fois ; les autres succès et séries ne sont pas remplacés.
Le trophée QCM est cumulable : un exemplaire par session QCM terminée de cette version, dix questions et dix réponses. Il est calculé depuis les résumés durables dédupliqués par sessionId, sans ajouter une clé au registre strict des trophées de régularité. C’est un raccord applicatif, pas une extension silencieuse du contrat commun. Réimport, rechargement et éviction des détails ne changent pas le compte. Un futur moteur commun de trophées configurables devra être coordonné ; cette version ne prétend pas le livrer.
Les sessions incomplètes, abandonnées et futures ne comptent pas. Les trophées de régularité 1/jour, 3/jour, 7/30 jours existants s’ajoutent normalement. La date d’origine est préservée lors de l’import ; pas de règle reçue ou de récompense injectée depuis le fichier. Comme le socle local, ce système n’est pas antifraude et ne constitue pas une évaluation professeur.
Présentation des récompenses — correction du propriétaire
Aucune liste, vitrine, compteur de succès/trophées ou panneau de régularité n’est affiché, ni dans les catégories ni dans l’espace élève. Le calcul et les sauvegardes internes restent inchangés.
RewardCelebration.svelte fournit une notification temporaire de 4,2 secondes : médaillon provisoire, apparition avec rebond, éclats, bouton de fermeture. Aucun son, aucune prise de focus, annonce accessible role=status, animations supprimées avec prefers-reduced-motion. Les stickers/badges définitifs restent à créer ; les symboles actuels sont des emplacements provisoires.
Notification seulement après écriture confirmée d’une session terminée : première obtention du succès, ou chaque nouveau QCM terminé. Refaire l’exerciseur déjà récompensé ne rejoue pas sa notification. Le rechargement, la relecture et l’import ne rejouent pas d’animation. Aucun catalogue de récompenses n’est introduit. La notification n’est pas une preuve antifraude.
Vérifications
Première livraison : six nouveaux tests moteur ; 347 tests exécutés, dont cinq tests historiques RB-06 bloqués par des permissions Windows puis réussis en rejouant leur fichier avec les permissions nécessaires (7/7). Recette initiale : sauvegarde/reprise, quota simulé, déduplication des imports, réception locale, conservation du trophée après éviction.
Correction du 28 octobre : 24 tests ciblés moteur/socle/interface réussis ; compilation et postbuild PWA réussis. Recette navigateur sur les vraies routes Astro compilées et catalogue fictif isolé : carte uniquement dans sa catégorie, aucune pause ni liste de récompenses, autofocus sur les dix réponses, focus sur Suivante, première animation puis disparition automatique, deuxième exerciseur sans nouvelle animation de succès, animation QCM, sessions conservées dans l’espace élève sans cartes ni liste. Aucune erreur console. En complément, pressions Entrée réelles : réponse saisie → validation → seconde Entrée → question suivante avec focus sur le champ.
Reproduire : npm run build, puis node tests/questionnaires-harness/server.mjs (port 4394 et backend 4395 par défaut, variable QUESTIONNAIRE_TEST_PORT). Ouvrir /recipe/ puis lancer. Cette recette crée des données fictives sur son origine locale et un catalogue temporaire sous .work, sans effacer de données existantes. Pour vérifier la première obtention, utiliser une origine/profil de test neuf. Le serveur sert les vraies routes compilées via un relais local, avec configuration fictive propre. Les deux catégories permettent aussi une vérification manuelle.
Non vérifiés dans ce lot : téléphone physique iOS/Android, clavier virtuel, caméra/QR réel, installation PWA, relais de transfert réseau. Aucun éditeur de questionnaires ni choix dynamique niveau/difficulté : métadonnées déclarées dans les descripteurs.
Intégration et retour arrière
Livrer les composants/modules/tests, le raccord de la page de rubrique et les retraits ciblés de StudentApp. Coordonner ces derniers avec le chantier de cohabitation sans remplacer ses fichiers complets. Aucun changement de Ressources/contenus, aucune nouvelle fiche à migrer, aucun secret ni configuration serveur de production. Aucun déploiement ni redémarrage du VPS.
Revenir au code antérieur ne doit pas effacer les bases : les sessions demeurent compatibles avec le lecteur 1.0. Les succès restent au registre et les trophées QCM sont calculables depuis les résumés. Toute publication bêta est une livraison distincte, avec BETA.md et PUBLIC_BETA_MODE=1.
Catalogue — vague 5
Recherche par titre insensible à la casse et aux accents, filtres combinés par tag (identifiant), niveau et difficulté. Les choix sont extraits des définitions actives de la catégorie ; un filtre matière apparaît seulement si plusieurs matières existent. Aucune taxonomie inventée. Résultat annoncé, état vide et réinitialisation ; les sessions à reprendre restent accessibles indépendamment des filtres. Ces filtres portent sur les activités intégrées, pas sur les éventuels documents éditoriaux de la page. Aucun filtre n’altère une session en cours.
Le compteur publicTree ajoute les activités intégrées aux ressources déverrouillées des rubriques Exerciseurs/QCM existantes et accessibles. Les droits hérités, dates et indisponibilités des documents restent appliqués ; aucune rubrique n’est créée ni révélée par ce calcul. Les dates de mise à jour ne sont pas inventées. Les parents additionnent les compteurs de leurs enfants visibles ; les cartes avec enfants conservent leur libellé en nombre de rubriques. Les activités intégrées suivent les droits de leur rubrique, comme leur montage actuel ; elles n’ont pas de droit ou date individuels dans le JSON v1.
La proposition de module transversal (CALCUL_FORMEL_PROPOSITION.md) est distincte du correctif de saisie entière : aucune bibliothèque symbolique adoptée. Voir la livraison Q vague 5 (../ESPACE_ELEVE_VAGUE5_Q_LIVRAISON.md) pour les vérifications.