Every quest in ThinkForTreats has a difficulty level, one to five. For a while I set that level once when a quest was created and left it alone. But the more I thought about it, the more it bothered me. Two different kids can hit the same quest and have completely different experiences. One finishes it in two minutes without breaking a sweat, another struggles with it for ten. A fixed difficulty treats every kid like they are the same kid, and they are not.
So I started working on a way for ThinkForTreats to notice this on its own and adjust. Every time a kid finishes a quest, the app looks at how long it took compared to how hard that quest was rated. If a kid blows through a hard quest fast, that is a sign they are ready for something tougher next time. If a quest takes way longer than expected, that is a sign to ease up a little. Instead of me guessing what feels right, the app quietly learns it from how each kid actually plays.
This runs entirely on Google Cloud. Every quest completion gets logged into BigQuery, along with how long it took and how hard that quest was rated, and that table becomes the training data. Instead of standing up a separate machine learning pipeline, I built the model straight inside BigQuery using BigQuery ML, so the data and the model live in the same place. It is a simple classifier that looks at those two numbers, difficulty and time taken, and recommends one of three things for the next quest, go up, stay the same, or ease off.
The training side runs on a schedule. Once a day, a BigQuery job automatically retrains a fresh version of the model on whatever new completions came in, checks its accuracy against the model that is currently live, and only promotes it if it actually performs better. If it does not, the older version just keeps running, so a bad training run can never make things worse. Every attempt gets logged too, so I can watch the accuracy numbers over time instead of guessing whether it is actually improving.
This is still in development as of September 23, 2026. I am testing it properly before it touches real kids using the app, and I will publish this log for real once I am confident it is solid.