Practice diagnosing CS
misconceptions — out loud.

PRAXIS is a voice-enabled simulator for office-hours practice. Talk to a simulated student with a real, documented misconception, surface it through questioning, and get a coaching debrief on how you did.

No account needed for the demo — nothing is saved.

See a real diagnosis

A four-turn office-hours session: the TA surfaces Sam's list-aliasing bug before correcting it. Every turn is classified into a diagnostic move — watch the one leading question get flagged.

Office hours · Sam

Press ▶ Play to watch the diagnosis, or Step → through it one turn at a time.

Sam's code editor
def add_item(cart, item):
    backup = cart
    backup.append(item)
    return backup

cart = ["milk", "eggs"]
new_cart = add_item(cart, "bread")
print(cart)  # I made a backup first, why did cart change too?
Your turn — try a question

Type something you might ask Sam. We'll classify the move with the same model PRAXIS uses in a live session.

Try:

Coaching the skill, not just the answer

PRAXIS is organized around one move — elicit the student's mental model before you remediate. Every turn is labelled, and the two anti-patterns are flagged in the moment.

Probe

An open question that invites the student to reason. The move that surfaces a misconception.

The goal move
Tell

A statement that gives the answer or explanation. Fine once the student has reasoned — an anti-pattern before that.

Watch: telling too early
Leading

A question with the answer embedded (“so b is a copy, right?”). Reveals nothing about what the student actually believes.

Anti-pattern
Neutral

A greeting, acknowledgement, or other non-diagnostic move.

Neutral

A fourth signal — rush — applies alongside any move: stacking several questions into one turn leaves the student no room to think, so a good-but-rushed probe is praised and paced.

Fast enough to feel real

Every turn is measured against a 1850 ms believability floor — the point past which the pause stops feeling like a real person thinking. Streaming speech-to-text, first-clause audio flushing, and pre-warmed connections keep turns under it.

Powered by a swappable STT · LLM · TTS provider stack.

What's under the hood

🎙️ Talk out loud

A streaming speech-to-text → LLM → text-to-speech loop over a websocket. Drive a turn by push-to-talk or a text chat bar; the student replies in its own voice.

🕵️ Diagnose blind

“Generate student” produces a fresh case shown only with a symptom brief. The misconception is hidden behind a Reveal — you diagnose it by asking, the way a real TA does.

👉 A shared code window

The student brings real, buggy code. Click any line to point the student at it, and watch the student edit its own code as the misconception clicks — the fix lands in their file, not just in words. The debrief judges whether it actually resolves the bug.

🖉 A whiteboard the student sees

Sketch a diagram mid-diagnosis — a box-and-pointer picture, a call stack, a trace. Your drawing rides the next turn to the student as a vision image, so it reads what you drew and reasons about it. The one place PRAXIS looks, not just listens.

📚 Literature-grounded

Misconceptions are sampled verbatim from a bank of 25 documented novice misconceptions (Qian & Lehman, 2017), each carrying its citation. The model only invents the surface.

🧠 Memory that resists drift

Each student keeps a split memory — recent turns verbatim plus a distilled knowledge base of facts — so it stays in character across a long conversation without ballooning context.

📋 Structured debrief

Every session ends with a reflection: whether the misconception was surfaced through questioning, a summary, what stood out, and concrete next-time suggestions.

📈 Progress dashboard

Sign in and your sessions persist: probe-to-tell ratio over time, diagnosed-before-correcting rate, misconceptions practiced vs. the 25-entry bank, and median latency.

…and here's the debrief for that session

Built from the student's distilled memory plus the tally of your diagnostic moves.

↑ Back to the conversation Misconception surfaced ✓ Code resolves the misconception ✓
Probe 2 Tell 1 Leading 1 Neutral 0

You surfaced Sam's aliasing misconception before correcting it: the open question about what backup and cart point to got Sam to realize they might be the same list, and only then did you explain the fix. Sam then edited the code to backup = list(cart) — a real copy — so the fix landed in their own code, not just words. Watch the one leading question early on — it can only earn a yes.

What stood out

  • Your third question (“what do backup and cart each point to?”) is what made Sam reason aloud and doubt the copy assumption.
  • You held the explanation until after Sam had surfaced the belief — the right order.

Try next time

  • Replace the early “…makes a copy, right?” with an open question so you learn what Sam actually believes instead of prompting a yes.

Sorva (2013), via the CS-education misconceptions literature.

Step into office hours.

Practice the diagnostic conversation on realistic simulated students — safe, repeatable, and scored on your technique.

Questions or feedback? cyrus@praxissim.org