At a K-12 online learning provider, 2025 to now

Forecasts that keep score

Every Friday I predicted how much student work would still be waiting to be graded on Monday, and wrote down in advance what result would prove me wrong. On Monday I checked, and kept a scorecard of hits and misses.

Role
Wrote and scored every forecast
Time
September 2026 to now
Tools
Python
Outcome
Two of five forecasts landed inside their range, and each miss improved the method

Problem

I work at a K-12 online learning provider: schools in the US and abroad partner with us so their students can take courses online. When students hand in assignments, a team of staff grades them, and we aim to grade each one within a set time. Handed-in work waits in a shared list, a “queue”, until someone grades it.

Weekends are the hardest stretch to plan: students keep handing in work, but fewer people are grading. The team’s leads wanted to know on Friday how much would still be waiting on Monday morning, so they could plan who grades what.

Constraints

  • I had only one count of the queue per day, taken at slightly different times.
  • How much the team grades over a weekend changes from week to week.
  • The prediction had to be ready before Friday ended, and honest about how sure it was.

What I built

A Friday forecast, written in Python. It starts from one simple fact: anything waiting on Friday that is not graded over the weekend will still be waiting on Monday. The hard part is predicting how much the weekend clears.

Each forecast gives a range rather than one number, lists its assumptions, and states in advance which Monday result would prove it wrong. My first forecast broke two of my own rules: I typed its numbers in by hand, and I narrowed its range, which made it look more certain than it was. After that, every number came straight from the saved daily counts, every range was widened rather than narrowed, and every forecast was a script. On Monday, the check first re-runs Friday’s script to confirm it gives exactly the same answer, and only then scores it.

Before the forecasts, I did the analysis behind a one-week push, co-led with a manager on my team, to bring the weekend workload down.

The diagram in words
  1. Daily queue snapshot, Saved copy, Forecast script, Range plus the rule that would prove it wrong, then "Friday" to Team leads.
  2. Monday snapshot, Inside the range?
  3. Solid path: Scorecard: hit.
  4. Dashed path: Scorecard: miss, Model change, then back to Forecast script.
  5. Scorecard, five weekends: miss above, hit, hit, miss below, miss above.

How I proved it worked, and where it did not

Every Monday I took the first morning count and scored Friday’s forecast against its own rule. The scorecard keeps every miss.

  • First idea: the weekend clears a fixed amount. The first forecast assumed the team grades about the same amount every weekend. I already knew this was shaky: two past weekends fit three different explanations equally well, and those explanations disagreed by a factor of three. Monday came in far above the range, which ruled the idea out.
  • Second idea: the weekend clears a fixed share. I switched to assuming the weekend clears a steady share of whatever is waiting on Friday. That held twice, missed once just below its range, and missed once well above it, right after the biggest Friday total since I adopted it.
  • A miss I had warned about in advance. That weekend, the amount graded stayed flat while Friday’s total grew by more than half, so more was still waiting on Monday. The forecast’s written rule had said this would happen if weekend grading does not grow with the workload.

Outcome

  • Two of five forecasts landed inside their range. The record is shown as it is.
  • Each miss improved the method: the fixed-amount idea was dropped first, then the fixed-share rule was marked unsafe after a big Friday.
  • Every forecast can be re-run from its saved numbers, so any disagreement is about the method, never about which numbers were used.

What I would do next

  • Forecast each subject team separately: spare time on the math team cannot grade a science assignment.
  • Publish a chart showing how often each forecast range held.

The demo it pairs with

Workload forecaster. Set how many people grade over the weekend and how much new work arrives, pick “fixed amount” or “fixed share”, then reveal Monday and see the forecast scored. A scorecard of past weekends shows the hits and the misses.

Workload forecaster

Made-up dataFull screen

Friday's pile is in: 191 pieces of work. Set the weekend, pick an idea of how much it will clear, and the forecast gives Monday as a band with the rule that would prove it wrong. Then reveal Monday.

The sliders and Reveal Monday need JavaScript. The forecast, the chart, the table and the scorecard below read without it.

This weekend

4 graders
25 pieces of work
Forecast idea

With JavaScript off, the forecast below is for 4 graders, 25 pieces of work and the fixed amount idea.

Band for Monday147 to 162

Assumption
With 4 graders, the weekend clears about 54 to 69 pieces of work, however big the pile is.
What would prove it wrong
Wrong if Monday is below 147 or above 162. Below would mean a bigger pile got more done than the usual amount. Above would mean less got done than usual.

Monday is hidden. Set the weekend, then reveal it.

Every weekend so far

Chart of 5 past weekends and this one. Each shows the Friday pile, the band forecast for Monday and the Monday reading. 3 of 5 past Mondays landed inside their band. The table has the same numbers.

Every weekend on the chart, in numbers
WeekendIdeaFriday pileGradersNew workBand for MondayMondayResult
Weekend 1Fixed amount146428112 to 127121Hit
Weekend 2Fixed amount241426206 to 222200Miss, below by 6
Weekend 3Fixed share144526103 to 120105Hit
Weekend 4Fixed share131425108 to 119108Hit
Weekend 5Fixed share276426197 to 221227Miss, above by 6
This weekendFixed amount191425147 to 162Not revealedNot scored

Scorecard of past weekends

  1. Weekend 1

    Fixed amount

    Hit

    Band 112 to 127. Monday came in at 121. Inside the band.

  2. Weekend 2

    Fixed amount

    Miss, below by 6

    Band 206 to 222. Monday came in at 200. This came after the biggest Friday pile so far. With more waiting, the team got more done than its usual amount. Its rule said in advance what a miss this way would mean.

  3. Weekend 3

    Fixed share

    Hit

    Band 103 to 120. Monday came in at 105. Inside the band.

  4. Weekend 4

    Fixed share

    Hit

    Band 108 to 119. Monday came in at 108. On the edge of the band, which counts as inside.

  5. Weekend 5

    Fixed share

    Miss, above by 6

    Band 197 to 221. Monday came in at 227. This came after the biggest Friday pile so far. The team did not speed up to match the bigger pile, so it cleared a smaller share. Its rule said in advance what a miss this way would mean.