**Core Architecture:** - StrictInterface: Base class with visual error enforcement (red screen, sound, shake) - ProgressItemInterface: Strict contract requiring 4 methods (validate, serialize, getWeight, canComplete) - Implementation validation at startup - app refuses to start if methods missing **Progress Items (8 types with realistic weights):** - VocabularyDiscoveryItem (1pt) - Passive word exposure, no prerequisites - VocabularyMasteryItem (1pt) - Active flashcards, requires discovery - PhraseItem (6pts, 3x vocab) - Requires vocabulary mastery - DialogItem (12pts, 6x vocab) - Complex, requires vocabulary mastery - TextItem (15pts, 7.5x vocab) - Most complex, requires vocabulary mastery - AudioItem (12pts, 6x vocab) - Requires vocabulary mastery - ImageItem (6pts, 3x vocab) - Requires vocabulary discovered - GrammarItem (6pts, 3x vocab) - Requires vocabulary discovered **Realistic Progress Calculation:** - 1 vocab word = 2 points total (discovery + mastery) - Other items weighted 3x-7.5x heavier for realistic progression - Example: 171 vocab (342pts) + 75 phrases (450pts) + 6 dialogs (72pts) + 3 texts (45pts) = 909 total points - Discovering all words = 38% progress (not 76%) **Services:** - ContentProgressAnalyzer: Scans chapter content, creates progress items, calculates total weight - ProgressTracker: Manages state, tracks completion, saves progress to server - ImplementationValidator: Validates all implementations at startup **Integration:** - Application.js validates ALL item implementations before startup - Missing methods trigger full-screen red error with impossible-to-ignore UI - Sound alert + screen shake in dev mode **Pedagogical Flow Enforced:** Discovery (passive) → Mastery (active) → Application (context) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
35 KiB
CLAUDE.md - Project Context & Instructions
📋 Project Overview
Class Generator 2.0 - Complete rewrite of educational games platform with ultra-modular architecture.
🎯 Current Mission
Building a bulletproof modular system with strict separation of concerns using vanilla JavaScript, HTML, and CSS. The architecture enforces inviolable responsibility patterns with sealed modules and dependency injection.
🏗️ Architecture Status
PHASE 1 COMPLETED ✅ - Core foundation built with rigorous architectural patterns:
- ✅ Module.js - Abstract base class with WeakMap privates and sealed instances
- ✅ EventBus.js - Strict event system with validation and module registration
- ✅ ModuleLoader.js - Dependency injection with proper initialization order
- ✅ Router.js - Navigation with guards, middleware, and state management
- ✅ Application.js - Auto-bootstrap system with lifecycle management
- ✅ Development Server - HTTP server with ES6 modules and CORS support
DRS SYSTEM COMPLETED ✅ - Advanced learning modules with dual AI approach:
Core Exercise Generation:
- ✅ ContentLoader - Pure AI content generation when no real content available
- ✅ IAEngine - Multi-provider AI system (OpenAI → DeepSeek → Hard Fail)
- ✅ LLMValidator - Intelligent answer validation with detailed feedback
- ✅ AI Report System - Session tracking with exportable reports (text/HTML/JSON)
- ✅ UnifiedDRS - Component-based exercise presentation system
DRS Exercise Modules:
- ✅ Vocabulary Flashcards - VocabularyModule provides spaced repetition learning (local validation, no AI)
- ✅ Intelligent QCM - AI generates questions + 1 correct + 5 plausible wrong answers (16.7% random chance)
- ✅ Open Analysis Modules - Free-text responses validated by AI with personalized feedback
- ✅ TextAnalysisModule - Deep comprehension with AI coaching (0-100 strict scoring)
- ✅ GrammarAnalysisModule - Grammar correction with explanations (0-100 strict scoring)
- ✅ TranslationModule - Translation validation with multi-language support (0-100 strict scoring)
- ✅ OpenResponseModule - Free-form questions with intelligent evaluation
AI Architecture - PRODUCTION READY:
- ✅ AI-Mandatory System - No mock/fallback, real AI only, ensures educational quality
- ✅ Strict Scoring Logic - Wrong answers: 0-20 points, Correct answers: 70-100 points
- ✅ Multi-Provider Fallback - OpenAI → DeepSeek → Hard Fail (no fake responses)
- ✅ Comprehensive Testing - 100% validation with multiple test scenarios
- ✅ Smart Prompt Engineering - Context-aware prompts with proper language detection
- ⚠️ Cache System - Currently disabled for testing (see Cache Management section)
⚠️ CRITICAL ARCHITECTURAL SEPARATION
🎯 DRS vs Games - NEVER MIX
DRS (Dynamic Response System) - Educational exercise modules in src/DRS/:
- ✅ VocabularyModule.js - Spaced repetition flashcards (local validation)
- ✅ TextAnalysisModule.js - AI-powered text comprehension
- ✅ GrammarAnalysisModule.js - AI grammar correction
- ✅ TranslationModule.js - AI translation validation
- ✅ All modules in
src/DRS/- Educational exercises with strict interface compliance
Games - Independent game modules in src/games/:
- ❌ FlashcardLearning.js - Standalone flashcard game (NOT part of DRS)
- ❌ Other game modules - Entertainment-focused, different architecture
- ❌ NEVER import games into DRS - Violates separation of concerns
🚫 FORBIDDEN MIXING
// ❌ NEVER DO THIS - DRS importing games
import FlashcardLearning from '../games/FlashcardLearning.js';
// ✅ CORRECT - DRS uses its own modules
import VocabularyModule from './exercise-modules/VocabularyModule.js';
Rule: DRS = Educational Exercises, Games = Entertainment. They MUST remain separate.
🔥 Critical Requirements
Architecture Principles (NON-NEGOTIABLE)
- Inviolable Responsibility - Each module has exactly one purpose
- Zero Direct Dependencies - All communication via EventBus only
- Sealed Instances - Modules cannot be modified after creation
- Private State - Internal data completely inaccessible via WeakMap
- Contract Enforcement - Abstract methods must be implemented
- Dependency Injection - No globals, everything injected through constructor
Technical Constraints
- Vanilla JS/HTML/CSS only - No frameworks
- ES6 Modules - Import/export syntax required
- HTTP Protocol - Never file:// (use development server)
- Modular CSS - Component-scoped styling
- Event-Driven - No direct module coupling
UI/UX Design Principles (CRITICAL)
- NO SCROLL POLICY - All interfaces MUST fit within viewport height without scrolling
- Height Management - Vertical space is precious, horizontal space is abundant
- Compact Navigation - Top bars and headers must be minimal height
- Responsive Layout - Use available width, preserve viewport height
- Mobile-First - Design for smallest screens first, then scale up
🚀 Development Workflow
Starting the System
# Option 1: Windows batch file
start.bat
# Option 2: Node.js directly
node server.js
# Option 3: NPM scripts
npm start
Access: http://localhost:3000
Development Server Features
- ✅ ES6 modules support
- ✅ CORS enabled for online communication
- ✅ Proper MIME types for all file formats
- ✅ Development-friendly caching (assets cached, HTML not cached)
- ✅ Graceful error handling with styled 404 pages
📁 Project Structure
├── src/
│ ├── core/ # COMPLETED - Core system (sealed)
│ │ ├── Module.js # Abstract base class
│ │ ├── EventBus.js # Event communication system
│ │ ├── ModuleLoader.js # Dependency injection
│ │ ├── Router.js # Navigation system
│ │ └── index.js # Core exports
│ ├── DRS/ # COMPLETED - DRS educational modules
│ │ ├── exercise-modules/ # Educational exercise modules
│ │ ├── services/ # AI and validation services
│ │ └── interfaces/ # Module interfaces
│ ├── games/ # SEPARATE - Independent game modules
│ │ └── FlashcardLearning.js # External flashcard game (NOT part of DRS)
│ ├── components/ # TODO - UI components
│ ├── content/ # TODO - Content system
│ ├── styles/ # COMPLETED - Modular CSS
│ │ ├── base.css # Foundation styles
│ │ └── components.css # Reusable UI components
│ └── Application.js # COMPLETED - Bootstrap system
├── Legacy/ # Archived old system
├── index.html # COMPLETED - Entry point
├── server.js # COMPLETED - Development server
├── start.bat # COMPLETED - Quick start script
├── package.json # COMPLETED - Node.js config
└── README.md # COMPLETED - Documentation
🎮 Creating New Modules
Game Module Template
import Module from '../core/Module.js';
class GameName extends Module {
constructor(name, dependencies, config) {
super(name, ['eventBus']); // Declare dependencies
// Validate dependencies
if (!dependencies.eventBus) {
throw new Error('GameName requires EventBus dependency');
}
this._eventBus = dependencies.eventBus;
this._config = config;
Object.seal(this); // Prevent modification
}
async init() {
this._validateNotDestroyed();
// Set up event listeners
this._eventBus.on('game:start', this._handleStart.bind(this), this.name);
this._setInitialized();
}
async destroy() {
this._validateNotDestroyed();
// Cleanup logic here
this._setDestroyed();
}
// Private methods
_handleStart(event) {
this._validateInitialized();
// Game logic here
}
}
export default GameName;
Registration in Application.js
modules: [
{
name: 'gameName',
path: './games/GameName.js',
dependencies: ['eventBus'],
config: { difficulty: 'medium' }
}
]
🔍 Debugging & Monitoring
Debug Panel (F12 to toggle)
- System status and uptime
- Loaded modules list
- Event history
- Module registration status
Console Access
window.app.getStatus() // Application status
window.app.getCore().eventBus // EventBus instance
window.app.getCore().moduleLoader // ModuleLoader instance
window.app.getCore().router // Router instance
Common Commands
# Check module status
window.app.getCore().moduleLoader.getStatus()
# View event history
window.app.getCore().eventBus.getEventHistory()
# Navigate programmatically
window.app.getCore().router.navigate('/games')
🚧 Next Development Phase
Immediate Tasks (PHASE 2)
- ❌ Component-based UI System - Reusable UI components with scoped CSS
- ❌ Example Game Module - Simple memory game to validate architecture
- ❌ Content System Integration - Port content loading from Legacy
- ❌ Testing Framework - Validate module contracts and event flow
📚 DRS Flashcard System
VocabularyModule.js serves as the DRS's integrated flashcard system:
- ✅ Spaced Repetition - Again, Hard, Good, Easy difficulty selection
- ✅ Local Validation - No AI required, simple string matching with fuzzy logic
- ✅ Mastery Tracking - Integration with PrerequisiteEngine
- ✅ Word Discovery Integration - WordDiscoveryModule transitions to VocabularyModule
- ✅ Full UI - Card-based interface with pronunciation, progress tracking
This eliminates the need for external flashcard games in DRS context.
Known Legacy Issues to Fix
31 bug fixes and improvements from the old system:
- Grammar game functionality issues
- Word Storm duration and difficulty problems
- Memory card display issues
- Adventure game text repetition
- UI alignment and feedback issues
- Performance optimizations needed
🔒 Security & Rigidity Enforcement
Module Protection Layers
- Object.seal() - Prevents property addition/deletion
- Object.freeze() - Prevents prototype modification
- WeakMap privates - Internal state completely hidden
- Abstract enforcement - Missing methods throw errors
- Validation at boundaries - All inputs validated
Error Messages
The system provides explicit error messages for violations:
- "Module is abstract and cannot be instantiated directly"
- "Module name is required and must be a string"
- "EventBus requires module registration before use"
- "Module must be initialized before use"
📝 Development Guidelines
DO's
- ✅ Always extend Module base class for game modules
- ✅ Use EventBus for all inter-module communication
- ✅ Validate dependencies in constructor
- ✅ Call
_setInitialized()after successful init - ✅ Use private methods with underscore prefix
- ✅ Seal objects to prevent modification
- ✅ Start with simple solutions first - Test basic functionality before adding complexity
- ✅ Test code in console first - Validate logic with quick console tests before file changes
DON'Ts
- ❌ Never access another module's internals directly
- ❌ Never use global variables for communication
- ❌ Never modify Module base class or core system
- ❌ Never skip dependency validation
- ❌ Never use file:// protocol (always use HTTP server)
- ❌ NEVER HARDCODE JSON PATHS - Always use dynamic paths based on selected book/chapter
- ❌ Never overcomplicate positioning logic - Use simple CSS transforms (translate(-50%, -50%)) for centering before complex calculations
🧠 Problem-Solving Best Practices
UI Positioning Issues
- Start Simple: Use basic CSS positioning (center with transform) first
- Test in Console: Validate positioning logic with
console.logand direct DOM manipulation - Check Scope: Ensure variables like
contentLoaderare globally accessible when needed - Cache-bust: Add
?v=2to CSS/JS files when browser cache causes issues - Verify Real Dimensions: Use
getBoundingClientRect()only when basic centering fails
Debugging Workflow
- Console First: Test functions directly in browser console before modifying files
- Log Everything: Add extensive logging to understand execution flow
- One Change at a Time: Make incremental changes and test each step
- Simple Solutions Win: Prefer
left: 50%; transform: translateX(-50%)over complex calculations
🎯 Success Metrics
Architecture Quality
- Zero direct coupling between modules
- 100% sealed instances - no external modification possible
- Complete test coverage of module contracts
- Event-driven communication only
Performance Targets
- <100ms module loading time
- <50ms event propagation time
- <200ms application startup time
- Zero memory leaks in module lifecycle
🔄 Migration Notes
From Legacy System
The Legacy/ folder contains the complete old system. Key architectural changes:
Old Approach:
- Global variables and direct coupling
- Manual module registration
- CSS modifications in global files
- Mixed responsibilities in single files
New Approach:
- Strict modules with dependency injection
- Automatic loading with dependency resolution
- Component-scoped CSS injection
- Single responsibility per module
Data Migration
- Content modules need adaptation to new Module base class
- Game logic needs EventBus integration
- CSS needs component scoping
- Configuration needs dependency declaration
📋 COMPREHENSIVE TEST CHECKLIST
🏗️ Architecture Tests
Core System Tests
-
Module.js Tests
- Abstract class cannot be instantiated directly
- WeakMap private data is truly private
- Object.seal() prevents modification
- Lifecycle methods work correctly (init, destroy)
- Validation methods throw appropriate errors
-
EventBus.js Tests
- Event registration and deregistration
- Module validation before event usage
- Event history tracking
- Cross-module communication isolation
- Memory leak prevention on module destroy
-
ModuleLoader.js Tests
- Dependency injection order
- Circular dependency detection
- Module initialization sequence
- Error handling for missing dependencies
- Module unloading and cleanup
-
Router.js Tests
- Navigation guards functionality
- Middleware execution order
- State management
- URL parameter handling
- History management
-
Application.js Tests
- Auto-bootstrap system
- Lifecycle management
- Module registration
- Error recovery
- Debug panel functionality
🎮 DRS System Tests
Module Interface Tests
- ExerciseModuleInterface Tests
- All required methods implemented
- Method signatures correct
- Error throwing for abstract methods
Individual Module Tests
-
TextModule Tests
- Text loading and display
- Question generation/extraction
- AI validation with fallback
- Progress tracking
- UI interaction (buttons, inputs)
- Viewing time tracking
- Results calculation
-
AudioModule Tests
- Audio playback controls
- Playback counting
- Transcript reveal timing
- AI audio analysis
- Progress tracking
- Penalty system for excessive playbacks
-
ImageModule Tests
- Image loading and display
- Zoom functionality
- Observation time tracking
- AI vision analysis
- Question types (description, details, interpretation)
- Progress tracking
-
GrammarModule Tests
- Rule explanation display
- Exercise type variety (fill-blank, correction, etc.)
- Hint system
- Attempt tracking
- AI grammar analysis
- Scoring with penalties/bonuses
🤖 AI Integration Tests
AI Provider Tests
-
OpenAI Integration
- API connectivity test
- Response format validation
- Error handling
- Timeout management
-
DeepSeek Integration
- API connectivity test
- Fallback from OpenAI
- Response format validation
- Error handling
-
AI Fallback System
- Provider switching logic
- Graceful degradation to basic validation
- Status tracking and reporting
- Recovery mechanisms
Response Parsing Tests
- Structured Response Parsing
- [answer]yes/no extraction
- [explanation] extraction
- Error handling for malformed responses
- Multiple format support
💾 Data Persistence Tests
Progress Tracking Tests
-
Mastery Tracking
- Timestamp recording
- Metadata storage
- Progress calculation
- Persistent storage integration
-
Data Merge System
- Local vs external data merging
- Conflict resolution strategies
- Import/export functionality
- Data integrity validation
🎨 UI/UX Tests
Design Principles Tests
-
No Scroll Policy
- All interfaces fit viewport height
- Responsive breakpoint testing
- Mobile viewport compliance
-
Responsive Design
- Mobile-first approach validation
- Horizontal space utilization
- Vertical space conservation
Component Tests
-
Button Interactions
- Hover effects
- Disabled states
- Click handlers
- Loading states
-
Form Controls
- Input validation
- Error display
- Accessibility compliance
- Keyboard navigation
🌐 Network & Server Tests
Development Server Tests
-
ES6 Modules Support
- Import/export functionality
- MIME type handling
- CORS configuration
-
Caching Strategy
- Assets cached correctly
- HTML not cached for development
- Cache invalidation
-
Error Handling
- 404 page display
- Graceful error recovery
- Error message clarity
🔄 Integration Tests
End-to-End Scenarios
-
Complete Exercise Flow
- Module loading
- Exercise presentation
- User interaction
- AI validation
- Progress saving
- Results display
-
Multi-Module Navigation
- Module switching
- State preservation
- Memory cleanup
-
Data Persistence Flow
- Progress tracking across sessions
- Data export/import
- Sync functionality
⚡ Performance Tests
Loading Performance
- Module Loading Times
- <100ms module loading
- <50ms event propagation
- <200ms application startup
Memory Management
- Memory Leaks
- Module cleanup verification
- Event listener removal
- DOM element cleanup
🔒 Security Tests
Module Isolation Tests
- Private State Protection
- WeakMap data inaccessible
- Sealed object modification prevention
- Cross-module boundary enforcement
Input Validation Tests
- Boundary Validation
- All inputs validated
- Error messages for violations
- Malicious input handling
🎯 TESTING PRIORITY
HIGH PRIORITY (Core System)
- Module.js lifecycle and sealing tests
- EventBus communication isolation
- ModuleLoader dependency injection
- Basic DRS module functionality
MEDIUM PRIORITY (Integration)
- AI provider fallback system
- Data persistence and merging
- UI/UX compliance tests
- End-to-end exercise flows
LOW PRIORITY (Polish)
- Performance benchmarks
- Advanced security tests
- Edge case scenarios
- Browser compatibility
🗄️ AI Cache Management
Current Status
The AI response cache system is currently disabled to ensure accurate testing and debugging of the scoring logic.
Cache System Overview
The cache improves performance and reduces API costs by storing AI responses for similar prompts.
Cache Logic (src/DRS/services/IAEngine.js):
// Lines 165-170: Cache check (currently commented out)
const cacheKey = this._generateCacheKey(prompt, options);
if (this.cache.has(cacheKey)) {
this.stats.cacheHits++;
this._log('📦 Cache hit for educational validation');
return this.cache.get(cacheKey);
}
// Lines 198: Cache storage (still active)
this.cache.set(cacheKey, result);
⚠️ Why Cache is Disabled
During testing, we discovered the cache key generation uses only the first 100 characters of prompts:
_generateCacheKey(prompt, options) {
const keyData = {
prompt: prompt.substring(0, 100), // PROBLEMATIC - Too short
temperature: options.temperature || 0.3,
type: this._detectExerciseType(prompt)
};
return JSON.stringify(keyData);
}
Problems identified:
- ❌ Different questions with similar beginnings share cache entries
- ❌ False consistency in test results (all 100% same scores)
- ❌ Masks real AI variance and bugs
- ❌ Wrong answers getting cached as correct answers
🔧 How to Re-enable Cache
Option 1: Simple Re-activation (Testing Complete)
// In src/DRS/services/IAEngine.js, lines 165-170
// Uncomment these lines:
const cacheKey = this._generateCacheKey(prompt, options);
if (this.cache.has(cacheKey)) {
this.stats.cacheHits++;
this._log('📦 Cache hit for educational validation');
return this.cache.get(cacheKey);
}
Option 2: Improved Cache Key (Recommended)
_generateCacheKey(prompt, options) {
const keyData = {
prompt: prompt.substring(0, 200), // Increase from 100 to 200
temperature: options.temperature || 0.3,
type: this._detectExerciseType(prompt),
// Add more distinguishing factors:
language: options.language,
exerciseType: options.exerciseType,
contentHash: this._hashContent(prompt) // Full content hash
};
return JSON.stringify(keyData);
}
Option 3: Selective Caching
// Only cache if prompt is long enough and specific enough
if (prompt.length > 150 && options.exerciseType) {
const cacheKey = this._generateCacheKey(prompt, options);
if (this.cache.has(cacheKey)) {
// ... cache logic
}
}
🎯 Production Recommendations
For Production Use:
- Re-enable cache after comprehensive testing
- Improve cache key to include more context
- Monitor cache hit rates (target: 30-50%)
- Set cache expiration (e.g., 24 hours)
- Cache size limits (currently: 1000 entries)
For Development/Testing:
- Keep cache disabled during AI prompt development
- Enable only for performance testing
- Clear cache between test suites
📊 Cache Performance Benefits
When properly configured:
- Cost Reduction: 40-60% fewer API calls
- Speed Improvement: Instant responses for repeated content
- Rate Limiting: Avoids API limits during peak usage
- Reliability: Reduces dependency on external AI services
🔍 Cache Monitoring
Access cache statistics:
window.app.getCore().iaEngine.stats.cacheHits
window.app.getCore().iaEngine.cache.size
🧪 AI Testing Results
Final Validation (Without Cache)
Test Date: December 2024 Scoring Accuracy: 100% (4/4 test cases passed)
Test Results:
- ✅ Wrong Science Answer: 0 points (expected: 0-30)
- ✅ Correct History Answer: 90 points (expected: 70-100)
- ✅ Wrong Translation: 0 points (expected: 0-30)
- ✅ Correct Spanish Translation: 100 points (expected: 70-100)
Bug Fixed: Translation prompt now correctly uses context.toLang instead of hardcoded languages.
System Status: ✅ PRODUCTION READY
- Real AI scoring (no mock responses)
- Strict scoring logic enforced
- Multi-language support working
- OpenAI → DeepSeek fallback functional
🧠 Intelligent Content Dependency System
Smart Vocabulary Prerequisites
NEW APPROACH: Instead of forcing vocabulary based on arbitrary mastery percentages, the system now uses intelligent content dependency analysis.
🎯 Core Logic
Before executing any exercise, analyze the next content:
- Content Analysis - Extract all words from upcoming content (phrases, texts, dialogs)
- Dependency Check - For each word in content:
- Is it in our vocabulary module list?
- Is it already discovered by the user?
- Smart Decision - Only force vocabulary if content has undiscovered words that are in our vocabulary list
- Targeted Learning - Focus vocabulary practice on words actually needed for next content
🏗️ Implementation Architecture
ContentDependencyAnalyzer Class:
class ContentDependencyAnalyzer {
analyzeContentDependencies(nextContent, vocabularyModule) {
const wordsInContent = this.extractWordsFromContent(nextContent);
const vocabularyWords = vocabularyModule.getVocabularyWords();
const missingWords = this.findMissingWords(wordsInContent, vocabularyWords);
return {
hasUnmetDependencies: missingWords.length > 0,
missingWords: missingWords,
totalWordsInContent: wordsInContent.length
};
}
}
Smart Override Logic:
_shouldUseWordDiscovery(exerciseType, exerciseConfig) {
const nextContent = await this.getNextContent(exerciseConfig);
const analysis = this.analyzer.analyzeContentDependencies(nextContent, this.vocabularyModule);
if (analysis.hasUnmetDependencies) {
window.vocabularyOverrideActive = {
originalType: exerciseConfig.type,
reason: `Content requires ${analysis.missingWords.length} undiscovered words`,
missingWords: analysis.missingWords
};
return true;
}
return false;
}
🎯 User Experience Impact
Before (Dumb System):
- "Vocabulary mastery too low (15%), forcing flashcards"
- User learns random words not related to next content
- Arbitrary percentage-based decisions
After (Smart System):
- "Next content requires these words: refrigerator, elevator, closet"
- User learns exactly the words needed for comprehension
- Content-driven vocabulary acquisition
📊 Smart Guide Integration
Interface Updates:
📚 Vocabulary Practice (3 words needed for next content)
Type: 📚 Vocabulary Practice
Mode: Adaptive Flashcards
Why this exercise?
Next content requires these words: refrigerator, elevator, closet. Learning vocabulary first ensures comprehension.
🔧 Key Functions
extractWordsFromContent()- Parse text/phrases/dialogs for vocabularyfindMissingWords()- Identify vocabulary words that aren't discoveredgetNextContent()- Fetch upcoming exercise content for analysisupdateVocabularyOverrideUI()- Smart Guide interface adaptation
✅ Benefits
- Targeted Learning - Only learn words actually needed
- Context-Driven - Vocabulary tied to real content usage
- Efficient Progress - No time wasted on irrelevant words
- Better Retention - Words learned in context of upcoming usage
- Smart Adaptation - UI accurately reflects what's happening
Status: ✅ DESIGN READY FOR IMPLEMENTATION
📊 ROBUST PROGRESS SYSTEM - Ultra-Strict Architecture
🎯 Core Philosophy
FUNDAMENTAL RULE: Every piece of content is a trackable progress item with strict validation and type safety.
🏗️ Pedagogical Flow (NON-NEGOTIABLE)
1. DISCOVERY → 2. MASTERY → 3. APPLICATION
(passive) (active) (context)
Flow Rules:
- ❌ NO Flashcards on undiscovered words - Must discover first
- ❌ NO Text exercises on unmastered vocabulary - Must master first
- ✅ Always check prerequisites before ANY exercise
- ✅ Form vocabulary lists on-the-fly from next exercise content
📦 Progress Item System
Item Types & Weights
Each content piece = 1 or more progress items with defined weights:
| Type | Weight | Description | Prerequisites |
|---|---|---|---|
| vocabulary-discovery | 1 | Passive exposure to new word | None |
| vocabulary-mastery | 1 | Active flashcard practice | Must be discovered |
| phrase | 6 | Phrase comprehension (3x vocab) | Vocabulary mastered |
| dialog | 12 | Dialog comprehension (6x vocab, complex) | Vocabulary mastered |
| text | 15 | Full text analysis (7.5x vocab, most complex) | Vocabulary mastered |
| audio | 12 | Audio comprehension (6x vocab) | Vocabulary mastered |
| image | 6 | Image description (3x vocab) | Vocabulary discovered |
| grammar | 6 | Grammar rules (3x vocab) | Vocabulary discovered |
Total for 1 vocabulary word = 2 points (1 discovery + 1 mastery)
Strict Interface Contract
// ALL progress items MUST implement this interface
class ProgressItemInterface {
validate() // ⚠️ REQUIRED - Validate item data
serialize() // ⚠️ REQUIRED - Convert to JSON
getWeight() // ⚠️ REQUIRED - Return item weight
canComplete(state) // ⚠️ REQUIRED - Check prerequisites
}
Missing implementation = FATAL ERROR (red screen, app refuses to start)
🔥 Ultra-Strict Validation System
Runtime Checks
At Application Startup:
- Validate ALL item implementations
- Check ALL methods are implemented
- Verify weight calculations
- Test prerequisite logic
If ANY validation fails:
- 🔴 Full-screen red error overlay
- 🔊 Alert sound (dev mode)
- 📳 Screen shake animation
- 🚨 Giant error message with:
- Class name
- Missing method name
- Stack trace
- ❌ Application REFUSES to start
Error Display Example
┌─────────────────────────────────────────────┐
│ │
│ 🔥 FATAL ERROR 🔥 │
│ │
│ Implementation Missing │
│ │
│ Class: VocabularyMasteryItem │
│ Missing Method: canComplete() │
│ │
│ ❌ MUST implement all interface methods │
│ │
│ [ Dismiss (Fix Required!) ] │
│ │
└─────────────────────────────────────────────┘
Impossible to ignore. Impossible to skip. Forces correct implementation.
📈 Progress Calculation
Chapter Analysis
When loading a chapter, the system:
- Scans ALL content (vocabulary, phrases, dialogs, texts, etc.)
- Creates progress items for each piece
- Calculates total weight (sum of all item weights)
- Stores item registry for tracking
Example Chapter:
- 171 vocabulary words → 342 points (171×2: discovery + mastery)
- 75 phrases → 450 points (75×6)
- 6 dialogs → 72 points (6×12)
- 3 lessons → 45 points (3×15)
- TOTAL: 909 points
Progress Calculation
percentage = (completedWeight / totalWeight) × 100
Example:
- Discovered 50 words = 50 points
- Mastered 20 words = 20 points
- Completed 3 phrases = 18 points (3×6)
- Completed 1 dialog = 12 points
- Total completed = 100 points
- Progress = (100 / 909) × 100 = 11%
Breakdown Display
{
percentage: 11,
completedWeight: 100,
totalWeight: 909,
breakdown: {
'vocabulary-discovery': { count: 50, weight: 50 },
'vocabulary-mastery': { count: 20, weight: 20 },
'phrase': { count: 3, weight: 18 },
'dialog': { count: 1, weight: 12 }
}
}
🎯 On-The-Fly Vocabulary Formation
OLD (Wrong): Pre-load all 171 words for flashcards
NEW (Correct):
- Analyze next exercise (e.g., Dialog #3)
- Extract words used in that specific dialog
- Check user's status for those words
- Form targeted list of only needed words
- Force discovery/mastery for just those words
Example:
// Next exercise: Dialog "Academic Conference"
// Words in dialog: methodology, hypothesis, analysis, paradigm, framework
// User status check:
// - methodology: never seen → Discovery needed
// - hypothesis: discovered, not mastered → Mastery needed
// - analysis: mastered → Skip
// - paradigm: never seen → Discovery needed
// - framework: discovered, not mastered → Mastery needed
// Smart system creates:
// 1. Discovery module: [methodology, paradigm] (2 words)
// 2. Mastery module: [hypothesis, framework] (2 words)
// 3. Then allow dialog exercise
🔧 Implementation Components
Required Classes
- ProgressItemInterface - Abstract base with strict validation
- StrictInterface - Enforcement mechanism with visual errors
- ContentProgressAnalyzer - Scans content, creates items, calculates total
- ProgressTracker - Manages state, marks completion, saves progress
- ImplementationValidator - Runtime validation at startup
Concrete Item Implementations
- VocabularyDiscoveryItem
- VocabularyMasteryItem
- PhraseItem
- DialogItem
- TextItem
- AudioItem
- ImageItem
- GrammarItem
Each MUST implement all 4 interface methods or app fails to start
✅ Validation Checklist
Before ANY exercise can run:
- Prerequisites analyzed for next specific content
- Missing words identified
- Discovery forced for never-seen words
- Mastery forced for seen-but-not-mastered words
- Progress item created with correct weight
- Completion properly tracked and saved
- Total progress recalculated
If ANY step fails → Clear error message, app stops gracefully
🎨 UI Integration
Progress Display:
Chapter Progress: 11% (100/909 points)
✅ Vocabulary Discovery: 50/171 words (50pts)
✅ Vocabulary Mastery: 20/171 words (20pts)
✅ Phrases: 3/75 (18pts)
✅ Dialogs: 1/6 (12pts)
⬜ Texts: 0/3 (0/45pts)
Smart Guide Updates:
🔍 Analyzing next exercise: Dialog "Academic Conference"
📚 4 words needed (2 discovery, 2 mastery)
🎯 Starting Vocabulary Discovery for: methodology, paradigm
🚨 Error Prevention
Compile-Time (Startup):
- Interface validation
- Method implementation checks
- Weight configuration validation
Runtime:
- Prerequisite enforcement
- State consistency checks
- Progress calculation validation
Visual Feedback:
- Red screen for missing implementations
- Clear prerequisite errors
- Progress breakdown always visible
Status: 📝 DOCUMENTED - READY FOR IMPLEMENTATION
This is a high-quality, maintainable system built for educational software that will scale.