Inspiration

Every Grade 9 student in Ontario writes EQAO, the province's math test. The help you can get is either a tutor for sixty dollars an hour, or a practice app that puts a red X next to your answer and moves on.

We kept coming back to one problem with the red X: a wrong answer in math is almost never random. Ask a fourteen-year-old to add 2/3 + 1/4, and a shocking number of them will write 3/7. Tops with tops, bottoms with bottoms. It's tidy, it's symmetric, and it's wrong. Marking it wrong teaches nothing, because the student who wrote 3/7 already believed 3/7 was right. That's not carelessness. It's a rule, applied faithfully, just the wrong rule.

So we asked: what if the app didn't just mark you wrong? What if an AI could actually diagnose the exact wrong idea behind your wrong answer, teach that, specifically, and keep adapting until it stopped working on you? That question is the whole project. Every part of Prometheus Citadel that feels like judgment, like teaching, like a real tutor watching you think, is an AI model doing that work.

That question turned into five monsters guarding a citadel. Each one lives on a different way of being wrong. Fractis eats fractions added straight across. Equazor eats a sign that slips crossing the equals. Statiq eats mean and median blurred together. You don't beat them by guessing right once. You beat them by proving the trick that used to catch you doesn't catch you anymore.

What it does

Prometheus Citadel is an AI tutor disguised as a monster battling game, built for the EQAO Grade 9 course. An AI model sits behind almost everything you see: it teaches you, it explains your own mistakes back to you, it decides how you're doing, and it decides what happens next.

You pick a monster and get pulled into its hall for a battle: five real EQAO style questions pulled from our own verified question bank. Here's the part we're proudest of: every single wrong option on every question was written with a specific misconception attached to it, which we call a snare. So when you pick a wrong answer, the game already knows exactly which wrong idea you were using. It doesn't have to guess.

After the battle, the game finds the snare that caught you the most and starts a teaching loop:

  1. It teaches you one way of understanding the idea.
  2. It gives you a fresh question on the exact same topic, one you've never seen, so you can't just remember the answer.
  3. You answer, and you also type, in your own words, how you got there.
  4. The AI reads what you wrote and judges whether your reasoning actually holds up, or whether you got lucky, or whether you're still thinking the old wrong way. It isn't checking your answer against a key here. It's reading your explanation and making a real judgment call about your understanding.

You need two fresh questions right in a row, with real reasoning, to beat the snare. Get it wrong, or explain it in a way that still shows the old mistake, and your streak resets. When that happens, the AI itself picks a different way to teach you, and tells you why it's switching. There are four fixed ways it can explain something (a straight correction, a visual walkthrough, a side by side comparison of the wrong method and the right one, and a real world analogy), and the AI works through them in order, choosing the next one based on what you actually wrote, until one lands.

If you run out of every approach, the game doesn't just keep hammering you. It stops, tells you plainly that a real person is probably more useful right now, and sends a note home.

Above all five monsters hangs the Collector, a giant skull who tests the fast arithmetic you're supposed to already own, against a clock: ten questions, eight seconds each, three lives. Lose to him, and he sends you to train with one of his three lieutenants, each one drilling a single arithmetic shortcut (doubling and halving, fast multiplication by nine, making tens) until it's automatic. Even which lieutenant you get sent to is an AI decision, made by looking at your actual run and saying, out loud, why that one will help most.

And after every battle, the AI writes a plain language note home to a parent: what was fought, what snare caught the student, and three things to try at the kitchen table with nothing but coins or pizza slices. It turns raw session data into something a parent with zero math background can actually act on. A button on that page can even print a ten question practice sheet with the answer key on a separate page.

How we built it

The game runs as a Streamlit app with a three.js citadel and monster models rendered in the browser, so the whole thing plays in a web browser with no account needed.

The AI powering the whole experience is GPT-4o-mini, called through the OpenAI API, and it is doing real work, not decoration. But we didn't want a chatbot bolted onto a quiz. We wanted an AI tutor we could actually trust with a fourteen-year-old's math, so we built the whole thing around one rule: code owns what is true, and the AI owns what is judged. Nothing crosses that line, and everything on the AI's side of that line is a genuine judgment call, not a scripted response.

Concretely, that means:

Every answer key, every snare label, and every number that reaches a screen is decided by code, pulled straight from our verified question bank, never by the model. GPT-4o-mini's ten jobs are all judgment calls: writing the lesson for whichever teaching approach is active, explaining why a wrong answer felt right, giving graduated hints, judging whether a student's typed reasoning genuinely holds up (in one of three fixed labels: resolved, thin, or same wrong idea), picking the next teaching approach and saying why, writing fresh questions when the bank runs dry, speaking in character as the monsters, and writing the note home. Every one of those calls goes through a single function, so the whole app can be pointed at a bigger or smaller model just by changing one environment variable, and every model call can be counted against hard caps (four check questions, twelve model calls, or an exhausted list of teaching approaches).

The question bank itself has 55 questions across the five EQAO strands (Number, Algebra, Financial Literacy, Geometry and Measurement, Data), each one with a full worked solution and a named snare on every wrong option. That's 165 snares in total, audited against the real EQAO expectations, with the correct answer balanced across all four letters so nobody can just guess their way through.

Challenges we ran into

The hardest part of this project wasn't getting an AI to talk to a student. It was learning, the hard way, exactly where an AI can be trusted and where it can't, and building a guardrail every single time we caught it slipping.

The AI redid math it wasn't supposed to touch. Asked to re-explain a question it had already solved, it would quietly recompute the answer in confident prose, sometimes landing on a different number. Fix: the verified working now rides inside the prompt as the only arithmetic it's allowed to state. Its job is to explain why a method fails, never to recalculate.

The AI graded its own homework. When it wrote a fresh question, it sometimes marked the wrong option as correct, meaning a student could be told they were wrong when they were actually right. Fix: any question the AI writes has to be solved again blind, without seeing the key it just wrote, and the two answers have to match, or the question is destroyed before a student ever sees it.

The AI made up numbers in its own summaries. Once, it wrote that a student had "beaten three tricks" when they'd beaten exactly one, borrowing a number that belonged to a different count on the same page. Fix: on any page that goes home to a parent, code prints every number, and the AI prints none. Any reply with a digit in it gets thrown out.

An early draft of our question bank leaned hard on one answer letter. 58% of correct answers were option A. A student who always guessed A would have scored well and learned nothing. We rebalanced the key to 14/14/14/13 across A through D, and tied every snare to the answer's actual text instead of its letter, so it stays true no matter how the options get shuffled.

Underneath all of it is one sentence we kept coming back to: a small model is a capable judge and an unreliable authority. Everything it says in this game is a judgment. Nothing it says is the source of what's mathematically true.

Accomplishments that we're proud of

A question bank with 165 hand written snares, not just right answers, but a specific, named wrong idea behind every single wrong option.

An AI teaching loop that actually adapts: if one way of explaining something doesn't land, the AI picks a genuinely different approach on its own and tells the student why, instead of repeating itself louder.

An AI self check loop that catches the AI grading its own work wrong before a student ever sees the mistake.

A hard, working boundary between what the code guarantees is true and what the AI is allowed to judge, which meant every failure we found became a permanent guardrail instead of a one off patch.

A feature that turns a whole session into a plain language letter home, complete with a printable practice sheet, so a parent with no math background can still help that night.

What we learned

We learned that a wrong answer is data, not noise, and that the moment you can name why someone got something wrong, you can teach the actual thing instead of the test question. We also learned, repeatedly, that a language model makes an excellent judge and a genuinely unreliable source of fact: every guardrail in this project exists because we caught GPT-4o-mini being confidently wrong about something, and decided the fix belonged in code, not in a better worded prompt.

What's next for Prometheus Citadel

We're planning to add handwriting scanning, so a student can photograph or scan their own worked out equations on paper and have the game read their actual steps, not just their final typed answer. That would let the reasoning check work on real scratch work instead of a typed sentence, and catch a snare the moment it shows up on the page, not after the fact.

Built With

Share this project:

Updates

Submission history