Files
emba-course-solver/openspec/changes/j27-spec-update/specs/course-data/spec.md
T
Bill 4d6f81d1e5 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.
2026-05-09 14:50:26 -04:00

118 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 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._