A flashcard tests recall, not understanding. Flip the card, read the answer,
and the question “did I actually get it?” is answered by you, and you are
the least reliable judge in the room. Overconfidence is the default: I kept
believing I knew a word while being unable to use it in a sentence, and the
app had no way to tell the difference.
I use
LexiStack to learn vocabulary and technical
concepts for myself, and that gap, between “I recognize this” and “I can use
this”, is exactly what a tutor closes. So I built one in: for every card in
a study session, the app now asks me to do something with the term, an LLM
checks whether my answer actually shows understanding, and if it doesn’t, it
explains the gap. The AI never grades the card on its own. It suggests, and
I decide.
LexiStack already used an LLM to
generate content (card suggestions, deck generation); this was the jump to
AI as an interaction layer during the study session. And it raised the
question that shaped every decision below: how do you add AI to a feature
whose core loop, the review plan that decides when each card comes back,
must never break?
graph TD
A[Card revealed] --> B[Task shown
from client-side template]
B --> C[User types answer]
C --> D["POST /api/tutor/cards/{id}/validate"]
D --> E{AI available?}
E -->|no| F[503, manual session continues]
E -->|yes| G[LLM returns verdict + feedback]
G --> H[Grade derived server-side
from the verdict]
H --> I[Suggested grade highlighted]
I --> J[User confirms or overrides]
J --> K["POST /api/study/{id}/review
review plan updates"]