How Inquiry AI Reads a Child's Thinking — The Socratic Thinking-Trace Methodology
Inside the offline-first thinking-trace engine: hesitation timing, misconception fingerprints, hint escalation, and CCSS-aligned diagnosis with zero runtime LLM calls.
Most “AI math tutors” pipe a child’s answer to a large language model and stream a generated explanation back. That works, sometimes. But it is expensive, opaque, non-deterministic, and uncomfortably close to a black box — three problems that matter when the user is a seven-year-old.
Inquiry AI takes a different stance. We make every Socratic prompt, hint, and misconception explanation author-time content — written by educators, validated against the Common Core, and shipped as static JSON. There is no runtime LLM call anywhere in a learner’s session. What we do run at runtime is a thinking-trace engine: a tiny, deterministic state machine that watches a child solve a mission and turns the trace into a parent- and teacher-readable diagnosis.
This article explains how that engine works, why it is the right shape for K-6 math, and why it produces a more honest signal than answer-checking ever could.
What we record (and what we don’t)
A Socratic mission is a sequence of steps. Each step has a question, an expected answer, an interactive manipulative (an array, a fraction bar, a number-line, a balance scale), and three pre-authored hints: initial, onError, and onHesitation.
While the child works, the engine records a small set of events:
mission_start— the step they entered and the manipulative typeanswer_correct— including how long the child took to commiterror_submitted— the value they typed and the value we expectedhint_shown— which hint fired, and the trigger (onErrororonHesitation)- Optionally, a
misconceptiontag when the wrong answer matches a known fingerprint (e.g. typing4 + 6 = 10for a4 × 6array — the classic additive-vs-multiplicative gap)
We do not record audio, video, keystrokes, location, or anything that could identify the child outside their account. The trace is local-first and only sync’d to the parent’s account if the parent signs in.
Two signals that matter more than “right or wrong”
Answer-checking gives you exactly one bit of information: did the child get it. The thinking-trace engine adds two signals that turn out to be much more diagnostic.
1. Hesitation
We watch the time between the prompt rendering and the first interaction. If a child stares at a question for more than ~15 seconds without moving a manipulative, the engine fires the onHesitation hint. Hesitation is not failure — it is often the most informative event in the whole session, because it tells us where the child has the model but doesn’t know how to start applying it.
A child who answers wrong in 2 seconds is guessing. A child who hesitates for 18 seconds and then answers correctly is building a strategy. Both used to look identical to a worksheet. Now they don’t.
2. Misconception fingerprints
Every step can declare a misconceptions map keyed on specific wrong answers. When expected = 24 and the child types 10 on a 4 × 6 array, the engine matches that against the groups + perGroup fingerprint and surfaces the matching reframe (“you added the rows and the columns — try counting groups of”). This is far more useful than “wrong, try again”, because it names the category of mistake — and that category is what the parent’s report will summarize at the end.
Crucially, these fingerprints were authored by educators ahead of time. We are not asking an LLM to guess what the child was thinking; we are matching against a library of mistakes humans have already catalogued for elementary math.
Hint escalation, deterministically
Hints fire on a small, predictable ladder:
initial— shown when the step opens, framing the question without giving anything away.onHesitation— fires after ~15 seconds of inactivity. Reframes the question in a different representation (e.g. switches from equation to array).onError— fires immediately on a wrong answer, ideally tied to a misconception fingerprint when one matches.
The engine never strings hints together into a freeform paragraph. Each hint is a single authored line, and the child sees at most one new line per event. This is what makes the experience feel Socratic instead of generative: every nudge is a question or a reframe, not an answer dump.
From trace to diagnosis
At the end of the session — or at any point a parent opens the report — we summarize the trace into two top-line cards (a core strength and a focus area) and a timeline of the most informative moments. The summarizer is a small rule engine that looks at things like:
- ratio of
hint_showntoerror_submittedevents - whether
onHesitationfired but the eventual answer was correct (resilient reasoning) - whether the same misconception fingerprint fired across multiple steps (a stable gap, not a slip)
- which CCSS standards were touched and at what success rate
Because the rules are explicit, we can show parents why the report says what it says. There is no “the AI thinks…” line — there is “your child hesitated 18 seconds on step 1 and recovered after the equal-groups reframe.”
Why offline-first is the right call for K-6 math
The case for streaming an LLM during a child’s session is usually framed as “personalization.” In practice, K-6 math has a bounded, well-catalogued surface area. The Common Core has named the standards. Educators have catalogued the misconceptions. The manipulatives are finite. The right hints are not a generative problem — they are a curation problem.
By moving the curation to author time, we get four things you can’t get from a runtime model:
- Repeatability — the same child on the same step sees the same authored language. Reports are comparable across days.
- Auditability — every hint a child saw is a static string in a JSON file. No prompt-engineering surprises, no leaked tokens, no jailbreaks.
- Cost — zero per-session API spend, which means we can be free for the user without burning a runway.
- Latency — hints fire instantly. There is no spinner between “I’m stuck” and “here’s a reframe.”
It also keeps the door open. Nothing in the architecture prevents an LLM from helping us author new hints or scan a trace for new misconception patterns offline — that’s a great use of generative models. We just refuse to put one between the child and the next question.
See it in action
You can read a sample report at /insights/demo. It’s generated from a fixture trace, but it’s the same component, the same rules, and the same vocabulary you’d see for a real session. Or jump straight into a Grade 3 mission and produce one yourself — the report unlocks once the trace has data in it.
If you’ve been looking for an AI math product that explains its work, this is what we built.
Try the methodology yourself
See a sample thinking-trace report, or jump into a Grade 3 mission and produce your own.