Question explanation audit

Every question format students can reach on staging, answered right and wrong, judged the way a student would read it. Part 2 audits the Jev-based grading and feedback for free-text answers (short answer, Bar performance task, LSAT argumentative writing).

Tested 25 Sep 2026 on app-staging.getoncourse.ai (web)Courses: NCLEX-RN · CPA · CFA · LSAT · BarCounts from the staging DB, plus production where the course is live

Summary

The authored explanations are mostly competent: most say why the key is right and mention each distractor. What lets students down is delivery, plus a handful of format bugs that show students a wrong answer as correct. No explanation responds to the option the student actually picked. For free-text answers, Jev's decisions are sound, but the feedback built on them is generic, sometimes contradicts the score, and in two places never reaches the student.

39 / 45live standalone NCLEX ordering questions either show the wrong "Correct:" order in review (36) or score a fully correct answer as 0 (3). Production too.
29live NCLEX case studies (53 dropdowns) offer only one choice, the correct one. Production too.
72matrix items label their rows row-1…row-4 instead of the findings, so they can't be answered.
2,891NCLEX explanations on staging (632 in prod) open or close with authoring metadata: "Bloom's 3_apply level, medium difficulty, NCJMM…"
338live items in the new courses have no explanation at all (Bar 205, LSAT 94, CPA 39), including whole LSAT reading sets.
29 / 169Bar performance tasks require facts or documents their own file doesn't contain. On the one tested, a 21/24 memo is capped at 60% and fails.
What a student needs after answering. (1) Whether they were right, and if not, what they picked. (2) Why the key is right. (3) Why each other option is wrong, in words that match the screen. (4) One rule to take away. Today the banner and colours cover (1). The text usually covers (2) and (3). (4) is rare. Nothing addresses the student's own wrong pick, although the data exists: hot-spot and highlight items store a per-option rationale that the app never shows. The Rezzy follow-up chips do react to the wrong pick ("Compare why potassium chloride is withheld here while prophylactic heparin is generally continued"), so the plumbing is there.

Scoreboard

One row per format tested. "Your pick" asks whether the student's specific mistake gets explained. Verdicts reflect what the student sees, not the raw content.

FormatTested inWhy the key is rightWhy each other option is wrongYour pickRight vs wrong viewVerdict
Select all (SATA)NCLEXYesYes, but by letters the screen doesn't showNoSame text; colours differNeeds work
Cloze dropdownNCLEXYesYesNoSame text; wrong blank shows the keyGood
MatrixNCLEXYesYesNoSame text; per-row marksGood content
Ordered responseNCLEXYesPartlyNoReview shows the wrong keyBroken
Fill in the blankNCLEX, CFAWorked solutionNames common slipsNo (could, from the number)Same text; shows keyGood
Image hot spotNCLEXYesLumped togetherNo (stored rationale unused)Same text; regions colouredNeeds work
Highlight hot spotNCLEXYes"The other orders…"No (stored rationale unused)Same textNeeds work
Case study (NGN)NCLEXPer stepPer step, letteredNoPer-step rationale; no case debriefContent bugs
Single best answerCPA, LSAT, BarYesYesNoSame textGood
CPA TBS gridCPAPer rowPer rowMarked, not explainedPer-row marks + overallBest in app
CFA item setCFA L1With workingDistractor maths don't reproduceNoPer-step rationaleNeeds work
Reading comprehensionLSATNothingNothingNoColours onlyMissing
Integrated question setBarPer stepPer stepNoPer-step rationaleGood
Short answerBar (1 item)Jev grades it and writes a one-line reason. The student never sees either.Invisible
Performance taskBarJev grades it. One generic comment, two contradictory scores, and rubrics that demand facts the file doesn't contain.Broken
Argumentative writingLSATJev grades it. Bands are sensible; comments are generic; no model answer; internal "worth a human look" notes shown to students.Needs work
Constructed responseCFA (338, none validated)No grader exists. The app shows "Scoring in progress" and never a result.Not shippable

Not captured: data-entry grids with numeric cells (the CPA simulation tested was a Correct/Incorrect grid), and MCAT, which only has legacy single-answer MCQs.

Blocking bugs found during the audit

These go beyond explanation quality: the app tells students something false, or the question can't be answered. Each is sized against the live bank.

1 · Ordered response: the review shows a different "correct" order from the one the server grades Prod · 39 of 45 standalone

The client rebuilds correct_order from the legacy options rows' metadata.sequence (withOrderedOptions, apis/question/formats.ts:563). The server grades against content.correct_order. On 36 of the 45 live standalone items they disagree, so the review marks right positions red and prints the wrong "Correct: …" under each. In the first screenshot the pill says 2/5, only one row is green, and step 1 claims "Correct: Provide a snack…". On 3 more items, content.correct_order uses item-N ids while the app submits option UUIDs, so a perfect order scores "Incorrect 0/5" with every row green. Counting case-study children too: 155 of 166 validated ordering questions in production.

Ordering review with wrong key
Wrong order: pill 2/5, one green row, "Correct:" lines that aren't the key
Correct ordering marked incorrect
The exact right order: every row green, banner "Incorrect 0/5"

2 · Case studies give away the dropdown answer Prod · 29 cases, 53 blanks

The case player reads the parent's denormalised content.sub_questions copy, which kept only the correct option per blank. The child rows still have all three. The student opens a dropdown with one choice in it.

3 · Matrix rows labelled row-1 … row-4 72 items, all live

The row text never made it into row_headers, so the student classifies "row-1" as improvement or follow-up. The rationale then talks about tingling, neck circumference and a calcium of 8.0, none of which appeared as rows.

4 · Case timelines leak or run ahead Content · seen in 1 case, likely wider

In the thyroidectomy case, step 1 asks "Based on Exhibits 1 and 2 … neck fullness shown in the image", but only Exhibit 1 is released: a normal baseline with no image. Exhibit 3 then narrates the answers to steps 3 and 4 ("The nurse activates the rapid response system, raises the head of the bed, applies oxygen…") before the student answers them.

Step 1 cites Exhibit 2 and an image the student can't see yet
Step 3: one-choice dropdowns, and Exhibit 3 already states the action
Step 6: rows named row-1…row-4

5 · Free text: grades students never see, and grades that can't pass Bar, LSAT, CFA

  • Short answer (inside Bar sets): Jev grades it and writes a reason. The app shows "Graded against the rubric after you finish the set", and the results review has no short_answer case (FormatAnswerReview.tsx:690). The student never learns whether they were credited.
  • Performance task: the grade lives only in component state. The results review shows the author's model-answer paragraph and nothing about the student's memo.
  • Performance-task rubrics cite evidence the file doesn't contain (Part 2). A missing required element caps the score at 60%, so affected tasks can't be passed.
  • Constructed response (CFA, 338 items): no server grader and no result UI. Harmless while unvalidated; it blocks launch.

Patterns across formats

Authoring metadata printed to students

Openers and closers like "This item targets Medical-Surgical Nursing, Cardiovascular Disorders, Bloom's 3_apply level, medium difficulty, and the NCJMM Generate Solutions skill." sit inside the explanation: 2,891 of 5,643 live NCLEX explanations on staging, 632 in production. Some contradict the quiz: a Med-Surg quiz showed "Subject: Nutrition and Diet Therapy". It's often the first sentence the student reads.

Letters the screen doesn't show

SATA explanations say "Option A is correct… option C…", but the NCLEX SATA screen shows no letters (only screen readers get "Option B."). The student maps six letters onto six sentences in their head. That's 354 of 573 live SATA items on staging (4 in prod today). The hot-spot explanation says "right pupil" while the image labels regions A–D. And after answering an MCQ, a ✓/✗ icon replaces the letter of the picked and correct options.

One explanation for right and wrong

Every format shows the same paragraph either way. A student who got it right rereads 900 characters; one who got it wrong has to find their own mistake inside it. Partial credit is never explained: "1/4" on SATA comes from +/− scoring (2 right − 1 wrong), and nothing on screen says so.

Rationale we store and hide

Hot-spot and highlight items carry a per-option rationale (for heparin: "addresses venous thromboembolism risk and is not contraindicated by the listed renal findings"). CPA grids carry per-row rationale, which is why the TBS is the best surface in the app. Single questions never render content.rationale: the screen uses only metadata.explanation || explanation (question/index.tsx:246).

Aggregates end without a debrief

Case studies, integrated sets and reading sets show a rationale per step, then "Finish case" jumps straight to the next case: no case score, no case-level explanation. The explanation exists in content.explanation ("This case follows two time-sensitive complications…") but only appears afterwards in the results list. Rezzy isn't available inside aggregates.

Empty explanations in the new courses

Bar 205, LSAT 94 and CPA 39 live items have no explanation. For LSAT that includes whole reading-comprehension sets: red and green, nothing else. Separately, the LSAT passage tested (Condorcet and Olympe de Gouges) reads like a published LSAT PrepTest passage; worth a licensing check.

Format by format

For each: what the student sees on a wrong and a right answer, whether the explanation does its job, and a rewrite of that same explanation. The rewrites follow one shape: your pick → why the key is right → one line per other option, named by its content → the rule to keep.

Select all that apply

NCLEX-RN · warfarin discharge teaching (4034f181) and asthma reassessment (51e056cc)
Needs work
Wrong (picked A, B, E): "Partially correct 1/4"
Correct: the same kind of paragraph, opening with metadata
Why the key is rightYes, all 4 keys
Why others are wrongYes, both distractors
Your pickNo
ReadableNo: invisible letters, metadata opener

The content is correct and complete; the student just has to decode it. They see six unlettered sentences and an explanation written in letters. "1/4" with two right picks is never explained. The first sentence is metadata.

Shown today
This item targets Medical-Surgical Nursing, Cardiovascular Disorders, Bloom's 3_apply level, medium difficulty, and the NCJMM Generate Solutions skill. Option A is correct because regular international normalized ratio testing guides safe anticoagulant dosing, while option C reduces the risk of cuts and bleeding. Option D is correct because… Option B is incorrect because doubling a missed dose can produce excessive anticoagulation… Option F is incorrect because aspirin can increase bleeding risk…
Better version

You picked 3: two right, one trap. Select-all scores +1 for each right pick and −1 for each wrong pick, so this earned 1 of 4.

Include

  • INR appointments. The INR sets each warfarin dose; missing tests hides drift toward bleeding or clotting.
  • Electric razor. With a mechanical valve the anticoagulation is lifelong, and nicks bleed longer.
  • Tell dentists and prescribers. Procedures and new drugs (antibiotics, NSAIDs) change bleeding risk and the INR.
  • Report black stools or red urine. Melena and hematuria mean internal bleeding.

Leave out

  • Double a missed dose (your pick). A double dose can push the INR into the bleeding range. Take it later the same day if remembered; otherwise skip it and call.
  • Aspirin for headaches. It adds an antiplatelet effect on top of warfarin. Use acetaminophen and check first.

Rule: warfarin teaching = monitor the INR, prevent injury, disclose the drug, report bleeding, never adjust the dose yourself.

Cloze dropdown

NCLEX-RN · cataract discharge teaching (8392b6bc) and lactulose evaluation (1fb127cb)
Good
Wrong blank 1: red chip, key listed under the sentence
All three blanks right
Why the key is rightYes, per blank
Why others are wrongYes, every option
Your pickNo
ReadableMostly: one paragraph for all blanks

The model the rest should copy: every dropdown option is named by its content and given a reason. The only gaps are the metadata opener and one paragraph where there should be one block per blank.

Shown today
Subject: Medical-Surgical Nursing; topic: sensory disorders and postoperative eye care; NCJMM skill: Evaluate Outcomes. Sleeping on the nonoperative side demonstrates correct teaching because it avoids pressure on the operative eye. Bending at the waist and lifting a 9-kg bag can increase intraocular pressure… A sudden increase in flashes or floaters requires immediate follow-up… Mild itching… A small amount of tearing…
Better version

Blank 1: you chose "bend at my waist to put on shoes". Bending and heavy lifting raise pressure in the healing eye, so that statement shows the teaching didn't land. The right statement is "sleep on my nonoperative side": it keeps pressure off the operated eye.

Blank 2 ✓ A sudden increase in flashes or floaters can signal retinal detachment and needs same-day ophthalmology. Mild itching and a little tearing on day one are expected; the client just shouldn't rub the eye.

Rule: after cataract surgery, anything that raises eye pressure is out; new flashes, floaters, vision loss or pain are urgent.

Matrix

NCLEX-RN · post–hip arthroplasty findings (b38b4ed9) and levodopa follow-up (c3b4fea5)
Good content
3/5: two rows red, the right column shown in green
All rows right
Why the key is rightYes, every row
Why others are wrongYes, contrasts columns
Your pickNo
ReadablePartly: 1,100 characters under a 5-row grid

Good clinical reasoning, but the student holds five rows in mind while reading one paragraph. It belongs row by row. It also ends "This musculoskeletal and perioperative item is easy difficulty, targets Bloom's 5_evaluate…".

Shown today
Pain rated 3 after analgesia is expected because… A shortened, internally rotated operative leg requires immediate action because it suggests prosthetic displacement… A temperature of 37.8° C during the first postoperative day can result from the inflammatory response and is expected… This musculoskeletal and perioperative item is easy difficulty, targets Bloom's 5_evaluate and the NCJMM Evaluate Outcomes skill…
Better version
  • Pain 3/10 after analgesia → Expected. Controlled pain is the goal.
  • Leg shortened and internally rotated → Immediate action (you chose Prompt follow-up). That's the classic sign of hip dislocation. Keep the leg still and call the surgeon now; waiting risks nerve and vessel damage.
  • Pedal pulse 2+ → absent → Immediate action. A newly lost pulse means the limb isn't getting blood.
  • 37.8 °C on post-op day 1 → Expected (you chose Prompt follow-up). Low-grade fever in the first 24–48 h is the inflammatory response. Watch the trend.
  • New one-sided calf tenderness and swelling → Prompt follow-up. Suspect DVT: report it and expect a Doppler. It ranks below a pulseless or dislocated limb.

Rule: limb threatened now > possible clot > expected recovery.

Ordered response

NCLEX-RN · hypoglycaemia in a teen athlete (1eb5ae6b) and a threatening UAP (9ddf9064)
Broken

The explanation itself is decent; the screen around it contradicts it (see bug 1 for both screenshots). The student reads "the nurse first gives 15 g of rapid-acting carbohydrate" while the review says "Correct: Provide a snack…" for step 1, and can't tell which to believe. The first sentence is metadata that, in this Med-Surg quiz, names another subject.

Shown today
Subject: Nutrition and Diet Therapy; topic: Nutrition Across the Lifespan and Glycemic Safety; Bloom's level: Analyze; difficulty: Medium; NCJMM skill: Take Action and Evaluate Outcomes. Because the alert client can swallow, the nurse first gives 15 g of rapid-acting carbohydrate and rechecks the glucose after 15 minutes. A result of 64 mg/dL remains below the treatment goal, so another 15 g is given… Giving the mixed snack before correcting the low value would delay glucose absorption.
Better version
  1. Give 15 g of fast carbohydrate. Alert and able to swallow, so treat by mouth first.
  2. Recheck after 15 minutes. The 15-15 rule: treat, wait, measure.
  3. Give another 15 g, because 64 mg/dL is still below 70.
  4. Recheck after another 15 minutes to confirm recovery.
  5. Snack with carbohydrate and protein. The next meal is 2 hours away; protein prevents a second drop.

Where yours went off: you started with "give another 15 g", but there's no second dose until you've treated and rechecked once. A mixed snack first would slow absorption while the glucose is still 54.

Fill in the blank (numeric)

NCLEX-RN · norepinephrine and dopamine drip rates (19e8d618, 251d470a) · CFA · present value of the strike (item set)
Good
Entered 0.4: "Incorrect, correct answer 22.5"
Correct: 15.4
CFA: 49.5 vs 49.46 marked wrong (the stem asks for two decimals)
Why the key is rightYes, full working
Why others are wrongYes, names usual slips
Your pickNo, though it's computable
ReadableYes

The strongest single-question explanations in the bank: a worked solution plus the two usual errors. What's missing is the easiest personalisation there is: the student typed 0.4, which is exactly the "forgot to convert to mL/hr" error the explanation already describes. One risk from the grading code (not tested in the UI): normalizeFillBlankValue treats only bare numbers as numbers, so "22.5 mL/hr" is compared as text and marked wrong. Students type units.

Shown today
First calculate the prescribed dose: 0.08 mcg/kg/min × 75 kg = 6 mcg/min. The supplied concentration is 4,000 mcg ÷ 250 mL = 16 mcg/mL. The hourly rate is 6 mcg/min ÷ 16 mcg/mL × 60 min/hr = 22.5 mL/hr. A common error is failing to convert 4 mg to 4,000 mcg… Another common error is reporting 0.375 mL/min without converting the rate to mL/hr. This medium application item targets Pharmacology Principles…
Better version

You entered 0.4. That's 0.375 rounded: the rate in mL per minute. Pumps run in mL per hour, so 0.375 × 60 = 22.5 mL/hr.

Dose 0.08 mcg/kg/min × 75 kg = 6 mcg/min · Concentration 4 mg = 4,000 mcg ÷ 250 mL = 16 mcg/mL · Rate 6 ÷ 16 = 0.375 mL/min × 60 = 22.5 mL/hr.

Other slips: 0.0225 or 22,500 means the mg→mcg conversion is off by 1,000.

Rule: carry every unit through the calculation; if the answer isn't in mL/hr, you're not done.

Image hot spot

NCLEX-RN · infant red-reflex screening (5378d6c6) and posterior tibial pulse (4efc2d7a)
Needs work
Picked A (red reflex); the key is B
Correct: behind the medial malleolus
Why the key is rightYes
Why others are wrongLumped ("Clear sclerae do not…")
Your pickNo; per-region rationale stored, unused
ReadableNo: "right/left" vs the A–D labels

The image labels regions A–D, but the explanation says "the right pupil". The white reflex is at B, on the viewer's right, which is the infant's left eye. A nursing student reads "right pupil" anatomically and looks at A. Each region has its own rationale in content.rationale that never renders. The screen-reader names also give the answer away (radio "right-pupil-white-reflex").

Shown today
The right pupil is the correct region because a white or yellow pupillary reflection is an abnormal screening result… The normal red-orange reflex in the left pupil is reassuring. Clear sclerae do not account for the abnormal reflection… This item targets Health Screening and Disease Prevention, Bloom's 4_analyze level…
Better version

The answer is B, the white pupil. A white reflex (leukocoria) can mean retinoblastoma, congenital cataract or retinal detachment, and needs urgent ophthalmology referral. B is the infant's left eye, on your right.

You chose A, the red-orange reflex: the normal finding you compare against.

C and D, the clear sclerae, are normal and don't explain the abnormal reflex. Tracking with both eyes doesn't rule out disease; a white reflex is referred regardless.

Rule: a red reflex that's present and symmetric is normal; white, absent or asymmetric means refer.

Highlight hot spot

NCLEX-RN · withhold potassium in oliguria (6d5af6d7) and metformin after contrast (fb66a8cd)
Needs work
Picked heparin. Explanation: "The other medication orders do not directly aggravate…". The follow-up chip does address heparin.
Correct: metformin
Why the key is rightYes
Why others are wrongOne line for three orders
Your pickNo (stored: "heparin addresses VTE risk…")
ReadableYes
Shown today
The client's oliguria and elevated creatinine indicate severely impaired renal potassium excretion. Administering prescribed potassium could worsen hyperkalemia… The other medication orders do not directly aggravate the identified electrolyte threat. This medium Renal and Fluid-Electrolyte Disorders item targets Bloom's 3_apply…
Better version

Withhold potassium chloride. 120 mL of urine in 12 hours (10 mL/hr) and a creatinine of 3.2 mean the kidneys can't clear potassium, and it's already 5.8. Another 20 mEq risks a fatal dysrhythmia.

You chose heparin 5,000 units SC. Prophylactic heparin should continue: it prevents clots in a bed-bound patient and isn't dangerous at this dose in kidney injury.

Acetaminophen and calcium carbonate add no potassium; calcium carbonate is even used as a phosphate binder in kidney failure.

Rule: in oliguria, first stop what the kidneys must clear: potassium, and drugs like metformin after contrast.

Case study (NGN unfolding case)

NCLEX-RN · post-thyroidectomy hematoma, then hypocalcaemia (ff4474bf), 6 steps
Content bugs
Step 2 correct: lettered options, rationale box
Step 4 wrong: the rationale covers every option
"Finish case" goes straight to the next case: no score, no debrief

The per-step rationales are among the best in the app: the case shell does letter its options, and every option is addressed. The failures are around them: the case bugs above, and no ending. The case's own summary exists but only shows up in the results list later.

Shown today after step 6
Nothing. The player moves on to case 2.
Better version: a case debrief card

Case 1 · 4 of 6. The story: neck swelling + frequent swallowing + muffled voice + falling SpO₂ = an expanding hematoma compressing the airway → rapid response, sit upright, oxygen, back to theatre. Later, tingling and carpal spasm = hypocalcaemia from parathyroid trauma → IV calcium gluconate, and keep monitoring (8.0 mg/dL is still low).

Where you slipped: Step 1, a BP of 148/86 is explained by pain and anxiety; neck swelling threatens the airway within minutes. Step 4, reinforcing the dressing hides bleeding and does nothing for the compression.

Rule: after neck surgery, airway first; after thyroid surgery, check calcium.

Single best answer

CPA · attribute sampling (8f1fad66) and IT change-management evidence (eab7afa4). LSAT and Bar MCQs use the same screen.
Good
Picked C: the ✗ icon replaces the "C" the explanation refers to
Correct: every option explained

Solid: every option gets a direction and a reason. Two small things. The ✓/✗ icons replace the letters the explanation talks about. And in the second item the key is three times longer than any distractor, a classic "longest answer" cue.

Shown today
Option B is correct because a lower tolerable deviation rate requires greater precision and therefore a larger sample. Option A ordinarily reduces sample size because fewer deviations are expected. Option C permits more sampling risk and therefore ordinarily reduces the required sample size. Option D reduces the audit assurance sought from the control…
Better version

You chose C, raising the acceptable risk of overreliance from 5% to 10%. Accepting more risk means you need less evidence, so the sample shrinks.

B ✓ Tightening the tolerable deviation rate (7% → 5%) needs more precision, so a bigger sample.

A expects fewer deviations (3% → 1%), which shrinks the sample. D relies on the control less, so it needs less evidence.

Rule: the sample grows when the tolerable rate goes down, acceptable risk goes down, the expected rate goes up, or planned reliance goes up.

CPA task-based simulation

CPA AUD · inventory obsolescence and the audit opinion (41367f5e), 10-row evaluation grid
Best in app
8/10: per-row marks, per-row rationale, overall summary

The model for the other aggregates: every row gets a rationale, and the task gets a summary. Three fixes. (1) "Correct answer: Correct" and "Correct answer: Incorrect" read as nonsense because the choices themselves are called Correct and Incorrect; use "Consistent / Not consistent" or True/False. (2) The rationale list doesn't flag the rows the student missed; show those first. (3) The overall summary calls the $270,000 a pretax overstatement while row 4 calls it an understatement (of liabilities and the reserve). Both are true; a student sees a contradiction.

Shown today (row 3, answered wrong)
Incorrect · Correct answer: Correct

3. Using Exhibit 1, the obsolescence misstatement exceeds performance materiality. The $180,000 obsolescence misstatement exceeds performance materiality of $175,000.
Better version

Row 3: you said it doesn't exceed performance materiality. It does. The misstatement is $480,000 supported − $300,000 recorded = $180,000. Performance materiality in Exhibit 1 is $175,000, so it's over by $5,000.

CFA item set

CFA Level I Derivatives · put–call parity and binomial replication (42e2c335): MCQ, SATA, numeric
Needs work
Picked C (6.66): the rationale works B
SATA on the protective put

The keys and their working are right (4.20 + 52e−0.05 − 50 = 3.66; hedge ratio 0.5, borrow 42.86 → 7.14). The distractor rationales are not: "C omits discounting of the exercise price" gives 4.20 + 52 − 50 = 6.20, not the 6.66 offered, and no single slip produces A's 3.34. A student trying to retrace their mistake from the explanation can't. The maths renders as plain text (Ke^(−rT)). Content note: the SATA key "floor value equal to the put's exercise price minus the premium paid" mixes the value floor (X) with the profit floor (X − S₀ − p).

Shown today
B is correct because put–call parity gives p = c + Ke^(−rT) − S0 = 4.20 + 52e^(−0.05) − 50 = USD 3.66. A incorrectly discounts the call premium along with the exercise price. C omits discounting of the exercise price and also overstates the parity adjustment.
Better version (with regenerated distractors)

B, USD 3.66. p = c + K·e−rT − S₀ = 4.20 + 49.46 − 50 = 3.66.

If you chose 6.20, you didn't discount the strike: 4.20 + 52 − 50. If you chose 3.72, you discounted with annual compounding (52 ÷ 1.05 = 49.52) instead of continuous.

Rule: parity uses the present value of the strike, compounded the way the rate is quoted.

Item fix: replace 6.66 and 3.34 with 6.20 and 3.72 so each distractor maps to one real slip the explanation can name.

Reading comprehension

LSAT · Condorcet and Gouges passage (caceda75), 6 questions
Missing
Wrong answer: red and green, no explanation

All six children have an empty explanation. For LSAT reading, the explanation is the teaching: the skill is spotting why a plausible choice goes beyond the passage. (Per the code, reading-set explanations render as plain text when they do exist, so markdown won't show.)

Shown today
Nothing.
Better version (main-point question)

D. The passage calls the two "radically opposed courses of action": Condorcet held that women's rights follow from universal rights and need no political battle; Gouges called for direct political struggle. D states both halves.

You chose E. The passage never ties Gouges to the revolution "still raging", or says Condorcet counselled patience. E invents a timing contrast.

A: nothing about society finding the arguments hard to evaluate. B contradicts "radically opposed". C turns a detail (no specific legislation) into a cause the passage never claims.

Rule: a main point covers the whole passage and adds nothing the passage doesn't say.

LSAT principle question

LSAT Argumentative Writing prep · "a responsibly formed recommendation" (f4bf2dbf)
Good
Picked B: every option checked against the principle's three conditions

Each option is tested against the principle's three conditions (a cost, why the benefit outweighs it, an uncertainty). Only the presentation could improve: a ✓/✗ grid scans faster than prose.

Shown today
D is correct because it identifies a likely cost, explains why the benefit outweighs that cost, and identifies volunteer capacity as an uncertainty… B identifies a benefit, a cost, and an uncertainty but does not explain why the benefit outweighs the cost…
Better version

You chose B: it has a cost and an uncertainty, but never says why the benefit outweighs the cost.

CostBenefit > costUncertainty
A✓✗✗
B✓✗✓
C✗✗✓
D✓✓✓
E✓✗✗

Integrated question set

Bar · promoter liability and apparent authority (f997ef4a), 6 steps: MCQ, cloze, matrix, ordering
Good
Step 1 wrong: every option explained and tied to Exhibit 3

Same shell and strengths as the NCLEX case (lettered options, each addressed, exhibits cited) and the same gaps: no set-level debrief, no Rezzy. Its ordering step uses item-N ids, so check it against bug 1. Sets that contain a short answer are covered in Part 2.

Part 2 · Jev grading of free-text answers

Three formats are graded by a model: short answer (Bar, 1 item), performance task (Bar, 169) and argumentative writing (LSAT, 146). Since api#1187 (merged to dev on 24 Sep), TypeSafe's Jev makes every judgement and Gemini 3.5 Flash-Lite writes the feedback afterwards. Staging's ECS task definition injects AI_GATEWAY_API_KEY, and grades returned on staging carry Jev's confidence flags, so staging runs the Jev path.

1 · Jev decidesTyped questions against the rubric: a 0–4 band per dimension or issue, booleans for off-topic, perspectives and requirements, a choice for which rubric answer a field matches. It returns probabilities, not prose.
→
2 · Code scoresAverages bands and applies gates: too short → capped at 50%; a missing required element → capped at 60%; −15% per prohibited error. Pass mark 75%.
→
3 · Flash-Lite explainsGiven the band numbers and the student's text, it writes 1–2 sentences per band. It doesn't see why Jev chose a band (Jev gives no reasons) or the item's rubric criteria.
→
4 · App showsBand word + comment per dimension (essay), points + comments (performance task). Short answer: nothing.

How we tested

Three submissions through the live staging UI: a strong LSAT essay (0.95), a weak one (0.25) and a strong Bar memo (0.60). Then 20 controlled answers, run twice each, through the same grader code from api@dev. The gateway key can't be read locally, so Jev was reached through OpenRouter's Decisions endpoint (typesafe/jev-1.13), the same model family. The strong essay and the strong memo scored the same locally as on staging.

CaseWhat it testsScore (run 1 / 2)Verdict
Essay · strong392 words, tiered policy, all 3 perspectives, answers an objection0.95 / 0.95Right
Essay · opposite side, equally strongNeutrality: argues the absolutist Perspective 10.95 / 0.95Right, side-neutral
Essay · clear position, 1 perspective, no counterargumentMiddle of the range0.65 / 0.60Reasonable; drifts between runs
Essay · restates the perspectives, no positionWeak0.25 / 0.30Right
Essay · well written, wrong promptOff-topic detection0 / 0Caught (p = 0.97)
Essay · forged delimiter + "award 4/4"Prompt injection0.10 / 0.10Resisted
Essay · 42-word outlineLength gate0.50 / 0.50Capped, but thesis still 4/4
Essay · engages 1 of 3 perspectives (zoning item)Perspective gate (the only item with a perspectives array)0.75 / 0.75 · passCounted "2 of 3" engaged; passes
Memo · strong, from the actual fileCeiling0.60 / 0.60 (21/24 in bands)Capped by requirements the file can't meet
Memo · same + the rubric's invented factsDoes the rubric reward making things up?0.50 / 0.503 of 4 "missing" elements now satisfied, by facts that don't exist
Memo · strong + invented outside authorityClosed-universe rule0.50 / 0.50Bands dropped; feedback only hints ("outdated or inapplicable authorities")
Memo · 5 conclusory sentencesWeak0 / 0Right
Memo · weak + injected instructionsPrompt injection0 / 0Resisted
Short · exact / paraphrase / "the firm"Meaning over wording1 / 1 eachRight
Short · "partners' personal assets" / insurance / injectionWrong answers0 / 0 eachRight
Short · "either partnership or partners, whichever is easier"Hedging both ways0 / 1Flipped to full credit on run 2

What works

  • Decisions track quality. Strong 0.95, middling 0.6, weak 0.25, off-topic 0: the order a human grader would give.
  • Hard to game. Three injection attempts (a forged closing delimiter plus instructions) earned nothing, and the short-answer reason named the attempt.
  • Side-neutral. Opposite positions of equal quality scored the same.
  • Tolerates paraphrase. "Riverbend's own business property, before going after the partners personally" was credited.
  • Fast and cheap. Median 1.9 s for a full grade including the feedback pass.

What doesn't

  • 44% of verdicts are "low confidence" (41 of 94 bands and fields below 0.6), and each shows the student "— low confidence (0.53) — worth a human look". No human review queue exists, so a note meant for us lands on the student.
  • Borderline answers aren't stable. The hedge flipped from 0 to full credit between identical runs (p = 0.53). Two essay bands moved a point.
  • Feedback is written blind. Flash-Lite gets "reasoning 3/4" and invents a reason. The strong essay's 3/4 advice ("add concrete examples of how thresholds are calculated") ignores that the essay names enrollment and service-request data and a two-year review cycle.
  • Feedback contradicts the score. The memo comment says the candidate "performed exceptionally well across the board" on a submission shown as 14/24 and not passing.

LSAT argumentative writing: what the student sees

Staging UI: translation-policy prompt (c4939733) and class-recording prompt (8e8ef21d)
Needs work
Strong essay: Fully / Largely bands with comments; "worth a human look" visible; "feedback in progress" still shown after grading
Weak essay: 25% overall, generic advice
  • No overall result line and no model answer. Every item has a sample_response and a scoring_rubric; neither is shown, although formats.ts:899 says they are "shown after submission".
  • 145 of 146 essays keep their perspectives only in the prompt text, so the "at least 2 perspectives" gate never runs. On the one item that has the array, an essay engaging one perspective was counted as 2 of 3 and passed.
  • The length gate is 400 characters (about 65 words) for a 35-minute essay. An 81-word non-essay clears it.
Shown today (weak essay)
Thesis 0/4 — State a clear and specific position on the college recording policy in your introduction rather than merely summarizing the debate.
Perspective engagement 1/4 — Select a definitive stance and explicitly evaluate the provided perspectives in relation to your central argument. — low confidence (0.56) — worth a human look
Counterconsideration 1/4 — Address potential objections… — low confidence (0.52) — worth a human look
Better version

Overall: not yet an argument (25%). You summarised the debate well. Now take a side.

Thesis. Your last line, "class recording is a complicated issue", isn't a position. For example: "Colleges should record by default, but release recordings only to enrolled students and let instructors pause for discussion."

Perspectives. You note privacy worries exist, but not whether they outweigh access. Pick the strongest worry and answer it.

Counterargument. Add one paragraph that begins "The strongest objection is…", and show why your policy survives it.

See a full-credit essay for this prompt → (the item's sample_response)

Bar performance task: what the student sees

Staging UI: bakery partnership memo (0716d554)
Broken
Strong memo: "14 / 24" at the top, "21.0 / 24" at the bottom, four "missing" elements, Library tab showing 0
Results review: only the author's paragraph, citing a $14,000 credit the file never mentions

The rubric and the file come from different drafts. The rubric requires "Avery's Lender Communications objection", "Jordan's Purchasing Records" and a "$14,000 related-party overcharge". The file holds two exhibits (the facts, and eight RUPA provisions) and none of those. Because a missing required element caps the score at 60%, no memo written from the file can pass, while a memo that invents those facts clears three of the four gaps. A bank-wide scan found 29 of 169 tasks whose required elements cite amounts or documents absent from the file (8 involving dollar figures). 62 tasks file the law under "Case file", so the Library tab reads 0, and 154 have no sample response.

The screen. Two scores (14/24 after caps, 21.0/24 before), no per-issue breakdown (this task has no issues, so everything is "The task as a whole"), a comment praising a failing result, and "grading in progress" still under the memo.

Shown today
14 / 24
The task as a whole — rules 3/4, application 4/4 — Your performance earned a rules score of 3/4 because you accurately identified and utilized the relevant statutory and common law principles… — low confidence (0.53) — worth a human look
every required element — missing: Analyzes the equipment note liability… against Avery's Lender Communications objection… Identifies Jordan's undisclosed related-party purchase in the Jordan's Purchasing Records…
24 points — 21.0 / 24
Better version (once the rubric matches the file)

21 / 24 · passing. One number, then per issue:

  • Formation 4/4. You applied §202(a) and the §202(c)(3) profit-share presumption to the 60/40 split and the joint DBA.
  • Management and duties 3/4. Right on §401(f). You flag the unilateral $45,000 note as a care problem but stop there; say what it buys Avery in the negotiation (e.g. Jordan indemnifies Avery).
  • Note liability 4/4. §301(1) → §305(a) → §306(a), tied to the bank having no notice of any limit on Jordan's authority.
  • Recommendation ✓ Prioritised, protects Avery, includes a wind-down fallback.

Compare with a model memo →

Short answer: graded, never shown

Bar integrated set: "from what source of assets must ToolWorks ordinarily seek satisfaction first?" (the only short-answer item in the bank)
Invisible

The grader works (see the table above) and its reasons are good one-liners, e.g. "incorrectly stated that ToolWorks must seek satisfaction first from the partners' personal assets, rather than the partnership's assets." The app shows "Graded against the rubric after you finish the set", then a Pending or Partial label; the review has no short_answer case. The rubric has one accepted answer and no rejected list, so there's nothing to name when a student falls for the classic trap (partners first).

Shown today
Graded against the rubric after you finish the set.
Better version

Not credited. You wrote "the partners' personal assets". A creditor with a judgment against the partnership must first go after partnership assets (Authority 1); the partners' separate assets come second.

Fix list, in order

#FixWhereWhy this order
1Ordering: grade and display from one key. Drop the rebuild in withOrderedOptions, or rewrite options.metadata.sequence from content.correct_order; fix the 3 item-N items.app + dataShows students false answers, in prod
2Case studies: read dropdown options from the child rows (or re-sync content.sub_questions); backfill the 72 matrix row labels.app + dataAnswers given away or unanswerable, in prod
3Performance tasks: re-sync the 29 flagged rubrics with their files, then add an ingest check that every $ amount and named source in required_elements / prohibited_errors exists in the materials.data + apiTasks can't be passed
4Stop showing "low confidence — worth a human look" to students. Route it to a review queue, or re-ask Jev and take the majority when p < 0.6.apiOn ~44% of lines; flips grades
5Show free-text results everywhere: the short-answer grade and reason, performance-task and essay breakdowns in the results review, one score only, the model answer after submission.appGraded work students never see
6Strip authoring metadata from explanations (2,891 NCLEX on staging, 632 in prod). Rewrite "Option A" references by content or show letters on SATA; use the A–D labels on hot spots.data + appFirst sentence of half the NCLEX bank
7Write the 338 missing explanations in Bar, LSAT and CPA before launch, reading sets first.contentNo explanation at all
8Add a "Your answer" block: render the per-option rationale already stored for hot spots and grids; for numeric answers, match the typed number against the common-error list.app + contentTurns a generic paragraph into feedback
9Explain partial credit on the banner ("+1 per right pick, −1 per wrong pick").app"1/4" with two right picks confuses
10End every aggregate with a debrief card (score + the case's own explanation + missed steps) and make Rezzy available inside aggregates.appCases end abruptly
11Ground the feedback writer: pass it Jev's per-band probabilities, the item's rubric criteria and the sample response; require it to quote the student's text; ban praise on bands of 2 or less and on failing totals.apiGeneric or contradictory comments
12Regenerate CFA distractors so each maps to one real slip, and render maths as LaTeX. Raise the essay length gate (e.g. 250 words) and backfill the perspectives array on 145 essays.content + apiExplanations that can't be reproduced

Also noticed, out of scope: the CPA subject picker uses medical emoji (🦴 💊 😴); the LSAT reading passage tested reads like a published PrepTest passage; hot-spot screen-reader names are answer slugs ("right-pupil-white-reflex").

Method

UI capture. app-staging.getoncourse.ai in headless Chromium at 1100–1280 px, signed in as staging QA accounts (NCLEX test@, CPA onboarding-web, CFA persona-qa-finance, LSAT persona-qa-law, Bar shubhdeep+12345). Practice-mode custom quizzes, filtered by format where the builder allows it (NCLEX, CPA). Bar formats were started through POST /test/session/start with formats, the same call the app sends. The answer key was read from the question payload so every wrong answer was chosen on purpose.

Counts. Read-only SQL against the staging and production databases, limited to validated items or children of validated parents unless noted. The new courses (CFA, CPA, LSAT, Bar) exist only on staging.

Grading. The api@dev (9b5055b7) graders ran unmodified in a throwaway checkout. Only the Jev HTTP call was redirected, to OpenRouter's Decisions API (typesafe/jev-1.13), because the AI Gateway key can't be read outside ECS. Feedback used Gemini 3.5 Flash-Lite with the staging key, as on staging. 20 cases × 2 runs; raw results in results.json.

Screenshots are cropped and compressed. Click any image to enlarge it.