Class_generator/DRS_IMPLEMENTATION_PLAN.md
StillHammer 194d65cd76 Implement strict DRS interface system for all 11 exercise modules
MAJOR ARCHITECTURE UPDATE - C++ Style Interface Enforcement

🔒 **Strict Interface System**:
- Created DRSExerciseInterface (10 required methods)
- Created ProgressSystemInterface (17 required methods)
- Updated ImplementationValidator with 3-phase validation
- Red screen errors for missing implementations

📚 **11/11 Exercise Modules Implemented**:
 VocabularyModule - Local flashcard validation
 TextAnalysisModule - AI text comprehension
 GrammarAnalysisModule - AI grammar correction
 TranslationModule - AI translation validation
 OpenResponseModule - AI open-ended responses
 PhraseModule - Phrase comprehension
 AudioModule - Audio listening exercises
 ImageModule - Visual comprehension
 GrammarModule - Grammar exercises
 TextModule - Reading comprehension
 WordDiscoveryModule - Vocabulary introduction

🎯 **Required Methods (All Modules)**:
- Lifecycle: init(), render(), destroy()
- Exercise: validate(), getResults(), handleUserInput()
- Progress: markCompleted(), getProgress()
- Metadata: getExerciseType(), getExerciseConfig()

📋 **Documentation**:
- Updated CLAUDE.md with complete interface hierarchy
- Created DRS_IMPLEMENTATION_PLAN.md (roadmap)
- Documented enforcement rules and patterns

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-08 13:43:25 +08:00

576 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 📋 DRS EXERCISE MODULES - IMPLEMENTATION PLAN
**Goal**: Réimplémenter tous les modules DRS pour respecter `DRSExerciseInterface`
**Status**: 🔴 0/11 modules conformes
---
## 📊 ÉTAT DES LIEUX - 11 Modules Existants
### ✅ Modules AI (Score-Based) - 5 modules
Utilisent l'IA pour validation et scoring (0-100 points)
1. **TextAnalysisModule** - Analyse de texte avec AI
2. **GrammarAnalysisModule** - Correction grammaticale AI
3. **TranslationModule** - Traduction validée par AI
4. **OpenResponseModule** - Réponse libre évaluée par AI
5. **AudioModule** - Analyse audio avec transcription
### 🎯 Modules Locaux (Non-AI) - 6 modules
Validation locale sans IA
6. **VocabularyModule** - Flashcards spaced repetition
7. **WordDiscoveryModule** - Découverte passive de vocabulaire
8. **PhraseModule** - Pratique de phrases
9. **GrammarModule** - Exercices de grammaire structurés
10. **TextModule** - Lecture et compréhension de textes
11. **ImageModule** - Description d'images
---
## 🎯 INTERFACE STRICTE - 10 Méthodes Requises
Chaque module DOIT implémenter:
### **Lifecycle** (3 méthodes)
```javascript
async init(config, content) // Initialize module
async render(container) // Render UI
async destroy() // Cleanup
```
### **Exercise Logic** (3 méthodes)
```javascript
async validate(userAnswer) // Returns { isCorrect, score, feedback, explanation }
getResults() // Returns { score, attempts, timeSpent, completed, details }
handleUserInput(event, data) // Handle user interactions
```
### **Progress Tracking** (2 méthodes)
```javascript
async markCompleted(results) // Mark as completed + save progress
getProgress() // Returns { percentage, currentStep, totalSteps, itemsCompleted, itemsTotal }
```
### **Metadata** (2 méthodes)
```javascript
getExerciseType() // Returns type string
getExerciseConfig() // Returns { type, difficulty, estimatedTime, prerequisites, metadata }
```
---
## 📈 ANALYSE PAR MODULE
### 1⃣ **VocabularyModule** (43KB)
**État**: 🟡 Partiel (3/10 méthodes)
**Existant**:
-`async init()` - Ligne 47
-`async validate(userInput, context)` - Ligne 169
-`getProgress()` - Ligne 220
**Manquant**:
-`async render(container)` - Logique UI dispersée, pas de méthode centralisée
-`async destroy()` - Pas de cleanup formel
-`getResults()` - Résultats calculés à la volée, pas de méthode dédiée
-`handleUserInput(event, data)` - Géré inline dans render
-`async markCompleted(results)` - Sauvegarde dispersée
-`getExerciseType()` - Type non formalisé
-`getExerciseConfig()` - Config non structurée
**Priorité**: 🔥 **HAUTE** (module principal, bien structuré)
---
### 2⃣ **TextAnalysisModule** (24KB)
**État**: 🟡 Partiel (2/10 méthodes)
**Existant**:
-`async validate(userInput, context)` - Ligne 127 (AI validation)
-`getProgress()` - Ligne 204
**Manquant**:
-`async init(config, content)` - Pas d'init formelle
-`async render(container)` - UI dispersée
-`async destroy()` - Pas de cleanup
-`getResults()` - Résultats inline
-`handleUserInput(event, data)` - Pas formalisé
-`async markCompleted(results)` - Pas formalisé
-`getExerciseType()` - Manque
-`getExerciseConfig()` - Manque
**Priorité**: 🔥 **HAUTE** (AI module, pattern pour autres)
---
### 3⃣ **GrammarAnalysisModule** (26KB)
**État**: 🟡 Partiel (2/10 méthodes)
**Existant**:
-`async validate(userInput, context)` - AI correction
-`getProgress()` - Basique
**Manquant**: Mêmes que TextAnalysisModule
**Priorité**: 🔶 **MOYENNE** (similaire à TextAnalysis)
---
### 4⃣ **TranslationModule** (30KB)
**État**: 🟡 Partiel (2/10 méthodes)
**Existant**:
-`async validate(userInput, context)` - AI translation check
-`getProgress()` - Basique
**Manquant**: Mêmes que TextAnalysisModule
**Priorité**: 🔶 **MOYENNE** (AI module standard)
---
### 5⃣ **OpenResponseModule** (21KB)
**État**: 🟡 Partiel (2/10 méthodes)
**Existant**:
-`async validate(userInput, context)` - AI evaluation
-`getProgress()` - Basique
**Manquant**: Mêmes que TextAnalysisModule
**Priorité**: 🔶 **MOYENNE** (AI module générique)
---
### 6⃣ **WordDiscoveryModule** (11KB)
**État**: 🟡 Partiel (1/10 méthodes)
**Existant**:
-`async init()` - Basique
**Manquant**: Presque tout
**Priorité**: 🟢 **BASSE** (va fusionner avec VocabularyModule)
---
### 7⃣ **PhraseModule** (31KB)
**État**: 🟡 Partiel (2/10 méthodes)
**Existant**:
-`async validate()` - Local validation
-`getProgress()` - Basique
**Manquant**: 8 méthodes
**Priorité**: 🔶 **MOYENNE** (local validation, pattern différent)
---
### 8⃣ **GrammarModule** (74KB)
**État**: 🔴 Ancien (code legacy volumineux)
**Existant**: Code legacy, structure différente
**Priorité**: 🟢 **BASSE** (peut être remplacé par GrammarAnalysisModule)
---
### 9⃣ **TextModule** (52KB)
**État**: 🔴 Ancien (code legacy)
**Existant**: Code legacy, structure différente
**Priorité**: 🟢 **BASSE** (peut être remplacé par TextAnalysisModule)
---
### 🔟 **AudioModule** (68KB)
**État**: 🟡 Partiel
**Existant**:
-`async validate()` - Audio analysis
**Priorité**: 🔶 **MOYENNE** (module spécialisé)
---
### 1⃣1⃣ **ImageModule** (69KB)
**État**: 🟡 Partiel
**Existant**:
-`async validate()` - Image analysis
**Priorité**: 🔶 **MOYENNE** (module spécialisé)
---
## 🗺️ ROADMAP D'IMPLÉMENTATION
### 🎯 **PHASE 1 - Modules Prioritaires** (2 modules)
#### **1.1 VocabularyModule** ⭐ PRIORITÉ #1
**Pourquoi**: Module le plus utilisé, bien structuré, pas d'IA
**Tâches**:
1. ✅ Garder `init()`, `validate()`, `getProgress()` existants
2. 🔨 Extraire logique UI dans `render(container)`
3. 🔨 Créer `destroy()` pour cleanup
4. 🔨 Créer `getResults()` pour statistiques finales
5. 🔨 Créer `handleUserInput(event, data)` pour boutons
6. 🔨 Créer `markCompleted(results)` pour sauvegarde
7. 🔨 Créer `getExerciseType()``'vocabulary'`
8. 🔨 Créer `getExerciseConfig()` avec difficulty, time, etc.
**Estimation**: 2-3 heures
---
#### **1.2 TextAnalysisModule** ⭐ PRIORITÉ #2
**Pourquoi**: Module AI de référence, pattern pour tous les modules AI
**Tâches**:
1. ✅ Garder `validate()` et `getProgress()` existants
2. 🔨 Créer `init(config, content)` pour setup
3. 🔨 Créer `render(container)` pour UI
4. 🔨 Créer `destroy()` pour cleanup
5. 🔨 Créer `getResults()` avec AI score + metadata
6. 🔨 Créer `handleUserInput(event, data)`
7. 🔨 Créer `markCompleted(results)`
8. 🔨 Créer `getExerciseType()``'text-analysis'`
9. 🔨 Créer `getExerciseConfig()`
**Estimation**: 2-3 heures
---
### 🔄 **PHASE 2 - Modules AI** (3 modules)
**Pattern**: Copier structure de TextAnalysisModule, adapter validation
#### **2.1 GrammarAnalysisModule**
- Utiliser pattern de TextAnalysisModule
- Adapter `validate()` pour grammar checking
- **Estimation**: 1-2 heures
#### **2.2 TranslationModule**
- Utiliser pattern de TextAnalysisModule
- Adapter `validate()` pour translation
- **Estimation**: 1-2 heures
#### **2.3 OpenResponseModule**
- Utiliser pattern de TextAnalysisModule
- Adapter `validate()` pour open responses
- **Estimation**: 1-2 heures
---
### 📦 **PHASE 3 - Modules Locaux** (2 modules)
#### **3.1 PhraseModule**
- Utiliser pattern de VocabularyModule
- Validation locale (pas d'AI)
- **Estimation**: 1-2 heures
#### **3.2 Fusionner WordDiscoveryModule**
- Intégrer dans VocabularyModule (discovery mode)
- Supprimer module séparé
- **Estimation**: 1 heure
---
### 🎨 **PHASE 4 - Modules Spécialisés** (2 modules)
#### **4.1 AudioModule**
- Audio player + transcription
- AI analysis similaire TextAnalysisModule
- **Estimation**: 2-3 heures
#### **4.2 ImageModule**
- Image display + zoom
- AI vision analysis
- **Estimation**: 2-3 heures
---
### 🗑️ **PHASE 5 - Cleanup Legacy** (2 modules)
#### **5.1 Supprimer GrammarModule**
- Remplacé par GrammarAnalysisModule (AI)
- Archiver code si besoin
#### **5.2 Supprimer TextModule**
- Remplacé par TextAnalysisModule (AI)
- Archiver code si besoin
---
## 🛠️ STRATÉGIE D'IMPLÉMENTATION
### **Pattern 1: AI Modules** (TextAnalysis, Grammar, Translation, OpenResponse, Audio, Image)
```javascript
import DRSExerciseInterface from '../interfaces/DRSExerciseInterface.js';
class ModuleName extends DRSExerciseInterface {
constructor() {
super('ModuleName');
this.config = null;
this.content = null;
this.container = null;
this.startTime = null;
this.attempts = 0;
this.currentScore = 0;
}
async init(config, content) {
this.config = config;
this.content = content;
this.startTime = Date.now();
}
async render(container) {
this.container = container;
// Render UI logic here
}
async destroy() {
if (this.container) {
this.container.innerHTML = '';
this.container = null;
}
}
async validate(userAnswer) {
this.attempts++;
// AI validation logic
return {
isCorrect: true/false,
score: 0-100,
feedback: '...',
explanation: '...',
metadata: {}
};
}
getResults() {
return {
score: this.currentScore,
attempts: this.attempts,
timeSpent: Date.now() - this.startTime,
completed: this.currentScore >= 70,
details: { /* exercise-specific */ }
};
}
handleUserInput(event, data) {
// Handle button clicks, input changes, etc.
}
async markCompleted(results) {
// Save to progress system
}
getProgress() {
return {
percentage: 100, // or calculate based on steps
currentStep: 1,
totalSteps: 1,
itemsCompleted: this.currentScore >= 70 ? 1 : 0,
itemsTotal: 1
};
}
getExerciseType() {
return 'module-type';
}
getExerciseConfig() {
return {
type: this.getExerciseType(),
difficulty: 'medium',
estimatedTime: 5,
prerequisites: [],
metadata: this.config
};
}
}
```
### **Pattern 2: Local Modules** (Vocabulary, Phrase)
```javascript
import DRSExerciseInterface from '../interfaces/DRSExerciseInterface.js';
class ModuleName extends DRSExerciseInterface {
constructor() {
super('ModuleName');
this.items = [];
this.currentIndex = 0;
this.results = [];
}
async init(config, content) {
this.config = config;
this.items = content.items; // Extract items
this.startTime = Date.now();
}
async render(container) {
this.container = container;
this._renderCurrentItem();
}
async destroy() {
this.container.innerHTML = '';
this.container = null;
}
async validate(userAnswer) {
// Local validation (no AI)
const isCorrect = userAnswer === this.items[this.currentIndex].answer;
this.results.push({ isCorrect, answer: userAnswer });
return {
isCorrect,
score: isCorrect ? 100 : 0,
feedback: isCorrect ? 'Correct!' : 'Incorrect',
explanation: '...',
metadata: {}
};
}
getResults() {
const correctCount = this.results.filter(r => r.isCorrect).length;
const score = Math.round((correctCount / this.results.length) * 100);
return {
score,
attempts: this.results.length,
timeSpent: Date.now() - this.startTime,
completed: this.currentIndex >= this.items.length,
details: { correctCount, totalCount: this.items.length }
};
}
handleUserInput(event, data) {
// Handle next/previous/answer buttons
}
async markCompleted(results) {
// Save progress
}
getProgress() {
return {
percentage: Math.round((this.currentIndex / this.items.length) * 100),
currentStep: this.currentIndex + 1,
totalSteps: this.items.length,
itemsCompleted: this.results.filter(r => r.isCorrect).length,
itemsTotal: this.items.length
};
}
getExerciseType() {
return 'module-type';
}
getExerciseConfig() {
return {
type: this.getExerciseType(),
difficulty: 'easy',
estimatedTime: this.items.length * 0.5,
prerequisites: [],
metadata: this.config
};
}
}
```
---
## ✅ CHECKLIST DE VALIDATION
Pour chaque module réimplémenté:
### **Implémentation**
- [ ] Hérite de `DRSExerciseInterface`
- [ ] Implémente les 10 méthodes requises
- [ ] Méthodes retournent le bon format
- [ ] Pas d'erreur au startup (validation stricte)
### **Lifecycle**
- [ ] `init()` initialise correctement config et content
- [ ] `render()` crée l'UI dans le container
- [ ] `destroy()` nettoie proprement (remove listeners, clear DOM)
### **Exercise Logic**
- [ ] `validate()` retourne `{ isCorrect, score, feedback, explanation }`
- [ ] `getResults()` retourne stats complètes
- [ ] `handleUserInput()` gère tous les events
### **Progress**
- [ ] `markCompleted()` sauvegarde dans ProgressTracker
- [ ] `getProgress()` retourne progression en temps réel
### **Metadata**
- [ ] `getExerciseType()` retourne string unique
- [ ] `getExerciseConfig()` retourne config complète
### **Testing**
- [ ] Module se charge sans erreur
- [ ] UI s'affiche correctement
- [ ] Validation fonctionne (AI ou local)
- [ ] Progress se sauvegarde
- [ ] Cleanup fonctionne (pas de memory leak)
---
## 📊 ESTIMATION TOTALE
| Phase | Modules | Temps Estimé |
|-------|---------|--------------|
| Phase 1 | 2 (Vocabulary, TextAnalysis) | 4-6h |
| Phase 2 | 3 (Grammar, Translation, OpenResponse) | 3-6h |
| Phase 3 | 2 (Phrase, WordDiscovery fusion) | 2-3h |
| Phase 4 | 2 (Audio, Image) | 4-6h |
| Phase 5 | 2 (Cleanup legacy) | 1h |
| **TOTAL** | **11 modules** | **14-22h** |
---
## 🎯 ORDRE DE PRIORITÉ
1. 🔥 **VocabularyModule** - Module principal, pas d'AI, bien structuré
2. 🔥 **TextAnalysisModule** - Template pour tous modules AI
3. 🔶 **GrammarAnalysisModule** - Copie pattern TextAnalysis
4. 🔶 **TranslationModule** - Copie pattern TextAnalysis
5. 🔶 **OpenResponseModule** - Copie pattern TextAnalysis
6. 🔶 **PhraseModule** - Local validation, copie pattern Vocabulary
7. 🔶 **AudioModule** - Spécialisé, similaire TextAnalysis
8. 🔶 **ImageModule** - Spécialisé, similaire TextAnalysis
9. 🟢 **WordDiscoveryModule** - Fusionner dans Vocabulary
10. 🟢 **GrammarModule (legacy)** - Supprimer/archiver
11. 🟢 **TextModule (legacy)** - Supprimer/archiver
---
## 🚀 PROCHAINES ÉTAPES
### **Immédiat** (à faire maintenant):
1. Valider ce plan d'implémentation
2. Commencer par **VocabularyModule** (priorité #1)
3. Une fois validé, dupliquer pattern pour autres modules
### **Validation Plan**:
- ❓ Plan approuvé ?
- ❓ Ordre de priorité correct ?
- ❓ Temps estimé réaliste ?
- ❓ Pattern de code acceptable ?
---
**Status**: 📝 **PLAN PRÊT - AWAITING APPROVAL**