Indian Medical PG (NEET-PG) Rezzy
Learner state: a PYQ set yesterday, 9 misses across two subjects
You missed 9 in yesterday's PYQ set, 7 of them in Internal Medicine. Let's walk through those misses together.










Final version. The prototype stopped after review round 11, at the owner's call: the councils stayed at 7-8 of 10, short of the 9/10 bar, and the next step is a structural change (below), not another fix round.
Prototype · ONC2-8580 · staging data and staging QA accounts only · not shipped · api 9804566b (api#1438), app c1c844b4c (#2659), both draft PRs, not for merge
When a learner opens Home, their course's tutor (Rezzy for the medical courses, Savvy for CFA and CPA, Casey for LSAT and the Bar) opens with one short message about what the learner did last, and one or two things it can do about it right now: a quiz on the exact questions they missed, their due cards, the lesson they should read next, or a question they can answer with a tap. Each tap lands where it says: a quiz already built, a screen, or a chat that starts from the card.
Code decides what is possible and true; one model call decides what is worth saying today and says it in the tutor's voice; code checks the result before the learner sees it.
The model picks components by reference; the app draws them from design-system parts. It can't put a number or an id in one.
| Component | What it shows |
|---|---|
question_set | The set an offer is about: topics, "4 missed of 10", source, when. From the offer's facts, never model text. |
flashcard_peek | How many cards, the topic, and the front of the shortest card (a cloze is blanked). |
lesson_peek | The lesson's title, subject and minutes. |
subject_bars | Readiness bars for the subjects the message names, with their trend. |
Buttons | One or two actions, the first primary. Each is an offer id. |
Chips | Replies: a check-in's answers, or "Something else" to answer in their own words. |
| Offer kind | Opens | Resolved as |
|---|---|---|
quiz_set | A quiz on the exact questions they missed | a test template made at tap time, one per card and offer |
quiz_topic | New questions on a subject or topics (PYQs where the course has them; five easier ones as a small win) | picked at tap time |
flashcards_due | Review of their due cards in this course | route |
flashcards_ids | Review of exact cards (forgotten 3+ times, never reviewed) | route |
lesson | A lesson by id | route |
game | A game on a subject where the course has it | route |
open_chat | The walkthrough chat they left, at the question they reached ("Pick up at Q3") | route to that chat |
chat | The tutor's chat, seeded: explain misses, cards from misses or a lesson, review cards, mini lesson, summary, plan the exam, check-ins | chat with a server-side plan |
Eval v11b at api 4762e561 (the commits after it change prompt copy and add checks): the full set of 162 synthetic learners across the nine courses, in the situations each course meets (misses, a lesson read, due cards, an exam passed, a walkthrough left part way, a new learner, back after a break, big piles, one-topic sets). The rules write the card for the 9 with a walkthrough to pick up, with no model call; the other 153 get one Gemini 3.5 Flash Lite compose each through the api's provider setup, one retry with the validator's errors, then the rules' card. A second model (Gemini 3.6 Flash) judges each valid card.
| Model | Runs | Valid first try | Valid after retry | Fallbacks | First call p50 / p95 / max | Whole compose p50 / p95 / max | Mean cost |
|---|---|---|---|---|---|---|---|
| gemini-3.5-flash-lite | 153 | 118 | 143 | 10 | 1187 / 1504 / 4905 ms | 1258 / 2709 / 5450 ms | $0.00137 |
| Model | Judged | Pass all four (person, times, claims, fit) | Mean voice (1-5) |
|---|---|---|---|
| gemini-3.5-flash-lite | 143 | 139 | 4.42 |
At one fresh card per active learner per day, 10,000 learners cost about $14 a day. The walkthrough chat uses the existing chat model; its first turn takes about 8 s on staging.
Recommendation: GPT-6 Luna at low reasoning effort, through the AI Gateway. In a blinded read it wrote the best cards (step 4.73 of 5, no factual errors in 15), with no fallbacks and 13 of 15 valid on the first call. It costs about a quarter of today's model at list price ($0.00054 against $0.00233 per Home render, about $5 against $23 a day for 10,000 learners). The price is about half a second: a full card's p50 is 2.6 s against 2.1 s, and 1 card in 15 took 7.0 s, past the 6 s inline budget, so the rules card stays as the backstop. Run the full 162-learner eval on it before switching. GPT-6 Luna at none is the faster runner-up (worst 5.2 s, step 4.13).
Medium and high effort don't suit an inline card: 7 and 15 of 15 cards went past 6 s, and they wrote no better cards. DeepSeek V4.1 Flash with thinking off is the fastest to a first card (p50 1.3 s), but it fell back 3 times in 15. With thinking on it is slow (full card p50 8.5-8.7 s, worst 43 s) and costs 2-3 times today's model.
| Model, effort | First card p50 / p95 | Full card p50 / p95 / max | Over 6 s | Cost per render | Valid first / after retry / fallback | Judge pass | Voice | Main = top offer | List price, uncached | Blind step / voice (1-5) | Factual errors (blind) |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Gemini 3.5 Flash Lite, thinking low (today) | 1.7 / 2.1 s | 2.1 / 3.4 / 3.5 s | 0 of 15 | $0.00136 | 8 / 14 / 1 of 15 | 14 of 14 | 4.86 | 14 of 14 | $0.00233 | 3.13 / 3.20 | 0 of 15 |
| GPT-6 Luna, none | 2.3 / 2.5 s | 2.4 / 5.2 / 5.2 s | 0 of 15 | $0.00020 | 10 / 15 / 0 of 15 | 15 of 15 | 4.80 | 15 of 15 | $0.00063 | 4.13 / 3.27 | 0 of 15 |
| GPT-6 Luna, low | 2.4 / 2.9 s | 2.6 / 5.4 / 7.0 s | 1 of 15 | $0.00019 | 13 / 15 / 0 of 15 | 15 of 15 | 4.80 | 15 of 15 | $0.00054 | 4.73 / 3.60 | 0 of 15 |
| GPT-6 Luna, medium | 5.9 / 8.1 s | 5.9 / 13.2 / 18.7 s | 7 of 15 | $0.00049 | 13 / 15 / 0 of 15 | 14 of 15 | 4.93 | 15 of 15 | $0.00084 | 4.13 / 3.27 | 4 of 15 |
| GPT-6 Luna, high | 10.4 / 16.2 s | 10.4 / 16.2 / 21.6 s | 15 of 15 | $0.00058 | 15 / 15 / 0 of 15 | 15 of 15 | 4.87 | 15 of 15 | $0.00095 | 4.47 / 3.20 | 2 of 15 |
| DeepSeek V4.1 Flash, none | 1.3 / 2.7 s | 2.2 / 2.9 / 3.4 s | 0 of 15 | $0.00124 | 10 / 12 / 3 of 15 | 12 of 12 | 5.00 | 12 of 12 | $0.00181 | 3.93 / 3.67 | 1 of 15 |
| DeepSeek V4.1 Flash, low | 4.7 / 11.8 s | 8.5 / 18.3 / 21.5 s | 8 of 15 | $0.00351 | 9 / 14 / 1 of 15 | 14 of 14 | 4.50 | 14 of 14 | $0.00410 | 4.40 / 3.07 | 1 of 15 |
| DeepSeek V4.1 Flash, high | 8.3 / 12.0 s | 8.7 / 18.6 / 42.8 s | 9 of 15 | $0.00439 | 10 / 13 / 2 of 15 | 12 of 13 | 4.69 | 13 of 13 | $0.00499 | 4.13 / 3.13 | 4 of 15 |
reasoning setting. Both use keys the api already has (AI_GATEWAY_API_KEY, GOOGLE_GENERATIVE_AI_API_KEY).Learner state: a PYQ set yesterday, 9 misses across two subjects
You missed 9 in yesterday's PYQ set, 7 of them in Internal Medicine. Let's walk through those misses together.










Learner state: read a lesson today, no questions on it since
You read Antiparasitic drugs (antiprotozoals) today. I can turn it into 10 flashcards so it sticks.






Learner state: exam month set months ago, back after a break
Still aiming for December? Either way, 10 Medicine (Core Systems) questions are ready.






Learner state: a quiz four days ago, 3 misses; prefers flashcards
You have 12 flashcards due. Since you like flashcards, let's clear them out.






Learner state: exam date has just passed
How did your MCAT go on October 26?






Learner state: a quiz three days ago, misses in Fixed Income
You missed 5 in your quiz 3 days ago, each in a different topic. I can walk you through them so you catch what slipped.










Learner state: a weak set yesterday, 7 misses
You missed 7 questions in yesterday's quiz, spread across 4 topics. Let's work through them together.










Learner state: new, told the tutor about a worry (pacing)
You mentioned running out of time on timed sections, so let's start with 5 easier questions to get the reasoning sure before speed. Start there, or talk it through first?






Learner state: retaker, misses in Contracts two days ago
You missed 4 in your Contracts quiz 2 days ago, each in a different topic. Let's walk through them.










None this round.
No screen recordings for this final round. The Mac mini that runs the simulators ran out of memory three times on 31 October, and device work there was stopped, so the recordings were skipped. The card, tap and after shots for each course in the gallery above show where every tap lands, on web (api 9804566b) and the iPhone (api 388e38cb).
Real: snapshot from staging data, offers with real ids, the model call through the api's provider setup, validation, fallback, caching, the act endpoint (test templates, flashcard ids, routes), the seeded chat with server-side turn instructions, analytics events. Seeded: the staging QA learners' history (wrong answers, lessons read, due cards, exam dates, memories) written by a staging-only script; flashcards are the course's own cards or built from the course's own plain MCQs, never another learner's. Not built: the Trigger.dev precompute (designed, not deployed), a persisted events table (Redis + PostHog only), games filtered by topic (games open on a subject where they can).
invite.snapshot.unit.test.ts).nav: "approach_b" literally, like the rest of approach-B Home; the card renders only there.Two councils (Claude Opus 5.5 and GPT-6.1-Sol), each with learner reviewers for a Rezzy, a Savvy and a Casey course and an engineering reviewer, fresh every round. The bar was 9/10 on both axes from both councils; the loop stopped after round 11 short of it.
| Round | Opus learner | Opus engineer | Sol learner | Sol engineer | Top finding | ||
|---|---|---|---|---|---|---|---|
| 1 | 2026-10-30 | 6 (7/7/6) | 6 | 6 (7/8/6) | 5 | api 21ee70af, app d62e23e82, web captures | Numbers on cards weren't all grounded in the data, and a late model could show a different fallback on every open. |
| 2 | 2026-10-30 | 6 (6/7/7) | 7 | 7 (7/8/7) | 6 | api 94b8087a, app bc38da8ba, web captures (all 9 re-seeded, one run) | A tap didn't always open what the button promised (quiz fills short of the count, due-card counts that drifted). |
| 3 | 2026-10-30 | 6 (6/7/7) | 7 | 7 (7/7/8) | 7 | api 2393ae51, app e69fdddaa, web + iPhone captures (iPhone composes after an api restart) | A quiz "on a lesson" opened loosely tagged questions; counts on buttons weren't exact against the bank. |
| 4 | 2026-10-30 | 7 (7/7/8) | 7 | 8 (8/8/9) | 6 | api 6e39192d, app 90d4750dc, web + iPhone captures, output judge on the 68-learner eval | A tap on a card replaced while it was on screen could fail; quiz resizing rewrote unrelated facts. |
| 5 | 2026-10-30 | 7 (7/7/7) | 7 | 8 (8.5/8/8) | 7 | api d1fef14b, web + iPhone captures, eval run8 | Check-in chips and timing ("results out yet?" five days after the MCAT); flashcard learners offered the wrong step. |
| 6 | 2026-10-30 | 7 (7/7/7) | 7 | 8 (8/8/8) | 7 | web + iPhone captures, dealt records per set and lesson | Opening a walkthrough marked the whole set done, so Home moved on before the learner finished. |
| 7 | 2026-10-30 | 6 (6/7/8) | 6 | 7 (8/7/9) | 6 | api ac1f2700, web + iPhone captures, NEET PG and Bar answer shots | After "Went well" Home pushed pre-exam misses; the walkthrough's state lived in the model's memory of the first turn. |
| 8 | 2026-10-30 | 6 (6/7/7) | 7 | 7 (7/8/8) | 7 | api 2266d7eb, app 042e715fe, walkthrough state in Postgres, rules resume card; web + iPhone + answer shots | The walkthrough's try line read as a calculation on recall questions; one-miss topics were named as where the misses gathered. |
| 9 | 2026-10-30 | 7 (7/7/8) | 7 | 8 (8/8.5/8.5) | 7.5 | api 6ab52076, app 042e715fe, walk commits on delivery, no card after "went well", no-verdict reveal; web + iPhone + answer shots | Counts the validator didn't tie to a topic or deck ("15 on Enzyme Kinetics" when 2 were); Home pushed practice right after "Went well". |
| 10 | 2026-10-31 | 7 (7/7/7) | 7 | 7 (7/7/8) | 7 | api bdbc5f53, app c1c844b4c, full 162-learner eval, quiet Home after the exam, lesson in the check's turn, stricter validator; web + iPhone + 4 answer runs | The walkthrough's last step never saved (it ended on a tool call); copy the regex validator let through; first-try validity falling as checks grew. |
| 11 | 2026-10-31 | 7 (7/8/7) | 7 | 8 (8/8/8) | 7.5 | api 9804566b (iPhone run on 388e38cb), app c1c844b4c, walkthrough end saved, narrower walkthrough routing, more validator checks, rules card one idea; web + iPhone + 4 answer runs. Last round: the owner stopped the loop here (option B) | The validator is a growing list of regex checks over free text: move the model to structured slots the server words. |