v1.2.2: Add Healthcare specialization, mark cancelled courses, rename Digital Marketing

Apply the J27 (5/6/2026) Stern specialization sheet:

- Add Healthcare (HCR) as the 15th specialization, with HCR cross-listings on
  spr2-health-medical, spr3-analytics-ml, sum2-social-media (renamed), and
  fall1-managing-change. 10 credits available, no required-course gate.
- Rename sum2-social-media to "Digital Marketing Strategy in Practice";
  replace its description with new MSKCC-anchored content; clear instructor
  pending confirmation of new lead.
- Switch from delete-and-replace to the previously-unused cancelled flag
  (Approach B): mark spr5-customer-insights cancelled, add Managing Growing
  Companies back to Summer Set 2 as a cancelled placeholder per the printed
  sheet.
- Update data integrity tests: course count 46 -> 47, spec count 14 -> 15;
  per-spec "across sets" helper now filters cancelled courses so future
  cancellations trigger an obvious assertion failure (BRM 6 -> 5,
  MKT 7 -> 6, HCR 4 new).
- Replace hardcoded 14 in optimizer.test.ts with SPECIALIZATIONS.length.
This commit is contained in:
2026-05-09 14:50:26 -04:00
parent 0beafb58b5
commit 4d6f81d1e5
14 changed files with 325 additions and 20 deletions
@@ -0,0 +1,117 @@
## ADDED Requirements
### Requirement: Healthcare specialization
The system SHALL include "Healthcare" (abbreviation `HCR`) as a defined specialization with no required course gate.
#### Scenario: Healthcare appears in specialization list
- **WHEN** the data module is loaded
- **THEN** a specialization with id `HCR`, name "Healthcare", and abbreviation `HCR` is present in `SPECIALIZATIONS`
#### Scenario: Healthcare has no required course
- **WHEN** inspecting the Healthcare specialization
- **THEN** its `requiredCourseId` is undefined
#### Scenario: Healthcare reaches four elective sets
- **WHEN** counting the distinct elective sets containing at least one non-cancelled HCR-qualifying course
- **THEN** the count is exactly 4 (`spr2`, `spr3`, `sum2`, `fall1`), yielding 10.0 credits available (4 × 2.5)
### Requirement: Healthcare cross-listings on existing courses
The system SHALL add Healthcare (`HCR`, standard marker) as an additional qualification on four existing courses without removing their prior qualifications.
#### Scenario: Business of Health & Medical Care qualifies for Healthcare
- **WHEN** inspecting `spr2-health-medical` qualifications
- **THEN** the list includes both `STR` (S2) and `HCR` (standard)
#### Scenario: Analytics & Machine Learning for Managers qualifies for Healthcare
- **WHEN** inspecting `spr3-analytics-ml` qualifications
- **THEN** the list includes both `MTO` (standard) and `HCR` (standard)
#### Scenario: Digital Marketing Strategy in Practice qualifies for Healthcare
- **WHEN** inspecting `sum2-social-media` qualifications
- **THEN** the list includes `BRM`, `EMT`, `MKT`, and `HCR` (all standard)
#### Scenario: Managing Change qualifies for Healthcare
- **WHEN** inspecting `fall1-managing-change` qualifications
- **THEN** the list includes `LCM`, `MGT`, `STR` (S2), and `HCR` (standard)
### Requirement: Cancelled courses preserved with cancelled flag
The system SHALL retain cancelled course entries in the course data with `cancelled: true` rather than deleting them. Cancelled courses SHALL NOT be considered selectable, SHALL be excluded from solver computations, and SHALL render in the UI as visibly disabled.
#### Scenario: Customer Insights is marked cancelled
- **WHEN** inspecting `spr5-customer-insights`
- **THEN** the course has `cancelled: true` and remains a member of `spr5`
#### Scenario: Managing Growing Companies present as cancelled placeholder in Summer Set 2
- **WHEN** inspecting Summer Elective Set 2 (`sum2`)
- **THEN** it contains exactly five course entries, one of which is `sum2-managing-growing-companies` with `cancelled: true` and an empty qualifications list
#### Scenario: Cancelled courses excluded from solver
- **WHEN** the solver computes specialization assignments
- **THEN** no cancelled course id contributes credits toward any specialization
## MODIFIED Requirements
### Requirement: Course definitions
The system SHALL define exactly 47 courses. Each course SHALL have an ID, display name, and the ID of the elective set it belongs to. Courses MAY carry a `cancelled: true` flag indicating the offering has been withdrawn.
#### Scenario: Course count
- **WHEN** the data module is loaded
- **THEN** exactly 47 courses are defined
#### Scenario: Each course belongs to one set
- **WHEN** iterating all courses
- **THEN** every course references a valid elective set ID, and the set's course list includes that course
#### Scenario: Cancelled courses are flagged, not deleted
- **WHEN** filtering courses by `cancelled === true`
- **THEN** the result includes both `spr5-customer-insights` and `sum2-managing-growing-companies`
### Requirement: Specialization definitions
The system SHALL define exactly 15 specializations. Each specialization SHALL have an ID, display name, and abbreviation. Specializations with a required course gate SHALL reference the required course ID.
#### Scenario: Specialization count
- **WHEN** the data module is loaded
- **THEN** exactly 15 specializations are defined
#### Scenario: Healthcare is included
- **WHEN** searching specializations for id `HCR`
- **THEN** a specialization named "Healthcare" is found
#### Scenario: Required course mappings unchanged
- **WHEN** inspecting specializations with required courses
- **THEN** exactly 4 specializations have required course gates: SBI → `spr4-sustainability`, ENT → `spr4-foundations-entrepreneurship`, EMT → `sum3-entertainment-media`, BRM → `fall4-brand-strategy`
### Requirement: Course-specialization qualification matrix
Each course SHALL declare which specializations it qualifies for, with a marker type of standard (■), S1, or S2. Courses with no qualifying specializations (including cancelled courses) SHALL have an empty qualification list. Reachability counts SHALL exclude qualifications belonging to courses flagged `cancelled`.
#### Scenario: Marker types
- **WHEN** inspecting course qualifications
- **THEN** every qualification entry uses one of three marker types: standard, S1, or S2
#### Scenario: Strategy markers
- **WHEN** counting Strategy-qualifying courses across all (non-cancelled) courses
- **THEN** exactly 9 courses have S1 markers and exactly 8 courses have S2 markers
#### Scenario: Reachable distinct-set counts per specialization
- **WHEN** counting distinct elective sets containing at least one non-cancelled course qualifying for each specialization
- **THEN** the counts are: MGT 11, STR 9, LCM 9, FIN 9, CRF 8, MKT 6, BNK 6, BRM 5, FIM 6, MTO 6, GLB 5, EMT 4, ENT 4, SBI 4, HCR 4
- **AND** these counts represent raw distinct-set reachability, not the CSV's published credit totals (which additionally apply S1/S2 and shared-course rules — out of scope for this assertion)
### Requirement: Renamed Digital Marketing course
The system SHALL display course `sum2-social-media` with the name "Digital Marketing Strategy in Practice" and the updated description anchored on the Memorial Sloan Kettering Cancer Center engagement. The course id SHALL remain `sum2-social-media` (unchanged) so existing lookup tables and tests continue to resolve.
#### Scenario: Display name updated
- **WHEN** inspecting the course with id `sum2-social-media`
- **THEN** its `name` is "Digital Marketing Strategy in Practice"
#### Scenario: Description reflects MSKCC engagement
- **WHEN** the user opens the course info popover for `sum2-social-media`
- **THEN** the description references Memorial Sloan Kettering Cancer Center, agentic AI, and digital strategy practice
#### Scenario: Instructor cleared pending confirmation
- **WHEN** inspecting the course's instructor list in `COURSE_DESCRIPTIONS`
- **THEN** the `instructors` array is empty
## REMOVED Requirements
_None. The "Managing Growing Companies" id, previously removed by `replace-cancelled-course-with-innovation-design`, is reintroduced as a cancelled placeholder per the J27 sheet — see ADDED Requirements above._