Methodology.

How readiness, attention, and the drill recommender are calculated. Last updated: 9 May 2026 · subject to revision.

This page exists so principals, parents, and cadets can see the maths behind every number ExamPulse shows them. None of these formulas are secret. They are deliberately simple so a human can argue with them.

Tunable defaults. Every threshold below is the academy's starting point. The principal can override the criteria and weights via Settings → Risk criteria; that override is recorded in the audit log and takes effect on the next nightly snapshot.

Readiness · 0–100

A weighted blend of four sub-metrics, each normalised to 0–100. The blend is intentionally heavier on academic accuracy and adherence than on attendance, because readiness is about preparedness for an exam, not behaviour at school.

readiness  =  0.40 · accuracy_norm
           +  0.30 · adherence_norm
           +  0.20 · trajectory_norm
           +  0.10 · attendance_norm

Component definitions

ComponentSourceNormalisation to 0–100
accuracy_norm Average of last 8 drill attempts Already a percentage; passed through unchanged
adherence_norm Drills attempted in the last 7 days min(100, drills_7d × 14) — ~7 drills/week saturates at 100
trajectory_norm Slope of the last 8 drill scores clamp(50 + slope × 5, 0, 100) — flat = 50; +10 pts/test = 100; −10 pts/test = 0
attendance_norm Present-ish % over the last 30 days Already a percentage; passed through unchanged

Why these weights?

A cadet who is consistently scoring well but absent two days a week is more ready for an exam than a cadet who is in class every day but failing every drill. The weights reflect that. They are not the right weights for every academy — principals are encouraged to tune them and watch how the rankings move.

Trajectory is bounded so a single fluky test doesn't whipsaw the score. The slope is computed over 8 attempts, not 3, for the same reason.

Attention classification

Readiness 0–100 is a continuous score, but the dashboards also colour-code each cadet so the principal can sort by who needs the eye today. The bands:

BandReadinessColour
Critical< 50Red
Attention50–64Amber
Steady65–79Green
Standout80+Green

The 3-of-3 criteria gate (legacy)

Earlier versions of this product used a separate criteria-gate model: a cadet was flagged High-risk only when 3 of 3 thresholds fired (attendance < 80%, recent score < class avg by 5+, and a declining trajectory). Both views still co-exist on the snapshot — the criteria gate is a stricter trigger that catches a clear pattern, while the readiness band is an early-warning that flags drift before all three criteria fire.

Drill streak

A streak counts consecutive days on which the cadet completed at least one drill. Sundays and academy-declared holidays do not break a streak. A missed weekday breaks the streak; the counter resets to zero.

The streak counter is reconciled at 02:30 IST against the previous day's completed drills. The cadet's drill that begins at 11pm on a Tuesday counts toward Tuesday's streak, not Wednesday's.

A cadet can snooze today's drill (counts as missed for streak purposes), pick another (replaces today's recommendation, doesn't count as a miss), or skip with a free-text reason (counts as missed). Skip reasons are visible to the commander and entered into the case timeline.

Drill recommender

When the cadet opens "Today's drill", the recommender picks one in five steps:

  1. Read the cadet's latest snapshot (subject performance, recent attempts, weak topics).
  2. Pick the subject with the worst gap of (student_avg − class_avg). Ties broken by lowest absolute student average.
  3. Within that subject, pick the weakest topic from the snapshot's weakTopics array. If empty, pick the test name from the most recent below-60% attempt in that subject.
  4. Query the question bank for that subject + topic, excluding any question IDs the cadet attempted in the last 7 days.
  5. Compose 30 questions with a 60% Hard / 30% Medium / 10% Easy mix — deliberately bias-Hard because we are targeting a weak area.

The recommendation is idempotent for 6 hours: reloads of the cadet's drill page within that window return the same drill, so the cadet doesn't see a churning recommendation if they're hesitating.

Commander-assigned drills always take precedence over the recommender. If the principal or teacher has issued a drill, the recommender's pick is suppressed until the assigned drill is completed or skipped.

What we do not do

Suggesting a change

If you are a principal and you think a threshold should move, edit it in Settings → Risk criteria. The change is logged and applies on the next nightly snapshot. If you are a parent and you think a number is wrong, write to the Data Protection Officer.

Source code for these calculations lives in functions/at-risk-snapshots.js (readiness, classification), functions/streaks.js (streak), and functions/drill-recommender.js (recommender). The repository is the source of truth; if anything on this page contradicts the code, the code wins until this page is updated.