Ihza MahendraResume
Back to Evaluation & calibration
Evaluation & calibration

Two tools for catching bad AI grading before it snowballs

A per-call log of every grading decision the system makes, plus a dashboard that reads that log across many people at once to catch a task that's grading too easily, too harshly, or drifting from what a human would say.

What it is

Two tools that watch every piece of automatic grading the system does. The first is a log that captures every single grading call as a row: what it was given (the rubric, the submission, prior context), what it returned (the verdict and feedback), which model made the call, which version of the prompt was used, and how long it took. The second is a dashboard that reads from that same log across many people at once, to surface things like which tasks are passing too easily, which ones are stalling everyone, and where the automatic verdicts are drifting away from what a human reviewer would say.

What it's for

When one person's grading result feels off, an operator needs to pull up that exact grading call, see exactly what the model was given and what it returned, and be able to replay it. When a task itself starts breaking down, everyone failing it, or everyone passing without real effort, an operator needs to see that trend before a whole group of people is affected. These two tools answer two different questions on the same underlying data: 'what happened on this one call?' and 'what's happening across every call?' Sharing the same source means a suspicious pattern on the dashboard links straight to the exact call that caused it.

How it was built

The log is a database table written to from every grading call, capturing the full input and output, the model used, the prompt version, the latency, and where the call came from. The dashboard is a web page that fires several summary queries at once (top-line numbers, daily trends, per-task breakdowns, common-issue counts, cost by model) against that same log table, all returning together in one round trip. Both tools share the same underlying schema, so a suspicious row in the dashboard view links directly to its full input, output, and exact prompt version in the per-call log.

My role

Major contributor on the per-call capture path, the model and prompt-version tagging on every row, and the analytics queries the dashboard fires in parallel.

Built with
ReactTypeScriptPostgresSupabaseRechartsPython

Want the full technical depth, the tradeoffs, what broke, what I'd do differently? Ask the agent about this project.