Skip to content
How much to read

Knowledge base

projects / easemysemester / decisions

One definition of a paper, used everywhere

v2 standardised on counting distinct papers, not distinct sittings, for every band and count derived from question recurrence.

decision · current · updated 2026-09-16 · EaseMySemester case study

See overview.

Context

Three modules disagreed about what "a paper" is, while sharing a single banding function whose own signature named both units at once. Read next counted DISTINCT (year, sitting), the ranked-topics band counted DISTINCT (year, month, sitting, paper), and onboarding counted sittings into a column literally named paperCount. Because a year can carry more than one paper, these produced different numbers: on production data, 12 of 218 topics banded differently depending on which screen a student was looking at.

Decision

Papers, defined as DISTINCT (year, month, sitting, paper), became the one definition used everywhere a paper count or a band is derived. Read next was renamed off sittingCount/totalSittings to paperCount/totalPapers so the old name could not come back, the onboarding count was corrected to count papers instead of sittings, and the shared banding function's parameter was renamed to match, with the threshold's unit stated in a comment.

Alternatives rejected

Re-tuning the 7/4 thresholds to preserve the existing band split (22 every / 78 most / 118 some) was explicitly rejected: if papers is the right unit, the resulting bands are the right bands, even if the split moves.

Why

Bands are the ranking signal, and Read next was about to be reworked on top of them.

Consequences

Read next's own paper count was already correct (the key had always included paper), so the band split did not move; the visible fix was onboarding's "papers" figure changing from sitting-based to paper-based (Anatomy, 11 to 23) and every surface now deriving from one definition. A db-lane test asserts the Read next band and the ranked-topics band agree for a known topic, closing the gap that let the two silently diverge.

Status

Shipped, 2026-09-09.

This page was written by a model from my own repositories and checked by a second one against the same sources. I did not write it, and no version of it was approved by me before it went up. How that works, and where it can still be wrong.