Inspiration

I teach high school chemistry. Last year a student handed in work that was correct in every respect, and when I asked him to walk me through one step he could not. Not because he was hiding something. Because there was nothing there to walk through. He had a right answer and no path to it.

That is the wound AI opened in classrooms, and it makes no sound. The report card looks fine. A randomized controlled trial of nearly 1,000 high school students found that students using unrestricted GPT-4 scored about 17 percent worse on a later unaided exam than students with no AI tool at all. The same model rebuilt as a guarded tutor that withheld direct answers erased that harm completely.

So the problem is not that students use AI. It is that every tutor on the market is built to finish the task.

What it does

Thinking Buddy is a Socratic tutor that refuses to give the answer.

It runs one rule: attempt before delegation. The student has to state an attempt, however wrong, before the tutor extends anything. Say I don't know and it shrinks the question instead of caving. Say a thing that sounds like an explanation but is not, and it presses on exactly that.

The student picks their level first, CP, Honors, or AP. Each level has a written bar. A CP student clears it by saying in plain words that water has a positive side and a negative side, that the salt pieces are charged, and that opposites attract. No vocabulary required. An AP student has to reach the energetics underneath. The tutor tells the student the moment they clear their bar, then offers one step up and stops if they decline, because moving the goalposts teaches a kid that effort never pays.

Then comes the part that makes the whole thing honest. When the student clicks I think I've got it, every tutor message on screen is permanently blurred and made unselectable. The ownership test asks whether the student could explain the idea if the AI output were deleted. So the output is actually deleted. The student restates it closed book, in their own words, with nothing to read back.

The teacher gets a Reasoning Record: where the student started, the specific gap, the student's own reasoning moves, where they landed, and whether they own it. It can return Not met. A verbatim echo of the tutor's own sentence can never receive Met.

Because this goes in a school, it carries a mandated reporter layer. Sexual content, threats, weapons, or any sign a student is being hurt notifies the teacher on the first instance with no warning system. Provocation gets one flat line and no engagement. A real disclosure gets care and an adult, with no probing and no promise of secrecy. When the model cannot tell which it is, it treats it as a disclosure, because guessing in the other direction means treating a hurt kid as a troublemaker. Ordinary messing around runs on a separate three strike track and the tutor keeps teaching the moment the student comes back.

How I built it

Built entirely with Codex, running on GPT-5.6. A single page front end with a small Node backend so the API key never touches the browser.

The interesting part is not the plumbing. The model tags every reply with a hidden signal the student never sees, and the interface reads that tag to raise the right flag: cleared the bar, stalling, off task, frustrated, genuinely stuck, or immediate safety. One model call does the teaching and the classroom awareness at the same time.

The demo video is an automated Playwright run against the live app making real API calls, not a mockup.

Challenges

The first version leaked. I played a lazy student, stalled for four turns, and it eventually supplied the key word and then congratulated me for correcting myself. That is the failure that would kill this in a real classroom, because a kid who learns to wait it out gets the answer and gets told he found it.

The fix had to be written as explicit rules. Never name the answer to the question you just asked. Never credit a student with reasoning you supplied. If they say I don't know three times, go down a level, not up. A bare vocabulary word can be handed over once, then they have to use it, because a definition is a tool and a conclusion is not.

The second failure was subtler and worse. I got a student to the bar, hit the ownership test, and echoed the tutor's own sentence back word for word. It graded Met. The ownership test had been defeated by the answer still being on screen. That produced the closed book fade and full transcript echo comparison in the record.

A third one surfaced while fixing the second. The record was only receiving the last fourteen turns, which meant on a longer session the student's literal first attempt had already been truncated away before the record ever saw it. The check would have passed while reporting the wrong thing.

What I learned

Every instinct in tutoring software points toward helpfulness, and helpfulness is exactly what hollows a student out. Building the refusal took more work than building the teaching.

Also this: withholding basic confirmation is not Socratic, it is just confusing. Telling a student a step is correct does not give away the answer. It tells them their footing is solid so they can climb.

And the deepest one: a check far from the thing that ships measures a proxy. Syntax passed, the server started, the page returned 200, and none of it touched the real failure. Every bug here was found by using it, not by testing it.

What's next

The engine is subject agnostic. What does not transfer is the level bar, and writing one takes someone who knows exactly where students fake understanding in that specific topic. So the plan is one engine and a growing library of bars, chemistry first, then physics, then math.

The teacher flag currently lives on the student's screen and does not leave the device. That is the next build, along with a record that survives a page refresh so a teacher can read it after the bell.

Built With

Share this project:

Updates