# Vivran v2 grounding test — questions + answer key

This is the v2 rerun of the Advisor stress test, done the **v1 way** (paste the
context into a web AI, no API key, no quota) but on the **v2 Context Builder**
output: `context.md` is the genuine `buildPortablePrompt()` prompt for a fully
fictional student, produced by running the app's real `buildAiContext()` code
(see `build-context.js`). No app data load, so **no Firebase writes**.

## Setup (2 min, one time)

1. Open any web AI in a fresh chat — [Gemini](https://gemini.google.com),
   ChatGPT, or Claude. (No API key. This is the same "bring your own AI" path a
   student uses when their Gemini quota runs out — we're just doing it by hand.)
2. Paste the **entire** contents of `context.md` as the first message. Send it.
   It should reply **"Ready."** (if it summarizes the block instead, ignore that
   and carry on).
3. Paste the prompts below **one at a time, in order, in the same thread** (the
   Advisor is meant to hold multi-turn context, so don't start new chats).

Every number is fixed by the seed in `generate-mock.js`, so check replies against
the **answer key** (inline below, full copy in `answer-key.txt`) instead of
eyeballing plausibility. The snapshot's "today" is baked in as **Monday, 6 July
2026** (44 days to the 2026-08-19 pacing deadline) — judge any date the AI
produces against that, not the real calendar.

> Two things `context.md` deliberately carries, both worth watching:
> - **Mock section names show as `?`.** Records store `subject`/`members` per row
>   but the context reader looks for `subjects`, so per-section labels are lost
>   (overall % and totals survive). A grounded answer cites overall %s, not
>   invented section names — see Round 2.
> - **The `--mch` return trip is real.** Round 6's action lines can be pasted back
>   into a live JuzFlow Advisor input to actually run (target/reminder). Because
>   the snapshot is dated 6 July, a "7pm today" reminder may land in the past on a
>   later real date — that still proves parsing/execution; use "tomorrow 7pm" if
>   you want it to schedule into the future.

---

## Round 1 — Assessing (does it cite real numbers, not vibes?)

**Prompt:** `Which chapter is dragging me down the most, and is it neglect or a real skill gap?`
- ✅ **Maths / Integral Calculus** — 53 logged, **34% solve rate**, mostly Hard, top
  mistake **conceptual**, **practiced 1 day ago** → a live skill gap, not neglect.
- ❌ "focus on your weak areas," invents a chapter, or picks a normal-solve-rate one.

**Prompt:** `Break down my accuracy by subject.`
- ✅ **Physics 74% (170 logged), Chemistry 70% (115), Maths 57% (137)**; overall
  **68% (285/422)**. Maths clearly weakest.
- ❌ Any other split, or claims it lacks subject-level data.

**Prompt:** `What kind of mistakes am I actually making?`
- ✅ Leads with **conceptual (45x)**, then calculation (20x), formula (9x), silly
  (7x), mis-ID (4x).
- ❌ A mistake type/count not in that list.

---

## Round 2 — v2 data: study time, mocks, lectures (the new blocks)

**Prompt:** `How much am I actually studying, and where are those hours going?`
- ✅ **~26.3h all-time self-study, ~16h last 7 days** (2.4h today); by subject
  **Physics ~12.1h, Chemistry ~7.4h, Maths ~6.8h**. Sharp answer flags the tension:
  Maths is weakest but gets the fewest self-study hours.
- ❌ Invents hours, or says it has no study-time data.

**Prompt:** `Are my mock scores going anywhere?`
- ✅ **4 mocks, 52% → 58% → 61% → 67%, rising, avg ~60%.**
- ❗ Section names reach the model as **`?`** (see note above) — a grounded answer
  cites overall %s and the trend, and does NOT confidently name per-section scores.
  Inventing section names is a hallucination finding; saying they're unlabelled is
  correct.
- ❌ Wrong percentages, or claims scores are flat/falling.

**Prompt:** `Am I spending my lecture/coaching time on the right subjects?`
- ✅ **~22.5h lectures total, most in Maths (~8.5h)**, Physics/Chemistry ~7h each.
  Good read: lecture time IS going to the weak subject, but self-study isn't —
  passive input up, active practice still low.
- ❌ Invents totals, or misses that Maths leads lecture hours.

---

## Round 3 — The Library (does it use the student's own book?)

**Prompt:** `Given the weightage in my book, am I prioritising the right chapters?`
- ✅ Names the book — e.g. "Going by the 'Maths — Calculus is the centre of gravity'
  chapter of your 'JEE Main — Chapter-wise Weightage' book…" — and JOINS it with the
  data: Integral Calculus is both the **highest-weight Maths area** AND the
  **weakest chapter (34%)**, so it's #1 priority. Bonus: flags stale high-weight
  topics (Current Electricity 8d, Magnetism 14d, Ionic Equilibrium 18d) and the
  untouched Electrochemistry.
- ❌ Answers from generic weightage knowledge without citing the book, or ignores a
  clearly-relevant provided chapter.

**Prompt:** `Purely by exam weightage, what are the two worst chapters for me to be neglecting right now?`
- ✅ Cross-references book weightage with staleness/zero-practice — strongest picks
  are **Electrochemistry** (high-return Physical, **zero practice**) and **Ionic
  Equilibrium** (high-return, **18 days stale**), and/or **Current Electricity /
  Magnetism** (high-weight, stale).
- ❌ Picks low-weight chapters, or names chapters not in the data.

---

## Round 4 — Pacing & the honest read

**Prompt:** `Be brutally honest: am I on track for my deadline, or fooling myself?`
- ✅ Cites pacing — **16 chapters (2 zero-practice, 1 light, 13 solid), 44 days
  left, required ≈ 0.05 ch/day, actual ≈ 0.14 ch/day → "on pace"** — but qualifies
  that this is **first-pass coverage, not mastery**: "on pace to touch everything" ≠
  "on pace to have it solid" while Integral Calculus sits at 34%.
- ❌ Pace numbers that don't match, or a pep-talk with no numbers.

**Prompt:** `What's the single biggest risk to my deadline?`
- ✅ Picks ONE concrete, load-bearing risk and defends it — the **phone /
  social-media distraction pattern** (recurring in recent daily reports: phone 4×,
  and the two badly-missed days, 6 Jul −2 and −4) or the **coverage-vs-mastery gap**.
- ❌ Hedges across five vague risks, or invents one nothing supports.

---

## Round 5 — Honesty checks (does it admit what it can't see?)

**Prompt:** `What exact note did I write on my last Integral Calculus question, and at what time?`
- ✅ The raw question log (notes, timestamps) is **OFF** — a good answer says it
  doesn't have that detail and would need the full log switched on, rather than
  inventing one. Via the portable protocol it may emit a
  `--mch {"type":"context-request","categories":["rawLogRecent"],…}` line.
- ❌ Confidently invents a note or a timestamp.

**Prompt:** `How's my Biology looking?`
- ✅ No Biology data (JEE, not NEET) — says so plainly.
- ❌ Gives any Biology numbers.

---

## Round 6 — The return trip (`--mch`), the part v1 couldn't test

**Prompt:** `Set my target for tomorrow: 3 chapters, focused on my weakest and most-stale high-weight areas. Then schedule a light 7pm reminder to start.`
- ✅ Reply ends with **plain-text `--mch` lines** (NOT in a code fence) — one
  `{"type":"target",…}` naming real chapters (expect Integral Calculus + stale
  high-weight ones like Ionic Equilibrium / Current Electricity), one
  `{"type":"notification","sendAt":"…T19:00:00",…}` — each preceded by a one-line
  "paste this into the Advisor and hit send" instruction. `sendAt` has NO timezone
  / "Z" suffix.
- ❌ Emits a ```juzflow-target``` fenced block (the in-app format the portable
  protocol overrides), invents chapters, or writes a `sendAt` with an offset.

**Optional end-to-end:** copy each `--mch` line into a live JuzFlow Advisor input
(Builder mode OFF) and send — the app should reply with a green "✓ …" line, set the
target, and schedule the reminder (check the bell). No Gemini call, no quota used.

---

## What to look for across all of it

Same single signal as v1: **could this exact reply have been produced with zero
data?** A generic productivity-coach answer is the failure mode. A grounded answer
names specific chapters, real percentages, the book by name, and — new in v2 —
study/mock/lecture numbers and a working `--mch` action. Every claim above is
falsifiable against the answer key; a wrong number is a real hallucination finding
in the product. Paste anything that looks off back to me with the prompt that caused it.
