projects / easemysemester / features
Citations as a child table, with Netter plates as see-also
Citations moved from a JSONB blob to a foreign-keyed child table that cannot name a nonexistent book, and Netter plate references are additive, never a substitute for a grounded citation.
feature · current · updated 2026-09-16 · EaseMySemester case study
See overview, v2, and citation provenance.
Citations are also model-selected rather than built from every retrieved chunk: the generation
prompt returns which of the supplied passages the answer actually drew on, and the script
builds citations from exactly those, deduped by (book_id, printed_page), so a student never
sees the same page listed twice. chunk_ids still record every chunk the model read, kept
separately as provenance regardless of which ones the answer cites.
Netter plates as see-also, never a substitute for grounding
A Netter figure is cited by plate label, not page, and is deliberately additive: the answer
script only appends a Netter plate on top of an already-grounded, page-cited answer, so a
figure reference can never make an ungrounded answer read as complete. Citation dedup keys on
(book, page) for text and (book, plate) for figures, so the same plate is never listed
twice.
On the read side, citations that once rendered as a flat list, three pages of one book showing as three separate sources, now group to one entry per book with pages listed ascending and plates kept in their own line, since a plate points a reader to a figure, not a page. A book cited with neither a page nor a plate is still listed, since the answer was grounded in it.
Status
The answer schema and citations table (issue #14) and the generation script that consumes them (issue #15) are covered in answer generation. Netter plate citations shipped 2026-09-08, and the grouped, per-book render shipped 2026-09-09 (issue #18).