# Changelog ## v1.2.1 — 2026-03-27 ### Bug Fixes - **Achievable status accuracy** — specializations marked "Achievable" are now verified via LP feasibility check against already-achieved specs; previously, a specialization could show "Achievable" based on raw credit potential while actually being infeasible due to credit sharing with higher-priority achieved specializations ## v1.2.0 — 2026-03-27 ### Changes - **Course info popovers** — each course now has an info icon that opens a popover showing the course description, instructor(s), and specialization tags, extracted from the J27 Electives PDF; opens on hover (desktop) or tap (mobile), with smart positioning that flips above when near the bottom of the viewport - **Page title and favicon** — updated browser tab from "app" with Vite icon to "EMBA Specialization Solver" with a graduation cap favicon in NYU Stern purple - **Viewport-fitted layout** — desktop layout now fits within the viewable area without page-level scrolling; each pane scrolls independently ## v1.1.1 — 2026-03-27 ### Changes - **Course replacement** — replaced cancelled "Managing Growing Companies" with new course "Innovation and Design" in Summer Elective Set 2; qualifies for Brand Management, Entrepreneurship and Innovation, Marketing, and Strategy (S2) ## v1.1.0 — 2026-03-13 ### Changes - **Cancelled course support** — "Managing Growing Companies" (Summer Elective Set 2) is marked as cancelled and rendered with strikethrough, greyed-out styling, and a "(Cancelled)" label; it is excluded from solver computations and decision tree enumeration - **Duplicate course prevention** — courses that appear in multiple elective sets (e.g., "Global Immersion Experience II" in Spring Set 1 and Summer Set 1, "The Financial Services Industry" in Spring Set 2 and Fall Set 4) are now linked; selecting one automatically disables and excludes its duplicate from selection and solver calculations, shown with an "(Already selected)" label - **Credit bar tick marks** — specialization progress bars now display light vertical tick marks at 2.5-credit intervals for visual scale reference, layered above bar fills with the 9.0 threshold marker remaining visually distinct ## v1.0.0 — 2026-02-28 Initial release of the EMBA Specialization Solver. ### Features - **Optimization engine** — LP-based credit allocation solver with two modes: - **Maximize Count** — finds the largest feasible set of specializations, using ranking as tiebreaker - **Priority Order** — greedily adds specializations in user-ranked order - **Course selection UI** — select one course per elective set across 12 sets (Spring, Summer, Fall terms) - **Drag-and-drop specialization ranking** — reorder the 14 specializations by priority with touch and keyboard support - **Decision tree analysis** — Web Worker enumerates remaining course combinations to compute ceiling outcomes per choice - **Status tracking** — each specialization classified as achieved, achievable, missing required course, or unreachable - **Mode comparison** — displays what the alternative optimization mode would produce - **Credit bars and allocation breakdowns** — visual progress toward the 9-credit threshold with expandable per-course detail - **Credit legend** — collapsible explainer for bars, badges, and limits - **Required course labels** — courses that are prerequisites for a specialization show "Required for ..." labels - **Algorithm explanations** — clear descriptions of how each optimization mode works - **Skeleton loading** — placeholder UI while decision tree analysis runs - **Auto-expand achieved specializations** — achieved specs show their credit breakdown by default - **Responsive layout** — two-panel grid on desktop/tablet, single-column on mobile - **Mobile floating banners** — top banner summarizes specialization statuses, bottom banner shows selection progress (N/12); both appear via IntersectionObserver and scroll to their sections on tap - **CSS transitions and animations** — cross-fade course pin/unpin, credit bar width changes, status badge color transitions, expand/collapse panels, mode toggle switching, flash on status changes; all respect `prefers-reduced-motion` - **State persistence** — rankings and selections saved to localStorage - **Docker deployment** — multi-stage Dockerfile (Node 22 build → Nginx Alpine serve) with Docker Compose, gzip compression, SPA fallback routing, immutable cache headers for hashed assets, configurable port (default 8080) - **Full test suite** — data integrity, feasibility solver, optimizer, and decision tree tests via Vitest ### Constraints Modeled - Credit non-duplication (2.5 credits per course shared across specializations) - Maximum 3 specializations (30 total credits, 9 required each) - Required course prerequisites for 4 specializations - Strategy S1/S2 tier system (at most 1 S2 course contributes to Strategy) - Mutual exclusion from same-set conflicts