Next.js 16 · Claude · Tailwind v4 · Vercel

Aprueba.
An AI examiner that
shows its doubt.

Reading and listening have an answer key — you can drill them alone. Writing doesn't: it needs an examiner scoring your work against a rubric, which is exactly the scarce, expensive thing a DELE/SIELE candidate can't get on demand. Aprueba is that examiner — it scores the four Instituto Cervantes dimensions separately, estimates your CEFR level as a calibrated range instead of a false-precise grade, and corrects your exact words. The hard part wasn't making an AI grade an essay; it was measuring how reliable that grade actually is, and showing the uncertainty on screen.

0.91
grading agreement (quadratic weighted kappa) with human-labeled essays
01 — THE PROBLEM

Reading has an answer key.
Writing needs an examiner.

Of the four exam skills, two grade themselves — reading and listening come with a key. The other two don't. So a learner preparing for DELE or SIELE can drill everything except the skill the exam actually turns on: producing language. Real feedback on a piece of writing means a human examiner reading it against a rubric — scarce, slow, and expensive, which is why most learners walk into the writing paper never having had their writing marked.

Software hasn't fixed this for a real reason: grading open-ended writing reliably is genuinely hard. It's subjective, and the naive move — "ask the model for a score" — produces a number that's confidently wrong and impossible to trust. The interesting problem isn't generating feedback; it's knowing how much to believe it.

2 of 4 skills
reading and listening self-check; writing and speaking don't
1 examiner
what honest writing feedback normally requires
A2 → B1 → B2
the levels a citizenship, visa, or university decision hangs on
02 — THE APPROACH

Treat the grader as unreliable —
then measure it.

The model can read and correct Spanish well, but you cannot take its subjectivegrade at face value — so Aprueba is built as a measurement-and-constraint harness wrapped around a stochastic grader, not a chat prompt that returns a score. Each Instituto Cervantes dimension is scored on its own, before any overall verdict, so one strong paragraph can't inflate the whole. The level is a calibrated range, never a hard point. Every correction must quote the learner's exact words — and any the code can't verify verbatim is dropped. The deterministic checks stay in code. And, crucially, a gold-set eval turns "is it any good?" into a number you can actually look at.

The discipline is the same one that runs through the rest of my work: the model proposes; deterministic code decides; and the whole thing is measured rather than asserted.

01
Grade per dimension
four rubric dimensions scored separately, before any overall level
02
Estimate a range
CEFR level as a calibrated band, never a false-precise point
03
Correct, anchored
every fix quotes the learner's exact words; unverifiable ones dropped in code
04
Measure it
a gold set + agreement metrics turn reliability into a number
03 — AN INTERFACE THAT SHOWS ITS DOUBT

The honesty isn't just in the engine.
It's on the screen.

The Feedback screen refuses every shortcut that would make the grader look more certain than it is. The level is a shaded band with an explicit "an estimate, not an official result." The four dimensions are scored apart. The word-count and points checks wear a"checked in code" chip, because the model doesn't grade those. And every correction quotes the learner's exact words before the fix — the app corrects what you wrote, never an invented error. When you write something off-topic, it says so: task fulfilment scored honestly low, and zero corrections manufactured. The interface would rather under-claim than flatter.

The grade
Aprueba's Feedback screen — a banded CEFR estimate, four dimensions scored apart, and inline corrections quoting the learner's words

Uncertainty made visible — a banded level estimate, four dimensions scored apart, checks marked "in code," and every correction quoting the learner's own words.

The honest refusal
Aprueba's off-topic state — task fulfilment scored low with zero fabricated corrections

Write off-topic and it scores task fulfilment low with zero fabricated corrections. It would rather under-claim than flatter.

The level is a range with a confidence band — never a false-precise point.
The four rubric dimensions are scored separately — no single blurred number.
"Checked in code" on the word-count and points chips — the model doesn't grade those.
Every correction quotes the learner's exact words; any the code can't verify verbatim is dropped.
ES/EN chrome, but the essay, prompt, fixes, and grammar tags stay Spanish — the learning stays immersive.
04 — WHAT IT DOES

Grades like the rubric.
Doubts like an honest examiner.

📊
Scores like the real rubric
The four Instituto Cervantes dimensions — adecuación, coherencia, corrección, alcance — each scored on its own, before any overall level. No single blurry number.
🎯
Estimates a level, honestly
A calibrated CEFR range with a confidence band. In exam mode, the band is themeasured spread across independent passes, not the model's self-report.
✍️
Corrects your exact words
Inline fixes tagged by grammar category (subjuntivo, concordancia, preposición…), each quoting the text verbatim. It never invents an error.
👤
Refuses to fabricate
Off-topic or gibberish gets an honest low score and zero made-up corrections; on failure it shows nothing rather than a partial grade.
05 — THE OUTCOME

Measured, not vibed —
including the parts that surprised me.

0.91 QWK
agreement with human labels; 100% within one CEFR level, never off by more
44%
of one-off corrections that multi-pass drops, raising precision
3/3
off-topic responses caught, with zero fabricated corrections

The gold set is small — about 13 author-labeled essays, a directional signal rather than a validated benchmark — so I read the numbers honestly. Against it the grader agreed with the human label at 0.91 by quadratic weighted kappa and was never off by more than one CEFR level; essays were near-perfect and the entire gap was short A2 letters over-graded by a single level. The measurement also overturned my own assumption: the level estimate turned out near-deterministic, so there was little level variance to reduce — the real stochasticity lives in the corrections, and that's where multi-pass earns its keep, dropping ~44% of the one-off suggestions only a single pass proposed. The confidence band proved informative (narrow bands were exact hits 91% of the time; the misses carried the wide ones), and the scores drift run-to-run between 0.85 and 0.91 — which is precisely the stochasticity the harness exists to manage. A grade costs about ₹1.13 and ~12s single-pass; exam mode runs three grades in parallel for ~₹3.38, staying well under the platform's 60-second cap.

The interesting result wasn't the score — it was learning where the grader was actually unreliable, and it wasn't where I'd assumed. Try it ataprueba.vercel.app.

STACK
Next.js 16ReactTypeScriptTailwind v4Claude (Sonnet 4.6)VercelNo database — grading is stateless; history lives in the browser
Anyone can make an AI grade an essay. The product was measuring how often it's wrong — and showing that on screen.