A EducationalOccupationalProgram is defined as something that "would define a discrete set of opportunities (e.g., job, courses) that together constitute a program"
Credential Engine would like to provide information on Programs that lead to qualifications/educational occupational credentials, including information about a Program's constuent Courses.
A simple approach would be to extend the domain of hasPart to EducationalOccupationalPrograms. Perhaps a more thorough approach would be distinguish between optionalCourses and requiredCourses, as in HE at least there is often a core set of courses that must be taken, and a variety of options to either offer a broader base or more specialized finish to a Program.
If hasPart satisfies Credential Engine's use case, I think we should go with that and tackle more complicated use cases as they arise.
Every conversation I have had about modeling required vs optional courses has become overly complicated as every university (let alone different university systems or countries) seems to have a different way to track this.
PR #2559 adds hasCourse property with caveats about not implying it is mandatory, or even that it is availble to all hasCourse: A course or class that is one of the learning opportunities that constitute an educational/occupational program. No information is implied about whether the course is mandatory or optional; no guarantee is implied about whether the course will be available to everyone on the program. @WeaverStever not sure how your suggestions relate to what we intend; I think they are covered by educationalCredentialAwarded with various values of credentialCategory on EOCred referred to. Apologies for any misunderstanding.