Implement EMBA Specialization Solver web app
Full React+TypeScript app with LP-based optimization engine, drag-and-drop specialization ranking (with touch/arrow support), course selection UI, results dashboard with decision tree, and two optimization modes (maximize-count, priority-order).
This commit is contained in:
37
openspec/changes/emba-specialization-solver/proposal.md
Normal file
37
openspec/changes/emba-specialization-solver/proposal.md
Normal file
@@ -0,0 +1,37 @@
|
||||
## Why
|
||||
|
||||
EMBA students must select 12 elective courses (one per set) across three terms, earning 30 total credits. The program offers 14 specializations, each requiring 9+ credits from qualifying courses — but credits cannot be duplicated across specializations. Determining which specializations are achievable, and which course selections optimize toward preferred specializations, is a non-trivial credit allocation problem that students currently solve by intuition. A web application that solves this exactly would let students make informed decisions with full visibility into trade-offs.
|
||||
|
||||
## What Changes
|
||||
|
||||
- New React web application for EMBA specialization planning
|
||||
- Embeds the full course-specialization matrix (46 courses, 14 specializations) as static data — no backend required
|
||||
- Users rank specializations by priority (drag-to-reorder)
|
||||
- Users pin course selections for any subset of the 12 elective sets
|
||||
- Two optimization modes the user toggles between:
|
||||
- **Maximize Count**: find the largest set of achievable specializations, using priority ranking to break ties among equal-count solutions
|
||||
- **Priority Order**: guarantee the #1-ranked specialization first, then greedily add #2, #3, etc. (lexicographic optimization)
|
||||
- Exact LP-based solver (not greedy heuristic) for credit allocation feasibility
|
||||
- Decision tree for open (unpinned) sets: for each open set, show what each course choice enables or eliminates, ordered by decision impact
|
||||
- Handles all program constraints: credit non-duplication, required course gates, Strategy S1/S2 cap, same-set mutual exclusions
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `course-data`: Static data model embedding the 46 courses, 12 elective sets, 14 specializations, course-specialization qualification matrix (■/S1/S2 markers), and required course mappings
|
||||
- `optimization-engine`: LP-based credit allocation solver supporting both optimization modes (maximize-count and priority-order), with feasibility checking across specialization subsets, Strategy S2 enumeration, and required course gate enforcement
|
||||
- `specialization-ranking`: User interface for ordering specializations by priority via drag-and-drop, with mode toggle between maximize-count and priority-order optimization
|
||||
- `course-selection`: Interface for pinning/unpinning course choices across the 12 elective sets, with immediate recalculation on change
|
||||
- `results-dashboard`: Analysis output showing per-specialization status (achieved/achievable/unreachable/missing_required), credit allocation breakdown, and decision tree for open sets ordered by impact
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
_(none — greenfield project)_
|
||||
|
||||
## Impact
|
||||
|
||||
- New React application (single-page, client-side only)
|
||||
- Dependencies: React, an in-browser LP solver (e.g., `javascript-lp-solver`), drag-and-drop library
|
||||
- No backend, database, or API — all computation runs in the browser
|
||||
- Data sourced from `SPECIALIZATION_EVALUATION.md` (already in repo)
|
||||
Reference in New Issue
Block a user