ADR-LMS-PHASE-1: Learning Management System - Onboarding Database Architecture
Status: Accepted Date: 2025-12-11 Deciders: Hal Casteel (Founder/CEO/CTO), CODITECT Core Team Technical Story: Enable persistent tracking of user onboarding progress, badge achievements, and learning analytics integrated with the /cxq anti-forgetting memory system
Context and Problem Statement
CODITECT provides a comprehensive onboarding experience through the coditect-onboarding agent and /onboard command. However, the original implementation had no persistent storage:
- Progress was ephemeral - Users couldn't resume onboarding across sessions
- Badges were display-only - Achievement data wasn't persisted or queryable
- No learning history - Users couldn't see what they'd completed
- No analytics - No insight into user learning patterns
- Disconnected from memory system - Onboarding progress wasn't integrated with /cxq
The Problem: How do we make onboarding progress persistent, queryable, and integrated with the existing anti-forgetting memory infrastructure?
Decision Drivers
Technical Requirements
- R1: Persistent storage of learning progress across sessions
- R2: Integration with existing
context.dbSQLite database - R3: Query capability through existing
/cxqcommand interface - R4: Support for 11 onboarding modules with completion tracking
- R5: Badge earning and achievement system
- R6: User profile storage for learning personalization
- R7: Analytics event capture for insights
User Experience Goals
- UX1: Users can resume onboarding where they left off
- UX2: Users can see earned badges and available achievements
- UX3: Users can query their progress via familiar
/cxqcommands - UX4: New users get recommended next steps based on progress
Integration Constraints
- C1: Must use existing
context-storage/context.dbdatabase - C2: Must not break existing FTS5/semantic search functionality
- C3: Must integrate with existing
scripts/context-db.pyCLI - C4: Must support the existing onboarding workflow
Decision Outcome
Chosen Solution: Implement LMS as 6 new SQLite tables within context.db, extending /cxq with 7 new command flags for learning queries.
Architecture Components
1. Database Schema (6 Tables)
Core Entities:
learning_modules - Curriculum content definitions (11 onboarding modules)
learning_badges - Achievement definitions (10 badges)
learning_users - User profiles and aggregate statistics
learning_progress - Per-user, per-module completion tracking
learning_achievements - Per-user badge earning records
learning_analytics_events - Event stream for analytics
Key Design Decisions:
-
INTEGER Primary Keys with TEXT Foreign Keys
- Internal IDs use
INTEGER PRIMARY KEY AUTOINCREMENT - User references use
TEXT user_idfor flexibility - Module/badge references use INTEGER IDs for performance
- Internal IDs use
-
Normalized Schema
- Modules and badges stored once in definition tables
- Progress and achievements link users to content
- Events capture detailed activity stream
-
Soft Deletes via
is_activeFlags- Modules and badges can be deactivated without deletion
- Historical data preserved for analytics
2. Query Integration (7 New /cxq Flags)
/cxq --onboarding # Combined progress + badges view
/cxq --learning-progress # Module completion status
/cxq --learning-badges # Earned and available badges
/cxq --learning-modules # List all available modules
/cxq --learning-next # Recommend next module
/cxq --learning-stats # Learning statistics
/cxq --learning-search QUERY # Search learning content
3. Migration Script (learning-db-migrate.py)
Responsibilities:
- Create all 6 tables with proper schema
- Create 17 indexes for query performance
- Seed 11 onboarding modules (3 phases)
- Seed 10 achievement badges
- Verify migration success
Seeded Content:
| Phase | Modules | Description |
|---|---|---|
| 1 - Getting Started | 4 | Welcome, Commands, Agents, Components |
| 2 - Core Workflows | 4 | Git, Memory, Sessions, Best Practices |
| 3 - Advanced | 3 | Customization, Integration, Graduation |
| Badge Category | Count | Examples |
|---|---|---|
| Onboarding | 1 | First Steps |
| Achievement | 7 | Command Explorer, Agent Whisperer, etc. |
| Specialization | 1 | Integration Architect |
| Milestone | 1 | CODITECT Graduate |
4. Query Module (learning_db_query.py)
Functions Provided:
# Data retrieval
get_learning_progress(user_id) # Module completion status
get_earned_badges(user_id) # User's earned badges
get_available_badges(user_id) # Badges not yet earned
get_available_modules() # All active modules
get_next_module(user_id) # Recommended next step
get_learning_stats(user_id) # Aggregate statistics
search_learning_content(query) # Full-text search
# Display formatting
format_progress_display(progress) # Human-readable progress
format_badges_display(badges) # Human-readable badges
format_onboarding_display(user_id) # Combined view
format_stats_display(stats) # Statistics summary
format_next_display(module) # Next step recommendation
Implementation Details
Database Location
- Path:
context-storage/context.db - Shared with: Anti-forgetting memory system (messages, FTS5, embeddings)
Foreign Key Integrity
- CASCADE deletes for user-linked progress/achievements
- SET NULL for optional module/badge references in events
- UNIQUE constraints prevent duplicate progress/achievement records
Index Strategy
- Primary queries indexed: user_id, module_id, status, completed_at
- Analytics queries indexed: event_type, timestamp, session_id
- Lookup queries indexed: module_key, badge_key, category
Error Handling
- Graceful fallback if LMS tables don't exist
- Empty results returned for unknown users
- Schema validation on startup
Alternatives Considered
Alternative 1: Separate SQLite Database
Description: Create learning.db separate from context.db
Pros:
- Clean separation of concerns
- Independent backup/restore
Cons:
- Two database connections to manage
- No integration with existing /cxq infrastructure
- Additional complexity for users
Decision: Rejected - integration benefits outweigh separation
Alternative 2: JSON File Storage
Description: Store progress in JSON files like learning-progress.json
Pros:
- Simple implementation
- Human-readable storage
Cons:
- No query capability
- Race conditions with concurrent writes
- Limited scalability
- No relational integrity
Decision: Rejected - query capability essential for /cxq integration
Alternative 3: Full ORM (SQLAlchemy)
Description: Use SQLAlchemy for database abstraction
Pros:
- Cleaner Python code
- Database portability
- Built-in migration support
Cons:
- Additional dependency (65MB+ package)
- Overkill for 6 tables
- Inconsistent with existing raw SQL approach
Decision: Rejected - raw SQL matches existing codebase patterns
Consequences
Positive
- P1: Users can resume onboarding across sessions
- P2: Badge achievements persist and are queryable
- P3: Seamless integration with existing
/cxqcommand - P4: Foundation for advanced learning analytics
- P5: Consistent with anti-forgetting memory architecture
Negative
- N1: Additional database tables increase schema complexity
- N2: Migration must be run to enable LMS features
- N3: Users must use database-aware
/cxqcommands
Risks
- Risk 1: Schema evolution requires migration scripts
- Mitigation: Version tracking in migration script
- Risk 2: Database corruption could lose progress
- Mitigation: Regular backups via /cx workflow
Validation
Test Coverage
- 40 automated tests in
tests/test_learning_management_system.py - Schema validation tests for all 6 tables
- Query function tests for all 7 operations
- CLI integration tests for /cxq flags
- Edge case tests for empty/unknown users
Manual Validation
# Verify migration
python3 scripts/learning-db-migrate.py
# Test queries
/cxq --onboarding
/cxq --learning-progress
/cxq --learning-badges
/cxq --learning-next
/cxq --learning-stats
/cxq --learning-search "agent"
Related Documents
- LMS-DATABASE-SCHEMA.md - Complete schema documentation
- ADR-031-lms-phase-2.md - Phase 2 enhancements roadmap
- ADR-021-context-query.md - Parent anti-forgetting system
- USER-TRAINING-PATHWAYS.md - Training curriculum
Implementation Checklist
- Create migration script (
learning-db-migrate.py) - Create query module (
learning_db_query.py) - Extend
context-db.pywith learning flags - Update
/cxqcommand documentation - Create schema documentation
- Implement 40 automated tests
- Update CHANGELOG with v1.7.3
Last Updated: 2025-12-11 Version: 1.0.0