Building Skywalker: Automated QA via Classification & Clustering
A Fully Automated QA Analysis Engine Using Classification & Clustering
Origin Story β Built as a passion project while working as a Business Analyst leading a QA-intensive project for McGraw Hill's ALEKS e-learning platform. Skywalker was born out of the need to transform raw QA feedback into actionable intelligence β long before Neural Networks and LLMs were available to the general public.
[!NOTE] This repository serves as documentation only. No source code is included to respect intellectual property boundaries from a previous organization.
π Table of Contents
- Background & Motivation
- What is ALEKS?
- The Problem
- The Solution β Skywalker
- System Architecture
- Process Flowchart
- Core Features
- Dashboard Views
- Tech Stack
- Impact & Results
- Lessons Learned
π Background & Motivation
As a Business Analyst leading a cross-functional project team, I was deeply involved in the end-to-end lifecycle of interactive e-learning content. The QA process β while critical β was manual, fragmented, and lacked structured analytics. Testers would identify issues, but the way those issues were communicated, categorized, and actioned varied wildly across teams.
I wanted a tool that could:
- Standardize QA outputs into meaningful categories
- Surface patterns in defect types across question banks
- Empower leadership with data-driven visibility into QA health
- Free up QA engineers to focus on testing, not on formatting reports
So I built Skywalker β a classification and clustering engine wrapped in an interactive dashboard β for fun, and because the problem was too interesting to leave unsolved.
π What is ALEKS?
ALEKS (Assessment and Learning in Knowledge Spaces) is an AI-powered adaptive learning platform developed by McGraw Hill. It serves over 50 million students across:
| Subject | Description |
|---|---|
| Mathematics | Kβ12 through college-level courses |
| Chemistry | General and introductory chemistry |
| Statistics | Introductory statistics courses |
| Accounting | Foundational accounting concepts |
ALEKS uses Knowledge Space Theory β a mathematical cognitive science framework β to map each student's knowledge state and deliver personalized learning paths. The platform avoids traditional multiple-choice formats, instead using sophisticated input tools that require authentic problem-solving.
Content at ALEKS
The content team at ALEKS was responsible for designing:
- π― Dynamic questions β algorithmically generated with variable parameters
- π Interactive question banks β curated pools for adaptive assessments
- π§© Interactive learning topics β step-by-step guided instruction with embedded practice
Each piece of content required rigorous QA to ensure mathematical correctness, pedagogical soundness, accessibility compliance, and seamless user experience.
π΄ The Problem
The QA process had several pain points:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β QA Pain Points β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1. INCONSISTENT CATEGORIZATION β
β β QA engineers described the same defect types differently β
β β
β 2. NO AGGREGATED VISIBILITY β
β β Leadership had no way to see trends across question banks β
β β
β 3. DEVELOPER FRICTION β
β β Developers struggled to interpret freeform QA feedback β
β β
β 4. QA TIME WASTED ON REPORTING β
β β Testers spent more time formatting reports than testing β
β β
β 5. NO FEEDBACK LOOP β
β β No systematic way to measure QA effectiveness over time β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π‘ The Solution β Skywalker
Skywalker is a QA Analysis Engine that ingests manually QA'd topic data, applies text classification and clustering algorithms to categorize defect findings, and presents the results through an interactive Plotly Dash dashboard.
How It Works (High Level)
- QA engineers perform manual testing on ALEKS topics and log their findings
- Skywalker ingests the raw QA data and preprocesses it (cleaning, tokenization, normalization)
- Classification models categorize each QA finding into predefined defect types
- Clustering algorithms discover emerging patterns and group similar issues
- Interactive dashboards present insights to both leadership and development teams
π System Architecture
graph TB
subgraph Data_Sources["π₯ Data Sources"]
QA_Input["π§ͺ Manual QA Findings<br/>(Spreadsheets / Forms)"]
Topic_DB["π ALEKS Topic Metadata<br/>(Question Banks, Subjects)"]
end
subgraph Ingestion_Layer["βοΈ Ingestion & Preprocessing"]
Parser["π Data Parser<br/>(CSV / Excel Ingestion)"]
Cleaner["π§Ή Text Preprocessor<br/>(Tokenization, Stopwords,<br/>Lemmatization)"]
Feature_Eng["π§ Feature Engineering<br/>(TF-IDF Vectorization,<br/>N-gram Extraction)"]
end
subgraph ML_Engine["π€ Skywalker ML Engine"]
Classifier["π Classification Module<br/>(Naive Bayes / SVM /<br/>Random Forest)"]
Clusterer["π¬ Clustering Module<br/>(K-Means / DBSCAN /<br/>Hierarchical)"]
Taxonomy["π·οΈ Defect Taxonomy<br/>(Category Mapping &<br/>Confidence Scoring)"]
end
subgraph Application_Layer["π₯οΈ Application Layer (Flask)"]
Flask_App["π Flask Web Server<br/>(REST API + Routing)"]
Auth["π Authentication<br/>(Role-Based Access)"]
API["π‘ API Endpoints<br/>(Data Retrieval &<br/>Filter Queries)"]
end
subgraph Dashboard_Layer["π Dashboard Layer (Plotly Dash)"]
Lead_Dash["π Leadership Dashboard<br/>(Executive Summary,<br/>Trend Analysis)"]
Dev_Dash["π¨βπ» Developer Dashboard<br/>(Defect Details,<br/>Priority Queue)"]
QA_Dash["π§ͺ QA Dashboard<br/>(Coverage Metrics,<br/>Efficiency Stats)"]
end
subgraph Consumers["π₯ End Users"]
Leadership["π Leadership Team"]
Developers["π¨βπ» Content Developers"]
QA_Team["π§ͺ QA Engineers"]
end
QA_Input --> Parser
Topic_DB --> Parser
Parser --> Cleaner
Cleaner --> Feature_Eng
Feature_Eng --> Classifier
Feature_Eng --> Clusterer
Classifier --> Taxonomy
Clusterer --> Taxonomy
Taxonomy --> Flask_App
Flask_App --> Auth
Auth --> API
API --> Lead_Dash
API --> Dev_Dash
API --> QA_Dash
Lead_Dash --> Leadership
Dev_Dash --> Developers
QA_Dash --> QA_Team
style Data_Sources fill:#1a1a2e,stroke:#e94560,color:#eee
style Ingestion_Layer fill:#16213e,stroke:#0f3460,color:#eee
style ML_Engine fill:#0f3460,stroke:#533483,color:#eee
style Application_Layer fill:#533483,stroke:#e94560,color:#eee
style Dashboard_Layer fill:#e94560,stroke:#f5c542,color:#fff
style Consumers fill:#1a1a2e,stroke:#e94560,color:#eee
Architecture Components Explained
| Layer | Component | Purpose |
|---|---|---|
| Data Sources | Manual QA Findings | Raw defect reports from QA engineers testing ALEKS topics |
| Data Sources | Topic Metadata | Subject area, question type, difficulty level, and content structure |
| Ingestion | Data Parser | Reads and normalizes input from CSVs, Excel files, or form submissions |
| Ingestion | Text Preprocessor | NLP pipeline β tokenization, stopword removal, lemmatization |
| Ingestion | Feature Engineering | Converts text to numerical features using TF-IDF and n-gram extraction |
| ML Engine | Classification Module | Assigns predefined defect categories using supervised learning |
| ML Engine | Clustering Module | Discovers emergent defect patterns using unsupervised learning |
| ML Engine | Defect Taxonomy | Maps ML outputs to a structured category hierarchy with confidence scores |
| Application | Flask Web Server | Core application server handling routing and business logic |
| Application | Authentication | Role-based access control for different user personas |
| Application | API Endpoints | RESTful endpoints for data retrieval, filtering, and aggregation |
| Dashboard | Leadership Dashboard | High-level KPIs, trend lines, and executive summaries |
| Dashboard | Developer Dashboard | Granular defect details, priority queues, and fix recommendations |
| Dashboard | QA Dashboard | Coverage metrics, efficiency tracking, and workload distribution |
π Process Flowchart
flowchart TD
A([π§ͺ QA Engineer Tests<br/>ALEKS Topic]) --> B[π Log QA Findings<br/>in Standardized Form]
B --> C{π₯ Data Ingestion<br/>Triggered?}
C -- Manual Upload --> D[π Parse CSV/Excel<br/>Input Files]
C -- Scheduled Batch --> D
D --> E[π§Ή Text Preprocessing]
E --> E1[Tokenization]
E --> E2[Stopword Removal]
E --> E3[Lemmatization]
E1 --> F[π§ Feature Engineering<br/>TF-IDF Vectorization]
E2 --> F
E3 --> F
F --> G{π€ ML Processing}
G --> H[π Classification<br/>Assign Defect Category]
G --> I[π¬ Clustering<br/>Discover Patterns]
H --> J[π·οΈ Apply Defect<br/>Taxonomy Labels]
I --> J
J --> K[πΎ Store Categorized<br/>Results in Database]
K --> L{π€ Who is<br/>Viewing?}
L -- Leadership --> M[π Executive Dashboard]
L -- Developer --> N[π¨βπ» Developer Dashboard]
L -- QA Engineer --> O[π§ͺ QA Dashboard]
M --> M1[π QA Health Trends]
M --> M2[π Defect Distribution]
M --> M3[β±οΈ Cycle Time Analytics]
N --> N1[π― Priority Defect Queue]
N --> N2[π Root Cause Clusters]
N --> N3[π Actionable Fix List]
O --> O1[β
Coverage Metrics]
O --> O2[π Efficiency Score]
O --> O3[π Simplified Logging]
M1 --> P([π Data-Driven<br/>Decision Making])
M2 --> P
M3 --> P
N1 --> Q([π οΈ Faster<br/>Bug Resolution])
N2 --> Q
N3 --> Q
O1 --> R([π Improved<br/>QA Focus])
O2 --> R
O3 --> R
style A fill:#e94560,stroke:#1a1a2e,color:#fff
style G fill:#533483,stroke:#0f3460,color:#fff
style J fill:#0f3460,stroke:#16213e,color:#fff
style L fill:#f5c542,stroke:#1a1a2e,color:#1a1a2e
style P fill:#2ecc71,stroke:#1a1a2e,color:#fff
style Q fill:#2ecc71,stroke:#1a1a2e,color:#fff
style R fill:#2ecc71,stroke:#1a1a2e,color:#fff
β‘ Core Features
1. Automated Defect Classification
Manually QA'd findings are automatically classified into structured defect categories using supervised ML models trained on historical QA data.
Defect Categories Include:
| Category | Description | Example |
|---|---|---|
MATH_ERROR |
Incorrect mathematical computation or formula | Wrong coefficient in quadratic equation |
DISPLAY_BUG |
Rendering or visual presentation issues | Graph axes mislabeled |
INPUT_TOOL |
Student input tool malfunction | Drag-and-drop not responding |
CONTENT_GAP |
Missing or incomplete instructional content | Explanation step skipped |
ACCESSIBILITY |
ADA/WCAG compliance failures | Missing alt text on diagrams |
LOGIC_FLAW |
Incorrect branching or adaptive logic | Wrong prerequisite mapping |
LOCALIZATION |
Language or formatting inconsistencies | Decimal vs comma notation |
2. Pattern Discovery via Clustering
Unsupervised clustering identifies emerging defect patterns that don't fit predefined categories β surfacing systemic issues before they become widespread.
3. Role-Based Interactive Dashboards
| Dashboard | Audience | Key Metrics |
|---|---|---|
| Executive | Leadership | QA health score, defect trends over time, release readiness |
| Developer | Content Devs | Priority queue, root cause analysis, fix suggestions |
| QA Ops | QA Engineers | Coverage %, efficiency score, workload balance |
4. Standardized QA Taxonomy
Eliminates inconsistency by mapping freeform QA notes to a controlled vocabulary β ensuring everyone speaks the same language about quality.
π Dashboard Views
Leadership Dashboard
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SKYWALKER β Executive QA Overview π Live β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββ ββββββββββββββ ββββββββββββββ ββββββββββββββ β
β β QA Health β β Topics β β Avg Fix β β Release β β
β β Score β β Tested β β Time β β Readiness β β
β β 94.2% β β 1,247 β β 2.3 days β β 87% β β
β β β² +3.1% β β β² +156 β β βΌ -0.8d β β β² +5% β β
β ββββββββββββββ ββββββββββββββ ββββββββββββββ ββββββββββββββ β
β β
β π Defect Trend (Last 6 Months) π Category Distribution β
β βββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββ
β β β±β² β β ββββββββββ Math Error ββ
β β β± β² β±β² β β ββββββββββ Display Bug ββ
β β β± β² β± β² β±β² β β ββββββββββ Input Tool ββ
β β β± β²β± β²β± β²ββ β β ββββββββββ Content Gap ββ
β βββββββββββββββββββββββββββββ β ββββββββββ Accessibilityββ
β βββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Developer Dashboard
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SKYWALKER β Developer Focus View π Live β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β π― Priority Defect Queue β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β # β Topic ID β Category β Cluster β Priority β Age ββ
β β 1 β ALG-2041 β MATH_ERROR β Quad-Eq β π΄ HIGH β 3d ββ
β β 2 β CHM-0892 β LOGIC_FLAW β Mol-Bal β π΄ HIGH β 2d ββ
β β 3 β ALG-1587 β DISPLAY_BUG β Graph-Ax β π‘ MED β 5d ββ
β β 4 β GEO-0341 β INPUT_TOOL β DnD-Set β π‘ MED β 4d ββ
β β 5 β STA-0156 β CONTENT_GAP β Prob-Dis β π’ LOW β 7d ββ
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β π¬ Emerging Clusters (Auto-Discovered) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β’ "Quadratic Coefficient" cluster β 12 related issues ββ
β β β’ "Graph Axis Labeling" cluster β 8 related issues ββ
β β β’ "Molecular Balance Input" cluster β 6 related issues ββ
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π Tech Stack
graph LR
subgraph Frontend["π¨ Frontend"]
Dash["Plotly Dash<br/>(Interactive Charts)"]
HTML["HTML/CSS<br/>(Layout & Styling)"]
end
subgraph Backend["βοΈ Backend"]
Flask["Flask<br/>(Web Framework)"]
REST["REST API<br/>(Data Endpoints)"]
end
subgraph ML_Stack["π€ ML / NLP"]
Sklearn["scikit-learn<br/>(Classification &<br/>Clustering)"]
NLTK["NLTK / spaCy<br/>(Text Processing)"]
TFIDF["TF-IDF<br/>(Feature Extraction)"]
end
subgraph Data["πΎ Data"]
Pandas["Pandas<br/>(Data Wrangling)"]
DB["SQLite / CSV<br/>(Storage)"]
end
Dash --> Flask
HTML --> Flask
Flask --> REST
REST --> Sklearn
REST --> Pandas
Sklearn --> NLTK
Sklearn --> TFIDF
Pandas --> DB
style Frontend fill:#e94560,stroke:#1a1a2e,color:#fff
style Backend fill:#533483,stroke:#1a1a2e,color:#fff
style ML_Stack fill:#0f3460,stroke:#1a1a2e,color:#fff
style Data fill:#16213e,stroke:#1a1a2e,color:#eee
| Layer | Technology | Role |
|---|---|---|
| Web Framework | Flask (Python) | Application server, routing, API endpoints |
| Dashboard | Plotly Dash | Interactive, real-time data visualizations |
| ML β Classification | scikit-learn (Naive Bayes, SVM, Random Forest) | Supervised defect categorization |
| ML β Clustering | scikit-learn (K-Means, DBSCAN) | Unsupervised pattern discovery |
| NLP | NLTK / spaCy | Tokenization, lemmatization, stopword removal |
| Feature Extraction | TF-IDF, N-grams | Text-to-numeric feature conversion |
| Data Processing | Pandas, NumPy | Data wrangling and transformation |
| Storage | SQLite / CSV | Lightweight data persistence |
| Visualization | Plotly, Matplotlib | Charts, graphs, and visual analytics |
π Impact & Results
| Metric | Before Skywalker | After Skywalker | Improvement |
|---|---|---|---|
| QA report formatting time | ~40% of QA cycle | ~5% of QA cycle | 87.5% reduction |
| Defect categorization consistency | Variable (manual) | Standardized (ML) | Unified taxonomy |
| Leadership visibility | Ad-hoc email reports | Real-time dashboards | Instant access |
| Developer defect comprehension | Read raw QA notes | Structured priority queue | Faster resolution |
| Pattern detection | Post-mortem only | Real-time clustering | Proactive identification |
Key Outcomes
- β Reduced QA cycle time β QA engineers focused on testing, not report formatting
- β Improved quality β Systematic categorization revealed blind spots in coverage
- β Better developer focus β Priority queues directed developers to highest-impact fixes
- β Leadership empowerment β Data-driven dashboards replaced anecdotal status updates
- β Emerging pattern detection β Clustering surfaced systemic issues before they scaled
π§ Lessons Learned
Pre-LLM NLP is powerful β TF-IDF + classical ML models delivered production-quality text classification without any deep learning infrastructure.
Domain expertise matters β The defect taxonomy was designed with input from QA leads, developers, and subject matter experts β not just ML metrics.
Dashboards change behavior β When leadership could see QA health in real-time, resource allocation and prioritization decisions improved dramatically.
QA is a data problem β Treating QA feedback as structured data (not just freeform notes) unlocked analytics that were previously impossible.
Build for all stakeholders β A single tool serving leadership, developers, and QA with role-appropriate views created alignment across teams.
π Disclaimer
This project was designed and conceptualized during employment at a previous organization. No proprietary source code, data, or trade secrets are included in this repository. All content here represents conceptual architecture, methodology documentation, and general technical approaches that reflect the author's individual skills and problem-solving abilities.
Built with β€οΈ and curiosity β because the best tools are born from real problems.
Skywalker β QA Analysis Engine | Classification & Clustering | Flask + Plotly Dash