Skip to content

Track real eLumen + IR PeopleSoft schema capture for live-data enrichment #17

Description

@johnnyrobot

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

python3 -m pytest -q

Expected result: all non-live tests pass, live tests remain deselected unless explicitly requested.

References (current state on main)

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions