Goal
Complete the remaining real-data slice after m7 foundation.
m7 shipped the offline/deterministic plumbing:
- exact guarded DNF→CNF prerequisite conversion
- fixture-backed eLumen prerequisite mapping
- IR/PeopleSoft enrollment ingest
- detector activation when overlapping enrollment data is present
engine.run() remains deterministic and offline
What remains is validating those seams against real source shapes.
Needed Inputs
1. eLumen prerequisite payload
Current assumed shape, not validated on real data:
{
"source": "elumen ...",
"campus": "LAMC",
"courses": [
{
"course_id": "PHYS 102",
"raw": "(MATH 245 and MATH 246) or PHYS 185",
"dnf": [["MATH 245", "MATH 246"], ["PHYS 185"]]
}
]
}
Required meaning:
course_id: gated course in engine catalog form, e.g. PHYS 102
raw: original human-readable prerequisite text for provenance/debugging
dnf: outer list is OR branches; inner list is AND-required courses
- missing/empty
dnf means no prerequisite
Need captured real response/schema before implementing a live HTTP client. Do not invent endpoint/auth.
2. IR PeopleSoft enrollment export
Expected .xlsx sheet: sections
Required columns:
Term
Class Nbr
Cap Enrl
Tot Enrl
Wait Tot
Expected join: (int(Term), bare Class Nbr)
Notes:
- IR side
Class Nbr should be a bare CRN, e.g. 20001.
- Live schedule side has decorated
class_nbr, e.g. 17818 (LEC).
- Join strips the leading integer from live
class_nbr.
- Real validation requires overlapping terms and CRNs with live schedule data.
- Instructor/student-level PII should not be included or committed.
Optional context columns may include:
Descr, Campus, Subject, Catalog, Section, Session, Class Type, Component, Class Status, Mode, IN_PERSON, Wait Cap, FILLD, .FILLPERCNT, ENRL, LMT, Acad Org, Dep, Discipline, IGETC, OER, FTE, Class Workload Hrs, LEVEL, CLASS, SEC, Class Start Date, Class End Date
Acceptance Criteria
- Real/captured eLumen schema is documented with sensitive data redacted.
- Real/captured IR export schema is documented with no student/instructor PII committed.
- eLumen adapter maps real payload into current
course_id/raw/dnf internal shape.
- IR export with overlapping
(Term, Class Nbr) activates enrollment-driven detectors.
- Zero-match enrollment joins remain explicitly reported as inert, not silent success.
- Prereq conversion flags guarded fallbacks when DNF→CNF expansion exceeds the clause limit.
engine.run() remains offline/deterministic; all source fetching stays outside the engine.
- Tests cover real-shape fixture parsing, join match, zero-match behavior, privacy, and detector activation.
Non-goals
- No credentials in repo.
- No fabricated eLumen endpoint.
- No real student-level data.
- No networking inside
engine.run().
Verification
Expected result: all non-live tests pass, live tests remain deselected unless explicitly requested.
References (current state on main)
🤖 Generated with Claude Code
Goal
Complete the remaining real-data slice after m7 foundation.
m7 shipped the offline/deterministic plumbing:
engine.run()remains deterministic and offlineWhat remains is validating those seams against real source shapes.
Needed Inputs
1. eLumen prerequisite payload
Current assumed shape, not validated on real data:
{ "source": "elumen ...", "campus": "LAMC", "courses": [ { "course_id": "PHYS 102", "raw": "(MATH 245 and MATH 246) or PHYS 185", "dnf": [["MATH 245", "MATH 246"], ["PHYS 185"]] } ] }Required meaning:
course_id: gated course in engine catalog form, e.g.PHYS 102raw: original human-readable prerequisite text for provenance/debuggingdnf: outer list is OR branches; inner list is AND-required coursesdnfmeans no prerequisiteNeed captured real response/schema before implementing a live HTTP client. Do not invent endpoint/auth.
2. IR PeopleSoft enrollment export
Expected
.xlsxsheet:sectionsRequired columns:
TermClass NbrCap EnrlTot EnrlWait TotExpected join:
(int(Term), bare Class Nbr)Notes:
Class Nbrshould be a bare CRN, e.g.20001.class_nbr, e.g.17818 (LEC).class_nbr.Optional context columns may include:
Descr,Campus,Subject,Catalog,Section,Session,Class Type,Component,Class Status,Mode,IN_PERSON,Wait Cap,FILLD,.FILLPERCNT,ENRL,LMT,Acad Org,Dep,Discipline,IGETC,OER,FTE,Class Workload Hrs,LEVEL,CLASS,SEC,Class Start Date,Class End DateAcceptance Criteria
course_id/raw/dnfinternal shape.(Term, Class Nbr)activates enrollment-driven detectors.engine.run()remains offline/deterministic; all source fetching stays outside the engine.Non-goals
engine.run().Verification
Expected result: all non-live tests pass, live tests remain deselected unless explicitly requested.
References (current state on
main)sources/prereq_cnf.py,sources/elumen.py,sources/enrollment.py,sources/mapping.py,build_live_workbook.pydocs/superpowers/specs/2026-05-30-m7-real-data-enrichment-design.md· Plan:docs/superpowers/plans/2026-05-30-m7-real-data-enrichment.mdfiles/lamc_sample_enrollment.xlsx(terms 2248/2252) · eLumen fixture:tests/fixtures/elumen_prereqs_LAMC.json🤖 Generated with Claude Code