A small, runnable prototype of the highest-leverage changes from the teaching review. It's not a rewrite of the course; it's a seed you can grow. Everything here works today — run the demo and see.
python demo/demo_end_to_end.py # see the whole idea in 5 seconds
python -m pytest -q # 9 green tests
Give every student personalized data behind a course-specific API, grade it instantly, and ask questions that require reasoning — not recall.
That single move fixes the two biggest problems the review found at once:
| Problem from the review | How this system answers it |
|---|---|
| ~18 of 19 homeworks are one-shot solvable by ChatGPT | Data is per-student (can't copy) and the rules live only in chem438 (the LLM guesses them wrong) |
| Homework is drill, not reasoning | Lessons follow Predict → Run → Investigate → Modify → Make, plus debug and interpret problems |
| 5-week feedback blackout | me.checkpoint(...) returns instant ✓/✗ in the notebook |
| "hw asks for things we didn't cover" | The rules the student needs are in help(chem438.synthlab), one cell away |
| Science stays decorative | Every lesson ends with an interpretation question a human grades |
chem438/ the custom library — the core AI-resistance lever
roster.py enroll(nuid) -> a stable, personal seed
synthlab.py each student's unique compound batch + course-only rules
check.py in-notebook autograder (instant feedback)
practice.py unlimited self-checking practice problems (the "drill more")
lessons.py the task checklist → chem438.instructions("lesson_01")
_keys.py instructor answer key (recomputes, so no reward-hacking)
assignments/
lesson_01_basics.md the true first lesson — variables/arithmetic/types/strings
lesson_03_loops.md a few weeks in — loops + the custom-library AI-resistance
make_assignment.py stamps each student's id into their own .ipynb (--lesson)
demo/demo_lesson_01.py a full walkthrough of the first assignment as a student sees it
demo/demo_end_to_end.py proves: deterministic, per-student, catches cheating
instructor/
grade_submissions.py batch-grade a folder of notebooks → gradebook CSV + prose
INSTRUCTOR_GUIDE.md how students know what to do, how to grade, orals, hide keys
tests/test_smoke.py 15 tests
ROADMAP.md ← what to try first, and in what order
chem438 is a real pip-installable package (see pyproject.toml), so a student
on Colab needs one line at the top of the notebook — no files to upload:
!pip install -q "chem438 @ git+https://github.com/YesselmanLab/chem438.git"Then import chem438 works exactly as below. Three ways to host it, easiest first:
- Public GitHub repo → the
git+https://…install above. Simplest; but the source (including_keys.py) is readable, so use it only for the pilot or split the keys out (seeINSTRUCTOR_GUIDE.md). - PyPI (
pip install chem438) → cleanest for students; public source. - Private repo / prebuilt wheel on Drive → keeps
_keys.pyout of reach; the recommended path once you care about hiding answers.
make_assignment.py already puts the install line as the first cell of every
generated notebook — edit the INSTALL_URL at the top of that file once to point
at wherever you host it. Because the package has zero dependencies, the
install is a couple of seconds and never fights Colab's pandas/numpy/rdkit.
# (Colab: run the !pip install cell first)
import chem438
me = chem438.enroll("your-nuid") # same id all semester
# --- Lesson 01, the basics ---
w = me.warmup() # your personal numbers
sum_ab = w.a + w.b
# ...define product, remainder, power, label_x3, mass_label...
me.checkpoint("lesson_01", globals()) # instant feedback on YOUR numbers
# --- Lesson 03, a few weeks later ---
batch = me.pull_batch() # your 24 compounds
help(chem438.synthlab) # the rules an AI doesn't know
# ...define n_compounds, heavy_codes, ...
me.checkpoint("lesson_03", globals())- Pure standard library. No numpy/pandas/rdkit dependency in
chem438, so it installs instantly and runs in Colab. Students still use pandas — they build a DataFrame frombatch.to_records(). The library is the data source, not a replacement for the real tools. - One theme, all semester (SynthLab compounds). Continuity means the same personalized objects carry from loops → dicts → pandas → plotting → rdkit. If you'd rather have per-unit themes (spectra, sequences, structures), that's a one-file change — see the ROADMAP decision points.
- Two lessons built out, not twenty. Lesson 01 (day-one basics) and Lesson 03 (loops) are the worked examples — they show the pattern at the two ends of the difficulty range. The point is to react to concrete things before scaling.
Read ROADMAP.md for the sequenced plan and the four decisions I need your read on.